Index: src/mips64/code-stubs-mips64.cc |
diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc |
index 8a71aacb0ba0c94a57b68d10a449a4a2a1e3ee2a..a425fff45c31b342d4ed04256e0d36f461a0258a 100644 |
--- a/src/mips64/code-stubs-mips64.cc |
+++ b/src/mips64/code-stubs-mips64.cc |
@@ -715,13 +715,21 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { |
// Never falls through to here. |
__ bind(&slow); |
- // Prepare for call to builtin. Push object pointers, a0 (lhs) first, |
- // a1 (rhs) second. |
- __ Push(lhs, rhs); |
- // Figure out which native to call and setup the arguments. |
if (cc == eq) { |
- __ TailCallRuntime(strict() ? Runtime::kStrictEquals : Runtime::kEquals); |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ Push(lhs, rhs); |
+ __ CallRuntime(strict() ? Runtime::kStrictEquals : Runtime::kEquals); |
+ } |
+ // Turn true into 0 and false into some non-zero value. |
+ STATIC_ASSERT(EQUAL == 0); |
+ __ LoadRoot(a0, Heap::kTrueValueRootIndex); |
+ __ Ret(USE_DELAY_SLOT); |
+ __ subu(v0, v0, a0); // In delay slot. |
} else { |
+ // Prepare for call to builtin. Push object pointers, a0 (lhs) first, |
+ // a1 (rhs) second. |
+ __ Push(lhs, rhs); |
int ncr; // NaN compare result. |
if (cc == lt || cc == le) { |
ncr = GREATER; |