| 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.
|
|
|