| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_X64 | 5 #if V8_TARGET_ARCH_X64 |
| 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 4520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4531 | 4531 |
| 4532 void FastNewRestParameterStub::Generate(MacroAssembler* masm) { | 4532 void FastNewRestParameterStub::Generate(MacroAssembler* masm) { |
| 4533 // ----------- S t a t e ------------- | 4533 // ----------- S t a t e ------------- |
| 4534 // -- rdi : function | 4534 // -- rdi : function |
| 4535 // -- rsi : context | 4535 // -- rsi : context |
| 4536 // -- rbp : frame pointer | 4536 // -- rbp : frame pointer |
| 4537 // -- rsp[0] : return address | 4537 // -- rsp[0] : return address |
| 4538 // ----------------------------------- | 4538 // ----------------------------------- |
| 4539 __ AssertFunction(rdi); | 4539 __ AssertFunction(rdi); |
| 4540 | 4540 |
| 4541 // For Ignition we need to skip all possible handler/stub frames until | 4541 // Make rdx point to the JavaScript frame. |
| 4542 // we reach the JavaScript frame for the function (similar to what the | 4542 __ movp(rdx, rbp); |
| 4543 // runtime fallback implementation does). So make rdx point to that | 4543 if (skip_stub_frame()) { |
| 4544 // JavaScript frame. | 4544 // For Ignition we need to skip the handler/stub frame to reach the |
| 4545 { | 4545 // JavaScript frame for the function. |
| 4546 Label loop, loop_entry; | |
| 4547 __ movp(rdx, rbp); | |
| 4548 __ jmp(&loop_entry, Label::kNear); | |
| 4549 __ bind(&loop); | |
| 4550 __ movp(rdx, Operand(rdx, StandardFrameConstants::kCallerFPOffset)); | 4546 __ movp(rdx, Operand(rdx, StandardFrameConstants::kCallerFPOffset)); |
| 4551 __ bind(&loop_entry); | 4547 } |
| 4548 if (FLAG_debug_code) { |
| 4549 Label ok; |
| 4552 __ cmpp(rdi, Operand(rdx, StandardFrameConstants::kFunctionOffset)); | 4550 __ cmpp(rdi, Operand(rdx, StandardFrameConstants::kFunctionOffset)); |
| 4553 __ j(not_equal, &loop); | 4551 __ j(equal, &ok); |
| 4552 __ Abort(kInvalidFrameForFastNewRestArgumentsStub); |
| 4553 __ bind(&ok); |
| 4554 } | 4554 } |
| 4555 | 4555 |
| 4556 // Check if we have rest parameters (only possible if we have an | 4556 // Check if we have rest parameters (only possible if we have an |
| 4557 // arguments adaptor frame below the function frame). | 4557 // arguments adaptor frame below the function frame). |
| 4558 Label no_rest_parameters; | 4558 Label no_rest_parameters; |
| 4559 __ movp(rbx, Operand(rdx, StandardFrameConstants::kCallerFPOffset)); | 4559 __ movp(rbx, Operand(rdx, StandardFrameConstants::kCallerFPOffset)); |
| 4560 __ Cmp(Operand(rbx, CommonFrameConstants::kContextOrFrameTypeOffset), | 4560 __ Cmp(Operand(rbx, CommonFrameConstants::kContextOrFrameTypeOffset), |
| 4561 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); | 4561 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); |
| 4562 __ j(not_equal, &no_rest_parameters, Label::kNear); | 4562 __ j(not_equal, &no_rest_parameters, Label::kNear); |
| 4563 | 4563 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4683 | 4683 |
| 4684 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { | 4684 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { |
| 4685 // ----------- S t a t e ------------- | 4685 // ----------- S t a t e ------------- |
| 4686 // -- rdi : function | 4686 // -- rdi : function |
| 4687 // -- rsi : context | 4687 // -- rsi : context |
| 4688 // -- rbp : frame pointer | 4688 // -- rbp : frame pointer |
| 4689 // -- rsp[0] : return address | 4689 // -- rsp[0] : return address |
| 4690 // ----------------------------------- | 4690 // ----------------------------------- |
| 4691 __ AssertFunction(rdi); | 4691 __ AssertFunction(rdi); |
| 4692 | 4692 |
| 4693 // For Ignition we need to skip all possible handler/stub frames until | 4693 // Make r9 point to the JavaScript frame. |
| 4694 // we reach the JavaScript frame for the function (similar to what the | 4694 __ movp(r9, rbp); |
| 4695 // runtime fallback implementation does). So make r9 point to that | 4695 if (skip_stub_frame()) { |
| 4696 // JavaScript frame. | 4696 // For Ignition we need to skip the handler/stub frame to reach the |
| 4697 { | 4697 // JavaScript frame for the function. |
| 4698 Label loop, loop_entry; | |
| 4699 __ movp(r9, rbp); | |
| 4700 __ jmp(&loop_entry, Label::kNear); | |
| 4701 __ bind(&loop); | |
| 4702 __ movp(r9, Operand(r9, StandardFrameConstants::kCallerFPOffset)); | 4698 __ movp(r9, Operand(r9, StandardFrameConstants::kCallerFPOffset)); |
| 4703 __ bind(&loop_entry); | 4699 } |
| 4700 if (FLAG_debug_code) { |
| 4701 Label ok; |
| 4704 __ cmpp(rdi, Operand(r9, StandardFrameConstants::kFunctionOffset)); | 4702 __ cmpp(rdi, Operand(r9, StandardFrameConstants::kFunctionOffset)); |
| 4705 __ j(not_equal, &loop); | 4703 __ j(equal, &ok); |
| 4704 __ Abort(kInvalidFrameForFastNewRestArgumentsStub); |
| 4705 __ bind(&ok); |
| 4706 } | 4706 } |
| 4707 | 4707 |
| 4708 // TODO(bmeurer): Cleanup to match the FastNewStrictArgumentsStub. | 4708 // TODO(bmeurer): Cleanup to match the FastNewStrictArgumentsStub. |
| 4709 __ movp(rcx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); | 4709 __ movp(rcx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
| 4710 __ LoadSharedFunctionInfoSpecialField( | 4710 __ LoadSharedFunctionInfoSpecialField( |
| 4711 rcx, rcx, SharedFunctionInfo::kFormalParameterCountOffset); | 4711 rcx, rcx, SharedFunctionInfo::kFormalParameterCountOffset); |
| 4712 __ leap(rdx, Operand(r9, rcx, times_pointer_size, | 4712 __ leap(rdx, Operand(r9, rcx, times_pointer_size, |
| 4713 StandardFrameConstants::kCallerSPOffset)); | 4713 StandardFrameConstants::kCallerSPOffset)); |
| 4714 __ Integer32ToSmi(rcx, rcx); | 4714 __ Integer32ToSmi(rcx, rcx); |
| 4715 | 4715 |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4917 | 4917 |
| 4918 void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) { | 4918 void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) { |
| 4919 // ----------- S t a t e ------------- | 4919 // ----------- S t a t e ------------- |
| 4920 // -- rdi : function | 4920 // -- rdi : function |
| 4921 // -- rsi : context | 4921 // -- rsi : context |
| 4922 // -- rbp : frame pointer | 4922 // -- rbp : frame pointer |
| 4923 // -- rsp[0] : return address | 4923 // -- rsp[0] : return address |
| 4924 // ----------------------------------- | 4924 // ----------------------------------- |
| 4925 __ AssertFunction(rdi); | 4925 __ AssertFunction(rdi); |
| 4926 | 4926 |
| 4927 // For Ignition we need to skip all possible handler/stub frames until | 4927 // Make rdx point to the JavaScript frame. |
| 4928 // we reach the JavaScript frame for the function (similar to what the | 4928 __ movp(rdx, rbp); |
| 4929 // runtime fallback implementation does). So make rdx point to that | 4929 if (skip_stub_frame()) { |
| 4930 // JavaScript frame. | 4930 // For Ignition we need to skip the handler/stub frame to reach the |
| 4931 { | 4931 // JavaScript frame for the function. |
| 4932 Label loop, loop_entry; | |
| 4933 __ movp(rdx, rbp); | |
| 4934 __ jmp(&loop_entry, Label::kNear); | |
| 4935 __ bind(&loop); | |
| 4936 __ movp(rdx, Operand(rdx, StandardFrameConstants::kCallerFPOffset)); | 4932 __ movp(rdx, Operand(rdx, StandardFrameConstants::kCallerFPOffset)); |
| 4937 __ bind(&loop_entry); | 4933 } |
| 4934 if (FLAG_debug_code) { |
| 4935 Label ok; |
| 4938 __ cmpp(rdi, Operand(rdx, StandardFrameConstants::kFunctionOffset)); | 4936 __ cmpp(rdi, Operand(rdx, StandardFrameConstants::kFunctionOffset)); |
| 4939 __ j(not_equal, &loop); | 4937 __ j(equal, &ok); |
| 4938 __ Abort(kInvalidFrameForFastNewRestArgumentsStub); |
| 4939 __ bind(&ok); |
| 4940 } | 4940 } |
| 4941 | 4941 |
| 4942 // Check if we have an arguments adaptor frame below the function frame. | 4942 // Check if we have an arguments adaptor frame below the function frame. |
| 4943 Label arguments_adaptor, arguments_done; | 4943 Label arguments_adaptor, arguments_done; |
| 4944 __ movp(rbx, Operand(rdx, StandardFrameConstants::kCallerFPOffset)); | 4944 __ movp(rbx, Operand(rdx, StandardFrameConstants::kCallerFPOffset)); |
| 4945 __ Cmp(Operand(rbx, CommonFrameConstants::kContextOrFrameTypeOffset), | 4945 __ Cmp(Operand(rbx, CommonFrameConstants::kContextOrFrameTypeOffset), |
| 4946 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); | 4946 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); |
| 4947 __ j(equal, &arguments_adaptor, Label::kNear); | 4947 __ j(equal, &arguments_adaptor, Label::kNear); |
| 4948 { | 4948 { |
| 4949 __ movp(rax, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); | 4949 __ movp(rax, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5570 kStackUnwindSpace, nullptr, return_value_operand, | 5570 kStackUnwindSpace, nullptr, return_value_operand, |
| 5571 NULL); | 5571 NULL); |
| 5572 } | 5572 } |
| 5573 | 5573 |
| 5574 #undef __ | 5574 #undef __ |
| 5575 | 5575 |
| 5576 } // namespace internal | 5576 } // namespace internal |
| 5577 } // namespace v8 | 5577 } // namespace v8 |
| 5578 | 5578 |
| 5579 #endif // V8_TARGET_ARCH_X64 | 5579 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |