| 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 4450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4461 } | 4461 } |
| 4462 | 4462 |
| 4463 __ bind(&rest_parameters); | 4463 __ bind(&rest_parameters); |
| 4464 { | 4464 { |
| 4465 // Compute the pointer to the first rest parameter (skippping the receiver). | 4465 // Compute the pointer to the first rest parameter (skippping the receiver). |
| 4466 __ leap(rbx, Operand(rbx, rax, times_pointer_size, | 4466 __ leap(rbx, Operand(rbx, rax, times_pointer_size, |
| 4467 StandardFrameConstants::kCallerSPOffset - | 4467 StandardFrameConstants::kCallerSPOffset - |
| 4468 1 * kPointerSize)); | 4468 1 * kPointerSize)); |
| 4469 | 4469 |
| 4470 // ----------- S t a t e ------------- | 4470 // ----------- S t a t e ------------- |
| 4471 // -- rdi : function |
| 4471 // -- rsi : context | 4472 // -- rsi : context |
| 4472 // -- rax : number of rest parameters | 4473 // -- rax : number of rest parameters |
| 4473 // -- rbx : pointer to first rest parameters | 4474 // -- rbx : pointer to first rest parameters |
| 4474 // -- rsp[0] : return address | 4475 // -- rsp[0] : return address |
| 4475 // ----------------------------------- | 4476 // ----------------------------------- |
| 4476 | 4477 |
| 4477 // Allocate space for the rest parameter array plus the backing store. | 4478 // Allocate space for the rest parameter array plus the backing store. |
| 4478 Label allocate, done_allocate; | 4479 Label allocate, done_allocate; |
| 4479 __ leal(rcx, Operand(rax, times_pointer_size, | 4480 __ leal(rcx, Operand(rax, times_pointer_size, |
| 4480 JSArray::kSize + FixedArray::kHeaderSize)); | 4481 JSArray::kSize + FixedArray::kHeaderSize)); |
| 4481 __ Allocate(rcx, rdx, rdi, no_reg, &allocate, NO_ALLOCATION_FLAGS); | 4482 __ Allocate(rcx, rdx, r8, no_reg, &allocate, NO_ALLOCATION_FLAGS); |
| 4482 __ bind(&done_allocate); | 4483 __ bind(&done_allocate); |
| 4483 | 4484 |
| 4484 // Compute the arguments.length in rdi. | 4485 // Compute the arguments.length in rdi. |
| 4485 __ Integer32ToSmi(rdi, rax); | 4486 __ Integer32ToSmi(rdi, rax); |
| 4486 | 4487 |
| 4487 // Setup the elements array in rdx. | 4488 // Setup the elements array in rdx. |
| 4488 __ LoadRoot(rcx, Heap::kFixedArrayMapRootIndex); | 4489 __ LoadRoot(rcx, Heap::kFixedArrayMapRootIndex); |
| 4489 __ movp(FieldOperand(rdx, FixedArray::kMapOffset), rcx); | 4490 __ movp(FieldOperand(rdx, FixedArray::kMapOffset), rcx); |
| 4490 __ movp(FieldOperand(rdx, FixedArray::kLengthOffset), rdi); | 4491 __ movp(FieldOperand(rdx, FixedArray::kLengthOffset), rdi); |
| 4491 { | 4492 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4509 Operand(rdx, rax, times_pointer_size, FixedArray::kHeaderSize)); | 4510 Operand(rdx, rax, times_pointer_size, FixedArray::kHeaderSize)); |
| 4510 __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, rcx); | 4511 __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, rcx); |
| 4511 __ movp(FieldOperand(rax, JSArray::kMapOffset), rcx); | 4512 __ movp(FieldOperand(rax, JSArray::kMapOffset), rcx); |
| 4512 __ LoadRoot(rcx, Heap::kEmptyFixedArrayRootIndex); | 4513 __ LoadRoot(rcx, Heap::kEmptyFixedArrayRootIndex); |
| 4513 __ movp(FieldOperand(rax, JSArray::kPropertiesOffset), rcx); | 4514 __ movp(FieldOperand(rax, JSArray::kPropertiesOffset), rcx); |
| 4514 __ movp(FieldOperand(rax, JSArray::kElementsOffset), rdx); | 4515 __ movp(FieldOperand(rax, JSArray::kElementsOffset), rdx); |
| 4515 __ movp(FieldOperand(rax, JSArray::kLengthOffset), rdi); | 4516 __ movp(FieldOperand(rax, JSArray::kLengthOffset), rdi); |
| 4516 STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize); | 4517 STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize); |
| 4517 __ Ret(); | 4518 __ Ret(); |
| 4518 | 4519 |
| 4519 // Fall back to %AllocateInNewSpace. | 4520 // Fall back to %AllocateInNewSpace (if not too big). |
| 4521 Label too_big_for_new_space; |
| 4520 __ bind(&allocate); | 4522 __ bind(&allocate); |
| 4523 __ cmpl(rcx, Immediate(Page::kMaxRegularHeapObjectSize)); |
| 4524 __ j(greater, &too_big_for_new_space); |
| 4521 { | 4525 { |
| 4522 FrameScope scope(masm, StackFrame::INTERNAL); | 4526 FrameScope scope(masm, StackFrame::INTERNAL); |
| 4523 __ Integer32ToSmi(rax, rax); | 4527 __ Integer32ToSmi(rax, rax); |
| 4524 __ Integer32ToSmi(rcx, rcx); | 4528 __ Integer32ToSmi(rcx, rcx); |
| 4525 __ Push(rax); | 4529 __ Push(rax); |
| 4526 __ Push(rbx); | 4530 __ Push(rbx); |
| 4527 __ Push(rcx); | 4531 __ Push(rcx); |
| 4528 __ CallRuntime(Runtime::kAllocateInNewSpace); | 4532 __ CallRuntime(Runtime::kAllocateInNewSpace); |
| 4529 __ movp(rdx, rax); | 4533 __ movp(rdx, rax); |
| 4530 __ Pop(rbx); | 4534 __ Pop(rbx); |
| 4531 __ Pop(rax); | 4535 __ Pop(rax); |
| 4532 __ SmiToInteger32(rax, rax); | 4536 __ SmiToInteger32(rax, rax); |
| 4533 } | 4537 } |
| 4534 __ jmp(&done_allocate); | 4538 __ jmp(&done_allocate); |
| 4539 |
| 4540 // Fall back to %NewRestParameter. |
| 4541 __ bind(&too_big_for_new_space); |
| 4542 __ PopReturnAddressTo(kScratchRegister); |
| 4543 __ Push(rdi); |
| 4544 __ PushReturnAddressFrom(kScratchRegister); |
| 4545 __ TailCallRuntime(Runtime::kNewRestParameter); |
| 4535 } | 4546 } |
| 4536 } | 4547 } |
| 4537 | 4548 |
| 4538 | 4549 |
| 4539 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { | 4550 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { |
| 4540 // ----------- S t a t e ------------- | 4551 // ----------- S t a t e ------------- |
| 4541 // -- rdi : function | 4552 // -- rdi : function |
| 4542 // -- rsi : context | 4553 // -- rsi : context |
| 4543 // -- rbp : frame pointer | 4554 // -- rbp : frame pointer |
| 4544 // -- rsp[0] : return address | 4555 // -- rsp[0] : return address |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4815 rax, Operand(rbx, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 4826 rax, Operand(rbx, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 4816 __ leap(rbx, Operand(rbx, rax, times_pointer_size, | 4827 __ leap(rbx, Operand(rbx, rax, times_pointer_size, |
| 4817 StandardFrameConstants::kCallerSPOffset - | 4828 StandardFrameConstants::kCallerSPOffset - |
| 4818 1 * kPointerSize)); | 4829 1 * kPointerSize)); |
| 4819 } | 4830 } |
| 4820 __ bind(&arguments_done); | 4831 __ bind(&arguments_done); |
| 4821 | 4832 |
| 4822 // ----------- S t a t e ------------- | 4833 // ----------- S t a t e ------------- |
| 4823 // -- rax : number of arguments | 4834 // -- rax : number of arguments |
| 4824 // -- rbx : pointer to the first argument | 4835 // -- rbx : pointer to the first argument |
| 4836 // -- rdi : function |
| 4825 // -- rsi : context | 4837 // -- rsi : context |
| 4826 // -- rsp[0] : return address | 4838 // -- rsp[0] : return address |
| 4827 // ----------------------------------- | 4839 // ----------------------------------- |
| 4828 | 4840 |
| 4829 // Allocate space for the strict arguments object plus the backing store. | 4841 // Allocate space for the strict arguments object plus the backing store. |
| 4830 Label allocate, done_allocate; | 4842 Label allocate, done_allocate; |
| 4831 __ leal(rcx, Operand(rax, times_pointer_size, JSStrictArgumentsObject::kSize + | 4843 __ leal(rcx, Operand(rax, times_pointer_size, JSStrictArgumentsObject::kSize + |
| 4832 FixedArray::kHeaderSize)); | 4844 FixedArray::kHeaderSize)); |
| 4833 __ Allocate(rcx, rdx, rdi, no_reg, &allocate, NO_ALLOCATION_FLAGS); | 4845 __ Allocate(rcx, rdx, r8, no_reg, &allocate, NO_ALLOCATION_FLAGS); |
| 4834 __ bind(&done_allocate); | 4846 __ bind(&done_allocate); |
| 4835 | 4847 |
| 4836 // Compute the arguments.length in rdi. | 4848 // Compute the arguments.length in rdi. |
| 4837 __ Integer32ToSmi(rdi, rax); | 4849 __ Integer32ToSmi(rdi, rax); |
| 4838 | 4850 |
| 4839 // Setup the elements array in rdx. | 4851 // Setup the elements array in rdx. |
| 4840 __ LoadRoot(rcx, Heap::kFixedArrayMapRootIndex); | 4852 __ LoadRoot(rcx, Heap::kFixedArrayMapRootIndex); |
| 4841 __ movp(FieldOperand(rdx, FixedArray::kMapOffset), rcx); | 4853 __ movp(FieldOperand(rdx, FixedArray::kMapOffset), rcx); |
| 4842 __ movp(FieldOperand(rdx, FixedArray::kLengthOffset), rdi); | 4854 __ movp(FieldOperand(rdx, FixedArray::kLengthOffset), rdi); |
| 4843 { | 4855 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4861 Operand(rdx, rax, times_pointer_size, FixedArray::kHeaderSize)); | 4873 Operand(rdx, rax, times_pointer_size, FixedArray::kHeaderSize)); |
| 4862 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, rcx); | 4874 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, rcx); |
| 4863 __ movp(FieldOperand(rax, JSStrictArgumentsObject::kMapOffset), rcx); | 4875 __ movp(FieldOperand(rax, JSStrictArgumentsObject::kMapOffset), rcx); |
| 4864 __ LoadRoot(rcx, Heap::kEmptyFixedArrayRootIndex); | 4876 __ LoadRoot(rcx, Heap::kEmptyFixedArrayRootIndex); |
| 4865 __ movp(FieldOperand(rax, JSStrictArgumentsObject::kPropertiesOffset), rcx); | 4877 __ movp(FieldOperand(rax, JSStrictArgumentsObject::kPropertiesOffset), rcx); |
| 4866 __ movp(FieldOperand(rax, JSStrictArgumentsObject::kElementsOffset), rdx); | 4878 __ movp(FieldOperand(rax, JSStrictArgumentsObject::kElementsOffset), rdx); |
| 4867 __ movp(FieldOperand(rax, JSStrictArgumentsObject::kLengthOffset), rdi); | 4879 __ movp(FieldOperand(rax, JSStrictArgumentsObject::kLengthOffset), rdi); |
| 4868 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize); | 4880 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize); |
| 4869 __ Ret(); | 4881 __ Ret(); |
| 4870 | 4882 |
| 4871 // Fall back to %AllocateInNewSpace. | 4883 // Fall back to %AllocateInNewSpace (if not too big). |
| 4884 Label too_big_for_new_space; |
| 4872 __ bind(&allocate); | 4885 __ bind(&allocate); |
| 4886 __ cmpl(rcx, Immediate(Page::kMaxRegularHeapObjectSize)); |
| 4887 __ j(greater, &too_big_for_new_space); |
| 4873 { | 4888 { |
| 4874 FrameScope scope(masm, StackFrame::INTERNAL); | 4889 FrameScope scope(masm, StackFrame::INTERNAL); |
| 4875 __ Integer32ToSmi(rax, rax); | 4890 __ Integer32ToSmi(rax, rax); |
| 4876 __ Integer32ToSmi(rcx, rcx); | 4891 __ Integer32ToSmi(rcx, rcx); |
| 4877 __ Push(rax); | 4892 __ Push(rax); |
| 4878 __ Push(rbx); | 4893 __ Push(rbx); |
| 4879 __ Push(rcx); | 4894 __ Push(rcx); |
| 4880 __ CallRuntime(Runtime::kAllocateInNewSpace); | 4895 __ CallRuntime(Runtime::kAllocateInNewSpace); |
| 4881 __ movp(rdx, rax); | 4896 __ movp(rdx, rax); |
| 4882 __ Pop(rbx); | 4897 __ Pop(rbx); |
| 4883 __ Pop(rax); | 4898 __ Pop(rax); |
| 4884 __ SmiToInteger32(rax, rax); | 4899 __ SmiToInteger32(rax, rax); |
| 4885 } | 4900 } |
| 4886 __ jmp(&done_allocate); | 4901 __ jmp(&done_allocate); |
| 4902 |
| 4903 // Fall back to %NewStrictArguments. |
| 4904 __ bind(&too_big_for_new_space); |
| 4905 __ PopReturnAddressTo(kScratchRegister); |
| 4906 __ Push(rdi); |
| 4907 __ PushReturnAddressFrom(kScratchRegister); |
| 4908 __ TailCallRuntime(Runtime::kNewStrictArguments); |
| 4887 } | 4909 } |
| 4888 | 4910 |
| 4889 | 4911 |
| 4890 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) { | 4912 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) { |
| 4891 Register context_reg = rsi; | 4913 Register context_reg = rsi; |
| 4892 Register slot_reg = rbx; | 4914 Register slot_reg = rbx; |
| 4893 Register result_reg = rax; | 4915 Register result_reg = rax; |
| 4894 Label slow_case; | 4916 Label slow_case; |
| 4895 | 4917 |
| 4896 // Go up context chain to the script context. | 4918 // Go up context chain to the script context. |
| (...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5425 kStackUnwindSpace, nullptr, return_value_operand, | 5447 kStackUnwindSpace, nullptr, return_value_operand, |
| 5426 NULL); | 5448 NULL); |
| 5427 } | 5449 } |
| 5428 | 5450 |
| 5429 #undef __ | 5451 #undef __ |
| 5430 | 5452 |
| 5431 } // namespace internal | 5453 } // namespace internal |
| 5432 } // namespace v8 | 5454 } // namespace v8 |
| 5433 | 5455 |
| 5434 #endif // V8_TARGET_ARCH_X64 | 5456 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |