| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 |
| 8 | 8 |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 915 __ leap(r8, Operand(r8, rcx, times_pointer_size, FixedArray::kHeaderSize)); | 915 __ leap(r8, Operand(r8, rcx, times_pointer_size, FixedArray::kHeaderSize)); |
| 916 | 916 |
| 917 // 3. Arguments object. | 917 // 3. Arguments object. |
| 918 __ addp(r8, Immediate(Heap::kSloppyArgumentsObjectSize)); | 918 __ addp(r8, Immediate(Heap::kSloppyArgumentsObjectSize)); |
| 919 | 919 |
| 920 // Do the allocation of all three objects in one go. | 920 // Do the allocation of all three objects in one go. |
| 921 __ Allocate(r8, rax, rdx, rdi, &runtime, TAG_OBJECT); | 921 __ Allocate(r8, rax, rdx, rdi, &runtime, TAG_OBJECT); |
| 922 | 922 |
| 923 // rax = address of new object(s) (tagged) | 923 // rax = address of new object(s) (tagged) |
| 924 // rcx = argument count (untagged) | 924 // rcx = argument count (untagged) |
| 925 // Get the arguments boilerplate from the current native context into rdi. | 925 // Get the arguments map from the current native context into rdi. |
| 926 Label has_mapped_parameters, copy; | 926 Label has_mapped_parameters, instantiate; |
| 927 __ movp(rdi, Operand(rsi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); | 927 __ movp(rdi, Operand(rsi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); |
| 928 __ movp(rdi, FieldOperand(rdi, GlobalObject::kNativeContextOffset)); | 928 __ movp(rdi, FieldOperand(rdi, GlobalObject::kNativeContextOffset)); |
| 929 __ testp(rbx, rbx); | 929 __ testp(rbx, rbx); |
| 930 __ j(not_zero, &has_mapped_parameters, Label::kNear); | 930 __ j(not_zero, &has_mapped_parameters, Label::kNear); |
| 931 | 931 |
| 932 const int kIndex = Context::SLOPPY_ARGUMENTS_BOILERPLATE_INDEX; | 932 const int kIndex = Context::SLOPPY_ARGUMENTS_MAP_INDEX; |
| 933 __ movp(rdi, Operand(rdi, Context::SlotOffset(kIndex))); | 933 __ movp(rdi, Operand(rdi, Context::SlotOffset(kIndex))); |
| 934 __ jmp(©, Label::kNear); | 934 __ jmp(&instantiate, Label::kNear); |
| 935 | 935 |
| 936 const int kAliasedIndex = Context::ALIASED_ARGUMENTS_BOILERPLATE_INDEX; | 936 const int kAliasedIndex = Context::ALIASED_ARGUMENTS_MAP_INDEX; |
| 937 __ bind(&has_mapped_parameters); | 937 __ bind(&has_mapped_parameters); |
| 938 __ movp(rdi, Operand(rdi, Context::SlotOffset(kAliasedIndex))); | 938 __ movp(rdi, Operand(rdi, Context::SlotOffset(kAliasedIndex))); |
| 939 __ bind(©); | 939 __ bind(&instantiate); |
| 940 | 940 |
| 941 // rax = address of new object (tagged) | 941 // rax = address of new object (tagged) |
| 942 // rbx = mapped parameter count (untagged) | 942 // rbx = mapped parameter count (untagged) |
| 943 // rcx = argument count (untagged) | 943 // rcx = argument count (untagged) |
| 944 // rdi = address of boilerplate object (tagged) | 944 // rdi = address of arguments map (tagged) |
| 945 // Copy the JS object part. | 945 __ movp(FieldOperand(rax, JSObject::kMapOffset), rdi); |
| 946 for (int i = 0; i < JSObject::kHeaderSize; i += kPointerSize) { | 946 __ LoadRoot(kScratchRegister, Heap::kEmptyFixedArrayRootIndex); |
| 947 __ movp(rdx, FieldOperand(rdi, i)); | 947 __ movp(FieldOperand(rax, JSObject::kPropertiesOffset), kScratchRegister); |
| 948 __ movp(FieldOperand(rax, i), rdx); | 948 __ movp(FieldOperand(rax, JSObject::kElementsOffset), kScratchRegister); |
| 949 } | |
| 950 | 949 |
| 951 // Set up the callee in-object property. | 950 // Set up the callee in-object property. |
| 952 STATIC_ASSERT(Heap::kArgumentsCalleeIndex == 1); | 951 STATIC_ASSERT(Heap::kArgumentsCalleeIndex == 1); |
| 953 __ movp(rdx, args.GetArgumentOperand(0)); | 952 __ movp(rdx, args.GetArgumentOperand(0)); |
| 953 __ AssertNotSmi(rdx); |
| 954 __ movp(FieldOperand(rax, JSObject::kHeaderSize + | 954 __ movp(FieldOperand(rax, JSObject::kHeaderSize + |
| 955 Heap::kArgumentsCalleeIndex * kPointerSize), | 955 Heap::kArgumentsCalleeIndex * kPointerSize), |
| 956 rdx); | 956 rdx); |
| 957 | 957 |
| 958 // Use the length (smi tagged) and set that as an in-object property too. | 958 // Use the length (smi tagged) and set that as an in-object property too. |
| 959 // Note: rcx is tagged from here on. | 959 // Note: rcx is tagged from here on. |
| 960 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0); | 960 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0); |
| 961 __ Integer32ToSmi(rcx, rcx); | 961 __ Integer32ToSmi(rcx, rcx); |
| 962 __ movp(FieldOperand(rax, JSObject::kHeaderSize + | 962 __ movp(FieldOperand(rax, JSObject::kHeaderSize + |
| 963 Heap::kArgumentsLengthIndex * kPointerSize), | 963 Heap::kArgumentsLengthIndex * kPointerSize), |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1133 __ bind(&try_allocate); | 1133 __ bind(&try_allocate); |
| 1134 __ testp(rcx, rcx); | 1134 __ testp(rcx, rcx); |
| 1135 __ j(zero, &add_arguments_object, Label::kNear); | 1135 __ j(zero, &add_arguments_object, Label::kNear); |
| 1136 __ leap(rcx, Operand(rcx, times_pointer_size, FixedArray::kHeaderSize)); | 1136 __ leap(rcx, Operand(rcx, times_pointer_size, FixedArray::kHeaderSize)); |
| 1137 __ bind(&add_arguments_object); | 1137 __ bind(&add_arguments_object); |
| 1138 __ addp(rcx, Immediate(Heap::kStrictArgumentsObjectSize)); | 1138 __ addp(rcx, Immediate(Heap::kStrictArgumentsObjectSize)); |
| 1139 | 1139 |
| 1140 // Do the allocation of both objects in one go. | 1140 // Do the allocation of both objects in one go. |
| 1141 __ Allocate(rcx, rax, rdx, rbx, &runtime, TAG_OBJECT); | 1141 __ Allocate(rcx, rax, rdx, rbx, &runtime, TAG_OBJECT); |
| 1142 | 1142 |
| 1143 // Get the arguments boilerplate from the current native context. | 1143 // Get the arguments map from the current native context. |
| 1144 __ movp(rdi, Operand(rsi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); | 1144 __ movp(rdi, Operand(rsi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); |
| 1145 __ movp(rdi, FieldOperand(rdi, GlobalObject::kNativeContextOffset)); | 1145 __ movp(rdi, FieldOperand(rdi, GlobalObject::kNativeContextOffset)); |
| 1146 const int offset = | 1146 const int offset = Context::SlotOffset(Context::STRICT_ARGUMENTS_MAP_INDEX); |
| 1147 Context::SlotOffset(Context::STRICT_ARGUMENTS_BOILERPLATE_INDEX); | |
| 1148 __ movp(rdi, Operand(rdi, offset)); | 1147 __ movp(rdi, Operand(rdi, offset)); |
| 1149 | 1148 |
| 1150 // Copy the JS object part. | 1149 __ movp(FieldOperand(rax, JSObject::kMapOffset), rdi); |
| 1151 for (int i = 0; i < JSObject::kHeaderSize; i += kPointerSize) { | 1150 __ LoadRoot(kScratchRegister, Heap::kEmptyFixedArrayRootIndex); |
| 1152 __ movp(rbx, FieldOperand(rdi, i)); | 1151 __ movp(FieldOperand(rax, JSObject::kPropertiesOffset), kScratchRegister); |
| 1153 __ movp(FieldOperand(rax, i), rbx); | 1152 __ movp(FieldOperand(rax, JSObject::kElementsOffset), kScratchRegister); |
| 1154 } | |
| 1155 | 1153 |
| 1156 // Get the length (smi tagged) and set that as an in-object property too. | 1154 // Get the length (smi tagged) and set that as an in-object property too. |
| 1157 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0); | 1155 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0); |
| 1158 __ movp(rcx, args.GetArgumentOperand(2)); | 1156 __ movp(rcx, args.GetArgumentOperand(2)); |
| 1159 __ movp(FieldOperand(rax, JSObject::kHeaderSize + | 1157 __ movp(FieldOperand(rax, JSObject::kHeaderSize + |
| 1160 Heap::kArgumentsLengthIndex * kPointerSize), | 1158 Heap::kArgumentsLengthIndex * kPointerSize), |
| 1161 rcx); | 1159 rcx); |
| 1162 | 1160 |
| 1163 // If there are no actual arguments, we're done. | 1161 // If there are no actual arguments, we're done. |
| 1164 Label done; | 1162 Label done; |
| (...skipping 3776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4941 return_value_operand, | 4939 return_value_operand, |
| 4942 NULL); | 4940 NULL); |
| 4943 } | 4941 } |
| 4944 | 4942 |
| 4945 | 4943 |
| 4946 #undef __ | 4944 #undef __ |
| 4947 | 4945 |
| 4948 } } // namespace v8::internal | 4946 } } // namespace v8::internal |
| 4949 | 4947 |
| 4950 #endif // V8_TARGET_ARCH_X64 | 4948 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |