[INFER] Merge JSOP_RSH with jsop_bitop, bug 643109. r=bhackett

This commit is contained in:
Jan de Mooij 2011-03-24 12:37:57 -07:00
parent 9849da7614
commit 302719e425
4 changed files with 14 additions and 122 deletions

View File

@ -1428,7 +1428,7 @@ mjit::Compiler::generateMethod()
END_CASE(JSOP_LSH)
BEGIN_CASE(JSOP_RSH)
jsop_rsh();
jsop_bitop(op);
END_CASE(JSOP_RSH)
BEGIN_CASE(JSOP_URSH)

View File

@ -571,16 +571,6 @@ class Compiler : public BaseCompiler
/* Fast opcodes. */
void jsop_bitop(JSOp op);
void jsop_rsh();
RegisterID rightRegForShift(FrameEntry *rhs);
void jsop_rsh_int_int(FrameEntry *lhs, FrameEntry *rhs);
void jsop_rsh_const_int(FrameEntry *lhs, FrameEntry *rhs);
void jsop_rsh_int_const(FrameEntry *lhs, FrameEntry *rhs);
void jsop_rsh_int_unknown(FrameEntry *lhs, FrameEntry *rhs);
void jsop_rsh_const_const(FrameEntry *lhs, FrameEntry *rhs);
void jsop_rsh_const_unknown(FrameEntry *lhs, FrameEntry *rhs);
void jsop_rsh_unknown_const(FrameEntry *lhs, FrameEntry *rhs);
void jsop_rsh_unknown_any(FrameEntry *lhs, FrameEntry *rhs);
bool jsop_mod();
void jsop_neg();
void jsop_bitnot();

View File

@ -81,10 +81,6 @@ mjit::Compiler::tryBinaryConstantFold(JSContext *cx, FrameState &frame, JSOp op,
L.toInt32() >= 0 && R.toInt32() > 0);
break;
case JSOP_RSH:
needInt = true;
break;
default:
JS_NOT_REACHED("NYI");
needInt = false; /* Silence compiler warning. */
@ -141,10 +137,6 @@ mjit::Compiler::tryBinaryConstantFold(JSContext *cx, FrameState &frame, JSOp op,
dL = js_fmod(dL, dR);
break;
case JSOP_RSH:
nL >>= (nR & 31);
break;
default:
JS_NOT_REACHED("NYI");
break;

View File

@ -58,66 +58,6 @@ using namespace js::mjit;
typedef JSC::MacroAssembler::RegisterID RegisterID;
RegisterID
mjit::Compiler::rightRegForShift(FrameEntry *rhs)
{
#if defined(JS_CPU_X86) || defined(JS_CPU_X64)
/*
* Gross: RHS _must_ be in ECX, on x86.
* Note that we take this first so that we can't up with other register
* allocations (below) owning ecx before rhs.
*/
RegisterID reg = JSC::X86Registers::ecx;
if (!rhs->isConstant())
frame.copyDataIntoReg(rhs, reg);
return reg;
#else
if (rhs->isConstant())
return frame.allocReg();
return frame.copyDataIntoReg(rhs);
#endif
}
void
mjit::Compiler::jsop_rsh_const_int(FrameEntry *lhs, FrameEntry *rhs)
{
RegisterID rhsData = rightRegForShift(rhs);
RegisterID result = frame.allocReg();
masm.move(Imm32(lhs->getValue().toInt32()), result);
masm.rshift32(rhsData, result);
frame.freeReg(rhsData);
frame.popn(2);
frame.pushTypedPayload(JSVAL_TYPE_INT32, result);
}
void
mjit::Compiler::jsop_rsh_int_int(FrameEntry *lhs, FrameEntry *rhs)
{
RegisterID rhsData = rightRegForShift(rhs);
RegisterID lhsData = frame.copyDataIntoReg(lhs);
masm.rshift32(rhsData, lhsData);
frame.freeReg(rhsData);
frame.popn(2);
frame.pushTypedPayload(JSVAL_TYPE_INT32, lhsData);
}
void
mjit::Compiler::jsop_rsh_int_const(FrameEntry *lhs, FrameEntry *rhs)
{
int32 shiftAmount = rhs->getValue().toInt32();
if (!shiftAmount) {
frame.pop();
return;
}
RegisterID result = frame.copyDataIntoReg(lhs);
masm.rshift32(Imm32(shiftAmount), result);
frame.popn(2);
frame.pushTypedPayload(JSVAL_TYPE_INT32, result);
}
void
mjit::Compiler::ensureInteger(FrameEntry *fe, Uses uses)
{
@ -179,47 +119,6 @@ mjit::Compiler::ensureInteger(FrameEntry *fe, Uses uses)
}
}
void
mjit::Compiler::jsop_rsh()
{
FrameEntry *rhs = frame.peek(-1);
FrameEntry *lhs = frame.peek(-2);
Value v;
if (tryBinaryConstantFold(cx, frame, JSOP_RSH, lhs, rhs, &v)) {
JS_ASSERT(v.isInt32());
frame.popn(2);
frame.push(v);
return;
}
if ((lhs->isNotType(JSVAL_TYPE_INT32) && lhs->isNotType(JSVAL_TYPE_DOUBLE)) ||
(rhs->isNotType(JSVAL_TYPE_INT32) && rhs->isNotType(JSVAL_TYPE_DOUBLE))) {
prepareStubCall(Uses(2));
INLINE_STUBCALL(stubs::Rsh);
frame.popn(2);
frame.pushSynced(JSVAL_TYPE_INT32);
return;
}
ensureInteger(lhs, Uses(2));
ensureInteger(rhs, Uses(2));
stubcc.leave();
OOL_STUBCALL(stubs::Rsh);
JS_ASSERT(!(lhs->isConstant() && rhs->isConstant()));
if (lhs->isConstant()) {
jsop_rsh_const_int(lhs, rhs);
} else if (rhs->isConstant()) {
jsop_rsh_int_const(lhs, rhs);
} else {
jsop_rsh_int_int(lhs, rhs);
}
stubcc.rejoin(Changes(1));
}
void
mjit::Compiler::jsop_bitnot()
{
@ -277,6 +176,9 @@ mjit::Compiler::jsop_bitop(JSOp op)
case JSOP_LSH:
stub = stubs::Lsh;
break;
case JSOP_RSH:
stub = stubs::Rsh;
break;
case JSOP_URSH:
stub = stubs::Ursh;
break;
@ -339,9 +241,12 @@ mjit::Compiler::jsop_bitop(JSOp op)
frame.push(Int32Value(L & R));
return;
case JSOP_LSH:
frame.push(Int32Value(L << R));
frame.push(Int32Value(L << (R & 31)));
return;
case JSOP_URSH:
case JSOP_RSH:
frame.push(Int32Value(L >> (R & 31)));
return;
case JSOP_URSH:
{
uint32 unsignedL;
if (ValueToECMAUint32(cx, lhs->getValue(), (uint32_t*)&unsignedL)) {
@ -401,6 +306,7 @@ mjit::Compiler::jsop_bitop(JSOp op)
}
case JSOP_LSH:
case JSOP_RSH:
case JSOP_URSH:
{
/* Not commutative. */
@ -414,6 +320,8 @@ mjit::Compiler::jsop_bitop(JSOp op)
if (shift) {
if (op == JSOP_LSH)
masm.lshift32(Imm32(shift), reg);
else if (op == JSOP_RSH)
masm.rshift32(Imm32(shift), reg);
else
masm.urshift32(Imm32(shift), reg);
}
@ -453,6 +361,8 @@ mjit::Compiler::jsop_bitop(JSOp op)
if (op == JSOP_LSH) {
masm.lshift32(rr, reg);
} else if (op == JSOP_RSH) {
masm.rshift32(rr, reg);
} else {
masm.urshift32(rr, reg);