Index: src/mips64/code-stubs-mips64.cc |
diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc |
index 481fb8c9159f4a034408b00aba7a5aeca1fca1ad..19ad81221d777cd2f7f3335e7fac71a955abc7a9 100644 |
--- a/src/mips64/code-stubs-mips64.cc |
+++ b/src/mips64/code-stubs-mips64.cc |
@@ -1033,22 +1033,18 @@ void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { |
void CEntryStub::Generate(MacroAssembler* masm) { |
// Called from JavaScript; parameters are on stack as if calling JS function |
- // s0: number of arguments including receiver |
- // s1: size of arguments excluding receiver |
- // s2: pointer to builtin function |
+ // a0: number of arguments including receiver |
+ // a1: pointer to builtin function |
// fp: frame pointer (restored after C call) |
// sp: stack pointer (restored as callee's sp after C call) |
// cp: current context (C callee-saved) |
ProfileEntryHookStub::MaybeCallEntryHook(masm); |
- // NOTE: s0-s2 hold the arguments of this function instead of a0-a2. |
- // The reason for this is that these arguments would need to be saved anyway |
- // so it's faster to set them up directly. |
- // See MacroAssembler::PrepareCEntryArgs and PrepareCEntryFunction. |
- |
// Compute the argv pointer in a callee-saved register. |
+ __ dsll(s1, a0, kPointerSizeLog2); |
__ Daddu(s1, sp, s1); |
+ __ Dsubu(s1, s1, kPointerSize); |
// Enter the exit frame that transitions from JavaScript to C++. |
FrameScope scope(masm, StackFrame::MANUAL); |
@@ -1060,7 +1056,8 @@ void CEntryStub::Generate(MacroAssembler* masm) { |
// Prepare arguments for C routine. |
// a0 = argc |
- __ mov(a0, s0); |
+ __ mov(s0, a0); |
+ __ mov(s2, a1); |
// a1 = argv (set in the delay slot after find_ra below). |
// We are calling compiled C/C++ code. a0 and a1 hold our two arguments. We |
@@ -1383,8 +1380,6 @@ void LoadIndexedStringStub::Generate(MacroAssembler* masm) { |
void InstanceofStub::Generate(MacroAssembler* masm) { |
// Call site inlining and patching implies arguments in registers. |
DCHECK(HasArgsInRegisters() || !HasCallSiteInlineCheck()); |
- // ReturnTrueFalse is only implemented for inlined call sites. |
- DCHECK(!ReturnTrueFalseObject() || HasCallSiteInlineCheck()); |
// Fixed register usage throughout the stub: |
const Register object = a0; // Object (lhs). |
@@ -1409,7 +1404,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
// If there is a call site cache don't look in the global cache, but do the |
// real lookup and update the call site cache. |
- if (!HasCallSiteInlineCheck()) { |
+ if (!HasCallSiteInlineCheck() && !ReturnTrueFalseObject()) { |
Label miss; |
__ LoadRoot(at, Heap::kInstanceofCacheFunctionRootIndex); |
__ Branch(&miss, ne, function, Operand(at)); |
@@ -1468,6 +1463,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
if (!HasCallSiteInlineCheck()) { |
__ mov(v0, zero_reg); |
__ StoreRoot(v0, Heap::kInstanceofCacheAnswerRootIndex); |
+ if (ReturnTrueFalseObject()) { |
+ __ LoadRoot(v0, Heap::kTrueValueRootIndex); |
+ } |
} else { |
// Patch the call site to return true. |
__ LoadRoot(v0, Heap::kTrueValueRootIndex); |
@@ -1486,6 +1484,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
if (!HasCallSiteInlineCheck()) { |
__ li(v0, Operand(Smi::FromInt(1))); |
__ StoreRoot(v0, Heap::kInstanceofCacheAnswerRootIndex); |
+ if (ReturnTrueFalseObject()) { |
+ __ LoadRoot(v0, Heap::kFalseValueRootIndex); |
+ } |
} else { |
// Patch the call site to return false. |
__ LoadRoot(v0, Heap::kFalseValueRootIndex); |
@@ -1511,19 +1512,31 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
// Null is not instance of anything. |
__ Branch(&object_not_null, ne, object, |
Operand(isolate()->factory()->null_value())); |
- __ li(v0, Operand(Smi::FromInt(1))); |
+ if (ReturnTrueFalseObject()) { |
+ __ LoadRoot(v0, Heap::kFalseValueRootIndex); |
+ } else { |
+ __ li(v0, Operand(Smi::FromInt(1))); |
+ } |
__ DropAndRet(HasArgsInRegisters() ? 0 : 2); |
__ bind(&object_not_null); |
// Smi values are not instances of anything. |
__ JumpIfNotSmi(object, &object_not_null_or_smi); |
- __ li(v0, Operand(Smi::FromInt(1))); |
+ if (ReturnTrueFalseObject()) { |
+ __ LoadRoot(v0, Heap::kFalseValueRootIndex); |
+ } else { |
+ __ li(v0, Operand(Smi::FromInt(1))); |
+ } |
__ DropAndRet(HasArgsInRegisters() ? 0 : 2); |
__ bind(&object_not_null_or_smi); |
// String values are not instances of anything. |
__ IsObjectJSStringType(object, scratch, &slow); |
- __ li(v0, Operand(Smi::FromInt(1))); |
+ if (ReturnTrueFalseObject()) { |
+ __ LoadRoot(v0, Heap::kFalseValueRootIndex); |
+ } else { |
+ __ li(v0, Operand(Smi::FromInt(1))); |
+ } |
__ DropAndRet(HasArgsInRegisters() ? 0 : 2); |
// Slow-case. Tail call builtin. |