diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index 71f7c54e710..cb8fdaf9099 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -474,6 +474,21 @@ mjit::Compiler::generateMethod() jsop_binary(op, stubs::Mod); END_CASE(JSOP_MOD) + BEGIN_CASE(JSOP_NEG) + { + FrameEntry *top = frame.peek(-1); + if (top->isConstant() && top->getValue().isPrimitive()) { + double d; + ValueToNumber(cx, top->getValue(), &d); + d = -d; + frame.pop(); + frame.push(DoubleTag(d)); + } else { + jsop_neg(); + } + } + END_CASE(JSOP_NEG) + BEGIN_CASE(JSOP_VOID) frame.pop(); frame.push(UndefinedTag()); diff --git a/js/src/methodjit/Compiler.h b/js/src/methodjit/Compiler.h index 8844636a40c..94c6f3093cc 100644 --- a/js/src/methodjit/Compiler.h +++ b/js/src/methodjit/Compiler.h @@ -139,6 +139,7 @@ class Compiler void jsop_bitop(JSOp op); void jsop_globalinc(JSOp op, uint32 index); void jsop_relational(JSOp op, BoolStub stub, jsbytecode *target, JSOp fused); + void jsop_neg(); #define STUB_CALL_TYPE(type) \ Call stubCall(type stub, Uses uses, Defs defs) { \ diff --git a/js/src/methodjit/StubCalls.cpp b/js/src/methodjit/StubCalls.cpp index 729ed7c0f07..9c336053281 100644 --- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -1621,3 +1621,13 @@ stubs::This(VMFrame &f) f.regs.sp[0] = f.fp->thisv; } +void JS_FASTCALL +stubs::Neg(VMFrame &f) +{ + double d; + if (!ValueToNumber(f.cx, f.regs.sp[-1], &d)) + THROW(); + d = -d; + f.regs.sp[-1].setNumber(d); +} + diff --git a/js/src/methodjit/StubCalls.h b/js/src/methodjit/StubCalls.h index 1fdad8003e1..4258e2b07ab 100644 --- a/js/src/methodjit/StubCalls.h +++ b/js/src/methodjit/StubCalls.h @@ -81,6 +81,7 @@ void JS_FASTCALL Sub(VMFrame &f); void JS_FASTCALL Mul(VMFrame &f); void JS_FASTCALL Div(VMFrame &f); void JS_FASTCALL Mod(VMFrame &f); +void JS_FASTCALL Neg(VMFrame &f); JSBool JS_FASTCALL ValueToBoolean(VMFrame &f); diff --git a/js/src/methodjit/nunbox/FastOps.cpp b/js/src/methodjit/nunbox/FastOps.cpp index ef310ee45ad..f65a29b7fce 100644 --- a/js/src/methodjit/nunbox/FastOps.cpp +++ b/js/src/methodjit/nunbox/FastOps.cpp @@ -484,3 +484,12 @@ mjit::Compiler::jsop_relational(JSOp op, BoolStub stub, jsbytecode *target, JSOp } } +void +mjit::Compiler::jsop_neg() +{ + prepareStubCall(); + stubCall(stubs::Neg, Uses(1), Defs(1)); + frame.pop(); + frame.pushSynced(); +} +