| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
| 8 | 8 |
| 9 #include "src/ic/call-optimization.h" | 9 #include "src/ic/call-optimization.h" |
| 10 #include "src/ic/handler-compiler.h" | 10 #include "src/ic/handler-compiler.h" |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex == 1); | 125 STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex == 1); |
| 126 STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex == 2); | 126 STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex == 2); |
| 127 STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsLength == 3); | 127 STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsLength == 3); |
| 128 | 128 |
| 129 __ Push(name, receiver, holder); | 129 __ Push(name, receiver, holder); |
| 130 } | 130 } |
| 131 | 131 |
| 132 | 132 |
| 133 static void CompileCallLoadPropertyWithInterceptor( | 133 static void CompileCallLoadPropertyWithInterceptor( |
| 134 MacroAssembler* masm, Register receiver, Register holder, Register name, | 134 MacroAssembler* masm, Register receiver, Register holder, Register name, |
| 135 Handle<JSObject> holder_obj, IC::UtilityId id) { | 135 Handle<JSObject> holder_obj, Runtime::FunctionId id) { |
| 136 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); | 136 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); |
| 137 | 137 |
| 138 __ CallExternalReference(ExternalReference(IC_Utility(id), masm->isolate()), | 138 __ CallRuntime(id, NamedLoadHandlerCompiler::kInterceptorArgsLength); |
| 139 NamedLoadHandlerCompiler::kInterceptorArgsLength); | |
| 140 } | 139 } |
| 141 | 140 |
| 142 | 141 |
| 143 // Generate call to api function. | 142 // Generate call to api function. |
| 144 void PropertyHandlerCompiler::GenerateApiAccessorCall( | 143 void PropertyHandlerCompiler::GenerateApiAccessorCall( |
| 145 MacroAssembler* masm, const CallOptimization& optimization, | 144 MacroAssembler* masm, const CallOptimization& optimization, |
| 146 Handle<Map> receiver_map, Register receiver, Register scratch, | 145 Handle<Map> receiver_map, Register receiver, Register scratch, |
| 147 bool is_store, Register store_parameter, Register accessor_holder, | 146 bool is_store, Register store_parameter, Register accessor_holder, |
| 148 int accessor_index) { | 147 int accessor_index) { |
| 149 DCHECK(!AreAliased(accessor_holder, scratch)); | 148 DCHECK(!AreAliased(accessor_holder, scratch)); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 } | 300 } |
| 302 | 301 |
| 303 | 302 |
| 304 void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) { | 303 void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) { |
| 305 // Push receiver, name and value for runtime call. | 304 // Push receiver, name and value for runtime call. |
| 306 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), | 305 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
| 307 StoreDescriptor::ValueRegister()); | 306 StoreDescriptor::ValueRegister()); |
| 308 | 307 |
| 309 // The slow case calls into the runtime to complete the store without causing | 308 // The slow case calls into the runtime to complete the store without causing |
| 310 // an IC miss that would otherwise cause a transition to the generic stub. | 309 // an IC miss that would otherwise cause a transition to the generic stub. |
| 311 ExternalReference ref = | 310 __ TailCallRuntime(Runtime::kStoreIC_Slow, 3, 1); |
| 312 ExternalReference(IC_Utility(IC::kStoreIC_Slow), masm->isolate()); | |
| 313 __ TailCallExternalReference(ref, 3, 1); | |
| 314 } | 311 } |
| 315 | 312 |
| 316 | 313 |
| 317 void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) { | 314 void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) { |
| 318 ASM_LOCATION("ElementHandlerCompiler::GenerateStoreSlow"); | 315 ASM_LOCATION("ElementHandlerCompiler::GenerateStoreSlow"); |
| 319 | 316 |
| 320 // Push receiver, key and value for runtime call. | 317 // Push receiver, key and value for runtime call. |
| 321 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), | 318 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
| 322 StoreDescriptor::ValueRegister()); | 319 StoreDescriptor::ValueRegister()); |
| 323 | 320 |
| 324 // The slow case calls into the runtime to complete the store without causing | 321 // The slow case calls into the runtime to complete the store without causing |
| 325 // an IC miss that would otherwise cause a transition to the generic stub. | 322 // an IC miss that would otherwise cause a transition to the generic stub. |
| 326 ExternalReference ref = | 323 __ TailCallRuntime(Runtime::kKeyedStoreIC_Slow, 3, 1); |
| 327 ExternalReference(IC_Utility(IC::kKeyedStoreIC_Slow), masm->isolate()); | |
| 328 __ TailCallExternalReference(ref, 3, 1); | |
| 329 } | 324 } |
| 330 | 325 |
| 331 | 326 |
| 332 #undef __ | 327 #undef __ |
| 333 #define __ ACCESS_MASM(masm()) | 328 #define __ ACCESS_MASM(masm()) |
| 334 | 329 |
| 335 | 330 |
| 336 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( | 331 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( |
| 337 Handle<PropertyCell> cell, Handle<Name> name, bool is_configurable) { | 332 Handle<PropertyCell> cell, Handle<Name> name, bool is_configurable) { |
| 338 Label miss; | 333 Label miss; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 368 | 363 |
| 369 Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor( | 364 Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor( |
| 370 Handle<Name> name) { | 365 Handle<Name> name) { |
| 371 Label miss; | 366 Label miss; |
| 372 | 367 |
| 373 ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreInterceptor"); | 368 ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreInterceptor"); |
| 374 | 369 |
| 375 __ Push(receiver(), this->name(), value()); | 370 __ Push(receiver(), this->name(), value()); |
| 376 | 371 |
| 377 // Do tail-call to the runtime system. | 372 // Do tail-call to the runtime system. |
| 378 ExternalReference store_ic_property = ExternalReference( | 373 __ TailCallRuntime(Runtime::kStorePropertyWithInterceptor, 3, 1); |
| 379 IC_Utility(IC::kStorePropertyWithInterceptor), isolate()); | |
| 380 __ TailCallExternalReference(store_ic_property, 3, 1); | |
| 381 | 374 |
| 382 // Return the generated code. | 375 // Return the generated code. |
| 383 return GetCode(kind(), Code::FAST, name); | 376 return GetCode(kind(), Code::FAST, name); |
| 384 } | 377 } |
| 385 | 378 |
| 386 | 379 |
| 387 Register NamedStoreHandlerCompiler::value() { | 380 Register NamedStoreHandlerCompiler::value() { |
| 388 return StoreDescriptor::ValueRegister(); | 381 return StoreDescriptor::ValueRegister(); |
| 389 } | 382 } |
| 390 | 383 |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 __ Push(receiver(), holder_reg, this->name()); | 714 __ Push(receiver(), holder_reg, this->name()); |
| 722 } else { | 715 } else { |
| 723 __ Push(holder_reg, this->name()); | 716 __ Push(holder_reg, this->name()); |
| 724 } | 717 } |
| 725 InterceptorVectorSlotPush(holder_reg); | 718 InterceptorVectorSlotPush(holder_reg); |
| 726 // Invoke an interceptor. Note: map checks from receiver to | 719 // Invoke an interceptor. Note: map checks from receiver to |
| 727 // interceptor's holder has been compiled before (see a caller | 720 // interceptor's holder has been compiled before (see a caller |
| 728 // of this method.) | 721 // of this method.) |
| 729 CompileCallLoadPropertyWithInterceptor( | 722 CompileCallLoadPropertyWithInterceptor( |
| 730 masm(), receiver(), holder_reg, this->name(), holder(), | 723 masm(), receiver(), holder_reg, this->name(), holder(), |
| 731 IC::kLoadPropertyWithInterceptorOnly); | 724 Runtime::kLoadPropertyWithInterceptorOnly); |
| 732 | 725 |
| 733 // Check if interceptor provided a value for property. If it's | 726 // Check if interceptor provided a value for property. If it's |
| 734 // the case, return immediately. | 727 // the case, return immediately. |
| 735 Label interceptor_failed; | 728 Label interceptor_failed; |
| 736 __ JumpIfRoot(x0, Heap::kNoInterceptorResultSentinelRootIndex, | 729 __ JumpIfRoot(x0, Heap::kNoInterceptorResultSentinelRootIndex, |
| 737 &interceptor_failed); | 730 &interceptor_failed); |
| 738 frame_scope.GenerateLeaveFrame(); | 731 frame_scope.GenerateLeaveFrame(); |
| 739 __ Ret(); | 732 __ Ret(); |
| 740 | 733 |
| 741 __ Bind(&interceptor_failed); | 734 __ Bind(&interceptor_failed); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 752 } | 745 } |
| 753 | 746 |
| 754 | 747 |
| 755 void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) { | 748 void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) { |
| 756 // Call the runtime system to load the interceptor. | 749 // Call the runtime system to load the interceptor. |
| 757 DCHECK(holder()->HasNamedInterceptor()); | 750 DCHECK(holder()->HasNamedInterceptor()); |
| 758 DCHECK(!holder()->GetNamedInterceptor()->getter()->IsUndefined()); | 751 DCHECK(!holder()->GetNamedInterceptor()->getter()->IsUndefined()); |
| 759 PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(), | 752 PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(), |
| 760 holder()); | 753 holder()); |
| 761 | 754 |
| 762 ExternalReference ref = ExternalReference( | 755 __ TailCallRuntime(Runtime::kLoadPropertyWithInterceptor, |
| 763 IC_Utility(IC::kLoadPropertyWithInterceptor), isolate()); | 756 NamedLoadHandlerCompiler::kInterceptorArgsLength, 1); |
| 764 __ TailCallExternalReference( | |
| 765 ref, NamedLoadHandlerCompiler::kInterceptorArgsLength, 1); | |
| 766 } | 757 } |
| 767 | 758 |
| 768 | 759 |
| 769 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( | 760 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( |
| 770 Handle<JSObject> object, Handle<Name> name, | 761 Handle<JSObject> object, Handle<Name> name, |
| 771 Handle<ExecutableAccessorInfo> callback) { | 762 Handle<ExecutableAccessorInfo> callback) { |
| 772 ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreCallback"); | 763 ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreCallback"); |
| 773 Register holder_reg = Frontend(name); | 764 Register holder_reg = Frontend(name); |
| 774 | 765 |
| 775 // Stub never generated for non-global objects that require access checks. | 766 // Stub never generated for non-global objects that require access checks. |
| 776 DCHECK(holder()->IsJSGlobalProxy() || !holder()->IsAccessCheckNeeded()); | 767 DCHECK(holder()->IsJSGlobalProxy() || !holder()->IsAccessCheckNeeded()); |
| 777 | 768 |
| 778 // receiver() and holder_reg can alias. | 769 // receiver() and holder_reg can alias. |
| 779 DCHECK(!AreAliased(receiver(), scratch1(), scratch2(), value())); | 770 DCHECK(!AreAliased(receiver(), scratch1(), scratch2(), value())); |
| 780 DCHECK(!AreAliased(holder_reg, scratch1(), scratch2(), value())); | 771 DCHECK(!AreAliased(holder_reg, scratch1(), scratch2(), value())); |
| 781 // If the callback cannot leak, then push the callback directly, | 772 // If the callback cannot leak, then push the callback directly, |
| 782 // otherwise wrap it in a weak cell. | 773 // otherwise wrap it in a weak cell. |
| 783 if (callback->data()->IsUndefined() || callback->data()->IsSmi()) { | 774 if (callback->data()->IsUndefined() || callback->data()->IsSmi()) { |
| 784 __ Mov(scratch1(), Operand(callback)); | 775 __ Mov(scratch1(), Operand(callback)); |
| 785 } else { | 776 } else { |
| 786 Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(callback); | 777 Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(callback); |
| 787 __ Mov(scratch1(), Operand(cell)); | 778 __ Mov(scratch1(), Operand(cell)); |
| 788 } | 779 } |
| 789 __ Mov(scratch2(), Operand(name)); | 780 __ Mov(scratch2(), Operand(name)); |
| 790 __ Push(receiver(), holder_reg, scratch1(), scratch2(), value()); | 781 __ Push(receiver(), holder_reg, scratch1(), scratch2(), value()); |
| 791 | 782 |
| 792 // Do tail-call to the runtime system. | 783 // Do tail-call to the runtime system. |
| 793 ExternalReference store_callback_property = | 784 __ TailCallRuntime(Runtime::kStoreCallbackProperty, 5, 1); |
| 794 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); | |
| 795 __ TailCallExternalReference(store_callback_property, 5, 1); | |
| 796 | 785 |
| 797 // Return the generated code. | 786 // Return the generated code. |
| 798 return GetCode(kind(), Code::FAST, name); | 787 return GetCode(kind(), Code::FAST, name); |
| 799 } | 788 } |
| 800 | 789 |
| 801 | 790 |
| 802 #undef __ | 791 #undef __ |
| 803 } // namespace internal | 792 } // namespace internal |
| 804 } // namespace v8 | 793 } // namespace v8 |
| 805 | 794 |
| 806 #endif // V8_TARGET_ARCH_IA32 | 795 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |