[INFER] Optimize JSOP_NEG on known integers, bug 640293. r=bhackett

This commit is contained in:
Jan de Mooij 2011-03-17 21:40:40 -07:00
parent f5cc631abf
commit b9ae9ee15b

View File

@ -805,6 +805,26 @@ mjit::Compiler::jsop_neg()
return;
}
/* Inline integer path for known integers. */
if (fe->isType(JSVAL_TYPE_INT32) && type == JSVAL_TYPE_INT32) {
RegisterID reg = frame.copyDataIntoReg(fe);
/* Test for 0 and -2147483648 (both result in a double). */
Jump zeroOrMinInt = masm.branchTest32(Assembler::Zero, reg, Imm32(0x7fffffff));
stubcc.linkExit(zeroOrMinInt, Uses(1));
masm.neg32(reg);
stubcc.leave();
OOL_STUBCALL(stubs::Neg);
frame.pop();
frame.pushTypedPayload(JSVAL_TYPE_INT32, reg);
stubcc.rejoin(Changes(1));
return;
}
/* Load type information into register. */
MaybeRegisterID feTypeReg;
if (!fe->isTypeKnown() && !frame.shouldAvoidTypeRemat(fe)) {
@ -834,17 +854,14 @@ mjit::Compiler::jsop_neg()
/* Try an integer path (out-of-line). */
MaybeJump jmpNotInt;
MaybeJump jmpIntZero;
MaybeJump jmpMinInt;
MaybeJump jmpMinIntOrIntZero;
MaybeJump jmpIntRejoin;
Label lblIntPath = stubcc.masm.label();
{
maybeJumpIfNotInt32(stubcc.masm, jmpNotInt, fe, feTypeReg);
/* 0 (int) -> -0 (double). */
jmpIntZero.setJump(stubcc.masm.branch32(Assembler::Equal, reg, Imm32(0)));
/* int32 negation on (-2147483648) yields (-2147483648). */
jmpMinInt.setJump(stubcc.masm.branch32(Assembler::Equal, reg, Imm32(1 << 31)));
/* Test for 0 and -2147483648 (both result in a double). */
jmpMinIntOrIntZero = stubcc.masm.branchTest32(Assembler::Zero, reg, Imm32(0x7fffffff));
stubcc.masm.neg32(reg);
@ -871,10 +888,8 @@ mjit::Compiler::jsop_neg()
if (jmpNotInt.isSet())
jmpNotInt.getJump().linkTo(feSyncTarget, &stubcc.masm);
if (jmpIntZero.isSet())
jmpIntZero.getJump().linkTo(feSyncTarget, &stubcc.masm);
if (jmpMinInt.isSet())
jmpMinInt.getJump().linkTo(feSyncTarget, &stubcc.masm);
if (jmpMinIntOrIntZero.isSet())
jmpMinIntOrIntZero.getJump().linkTo(feSyncTarget, &stubcc.masm);
if (jmpIntRejoin.isSet())
stubcc.crossJump(jmpIntRejoin.getJump(), masm.label());