OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if V8_TARGET_ARCH_MIPS64 | 5 #if V8_TARGET_ARCH_MIPS64 |
6 | 6 |
7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 4989 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5000 | 5000 |
5001 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { | 5001 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { |
5002 // ----------- S t a t e ------------- | 5002 // ----------- S t a t e ------------- |
5003 // -- a1 : function | 5003 // -- a1 : function |
5004 // -- cp : context | 5004 // -- cp : context |
5005 // -- fp : frame pointer | 5005 // -- fp : frame pointer |
5006 // -- ra : return address | 5006 // -- ra : return address |
5007 // ----------------------------------- | 5007 // ----------------------------------- |
5008 __ AssertFunction(a1); | 5008 __ AssertFunction(a1); |
5009 | 5009 |
| 5010 // For Ignition we need to skip all possible handler/stub frames until |
| 5011 // we reach the JavaScript frame for the function (similar to what the |
| 5012 // runtime fallback implementation does). So make t0 point to that |
| 5013 // JavaScript frame. |
| 5014 { |
| 5015 Label loop, loop_entry; |
| 5016 __ Branch(USE_DELAY_SLOT, &loop_entry); |
| 5017 __ mov(t0, fp); // In delay slot. |
| 5018 __ bind(&loop); |
| 5019 __ ld(t0, MemOperand(t0, StandardFrameConstants::kCallerFPOffset)); |
| 5020 __ bind(&loop_entry); |
| 5021 __ ld(a3, MemOperand(t0, StandardFrameConstants::kFunctionOffset)); |
| 5022 __ Branch(&loop, ne, a1, Operand(a3)); |
| 5023 } |
| 5024 |
5010 // TODO(bmeurer): Cleanup to match the FastNewStrictArgumentsStub. | 5025 // TODO(bmeurer): Cleanup to match the FastNewStrictArgumentsStub. |
5011 __ ld(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 5026 __ ld(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
5012 __ lw(a2, | 5027 __ lw(a2, |
5013 FieldMemOperand(a2, SharedFunctionInfo::kFormalParameterCountOffset)); | 5028 FieldMemOperand(a2, SharedFunctionInfo::kFormalParameterCountOffset)); |
5014 __ Lsa(a3, fp, a2, kPointerSizeLog2); | 5029 __ Lsa(a3, t0, a2, kPointerSizeLog2); |
5015 __ Addu(a3, a3, Operand(StandardFrameConstants::kCallerSPOffset)); | 5030 __ Addu(a3, a3, Operand(StandardFrameConstants::kCallerSPOffset)); |
5016 __ SmiTag(a2); | 5031 __ SmiTag(a2); |
5017 | 5032 |
5018 // a1 : function | 5033 // a1 : function |
5019 // a2 : number of parameters (tagged) | 5034 // a2 : number of parameters (tagged) |
5020 // a3 : parameters pointer | 5035 // a3 : parameters pointer |
| 5036 // t0 : Javascript frame pointer |
5021 // Registers used over whole function: | 5037 // Registers used over whole function: |
5022 // a5 : arguments count (tagged) | 5038 // a5 : arguments count (tagged) |
5023 // a6 : mapped parameter count (tagged) | 5039 // a6 : mapped parameter count (tagged) |
5024 | 5040 |
5025 // Check if the calling frame is an arguments adaptor frame. | 5041 // Check if the calling frame is an arguments adaptor frame. |
5026 Label adaptor_frame, try_allocate, runtime; | 5042 Label adaptor_frame, try_allocate, runtime; |
5027 __ ld(a4, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 5043 __ ld(a4, MemOperand(t0, StandardFrameConstants::kCallerFPOffset)); |
5028 __ ld(a0, MemOperand(a4, CommonFrameConstants::kContextOrFrameTypeOffset)); | 5044 __ ld(a0, MemOperand(a4, CommonFrameConstants::kContextOrFrameTypeOffset)); |
5029 __ Branch(&adaptor_frame, eq, a0, | 5045 __ Branch(&adaptor_frame, eq, a0, |
5030 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | 5046 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
5031 | 5047 |
5032 // No adaptor, parameter count = argument count. | 5048 // No adaptor, parameter count = argument count. |
5033 __ mov(a5, a2); | 5049 __ mov(a5, a2); |
5034 __ Branch(USE_DELAY_SLOT, &try_allocate); | 5050 __ Branch(USE_DELAY_SLOT, &try_allocate); |
5035 __ mov(a6, a2); // In delay slot. | 5051 __ mov(a6, a2); // In delay slot. |
5036 | 5052 |
5037 // We have an adaptor frame. Patch the parameters pointer. | 5053 // We have an adaptor frame. Patch the parameters pointer. |
(...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5769 kStackUnwindSpace, kInvalidStackOffset, | 5785 kStackUnwindSpace, kInvalidStackOffset, |
5770 return_value_operand, NULL); | 5786 return_value_operand, NULL); |
5771 } | 5787 } |
5772 | 5788 |
5773 #undef __ | 5789 #undef __ |
5774 | 5790 |
5775 } // namespace internal | 5791 } // namespace internal |
5776 } // namespace v8 | 5792 } // namespace v8 |
5777 | 5793 |
5778 #endif // V8_TARGET_ARCH_MIPS64 | 5794 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |