Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/ic/arm64/handler-compiler-arm64.cc

Issue 1248303002: Unify runtime-style IC functions with Runtime intrinsics (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Review feedback Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 __ CallExternalReference(
139 NamedLoadHandlerCompiler::kInterceptorArgsLength); 139 ExternalReference(Runtime::FunctionForId(id), masm->isolate()),
140 NamedLoadHandlerCompiler::kInterceptorArgsLength);
140 } 141 }
141 142
142 143
143 // Generate call to api function. 144 // Generate call to api function.
144 void PropertyHandlerCompiler::GenerateApiAccessorCall( 145 void PropertyHandlerCompiler::GenerateApiAccessorCall(
145 MacroAssembler* masm, const CallOptimization& optimization, 146 MacroAssembler* masm, const CallOptimization& optimization,
146 Handle<Map> receiver_map, Register receiver, Register scratch, 147 Handle<Map> receiver_map, Register receiver, Register scratch,
147 bool is_store, Register store_parameter, Register accessor_holder, 148 bool is_store, Register store_parameter, Register accessor_holder,
148 int accessor_index) { 149 int accessor_index) {
149 DCHECK(!AreAliased(accessor_holder, scratch)); 150 DCHECK(!AreAliased(accessor_holder, scratch));
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 } 302 }
302 303
303 304
304 void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) { 305 void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) {
305 // Push receiver, name and value for runtime call. 306 // Push receiver, name and value for runtime call.
306 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), 307 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(),
307 StoreDescriptor::ValueRegister()); 308 StoreDescriptor::ValueRegister());
308 309
309 // The slow case calls into the runtime to complete the store without causing 310 // 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. 311 // an IC miss that would otherwise cause a transition to the generic stub.
311 ExternalReference ref = 312 ExternalReference ref = ExternalReference(
312 ExternalReference(IC_Utility(IC::kStoreIC_Slow), masm->isolate()); 313 Runtime::FunctionForId(Runtime::kStoreIC_Slow), masm->isolate());
313 __ TailCallExternalReference(ref, 3, 1); 314 __ TailCallExternalReference(ref, 3, 1);
314 } 315 }
315 316
316 317
317 void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) { 318 void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) {
318 ASM_LOCATION("ElementHandlerCompiler::GenerateStoreSlow"); 319 ASM_LOCATION("ElementHandlerCompiler::GenerateStoreSlow");
319 320
320 // Push receiver, key and value for runtime call. 321 // Push receiver, key and value for runtime call.
321 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), 322 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(),
322 StoreDescriptor::ValueRegister()); 323 StoreDescriptor::ValueRegister());
323 324
324 // The slow case calls into the runtime to complete the store without causing 325 // 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. 326 // an IC miss that would otherwise cause a transition to the generic stub.
326 ExternalReference ref = 327 ExternalReference ref = ExternalReference(
327 ExternalReference(IC_Utility(IC::kKeyedStoreIC_Slow), masm->isolate()); 328 Runtime::FunctionForId(Runtime::kKeyedStoreIC_Slow), masm->isolate());
328 __ TailCallExternalReference(ref, 3, 1); 329 __ TailCallExternalReference(ref, 3, 1);
329 } 330 }
330 331
331 332
332 #undef __ 333 #undef __
333 #define __ ACCESS_MASM(masm()) 334 #define __ ACCESS_MASM(masm())
334 335
335 336
336 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( 337 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal(
337 Handle<PropertyCell> cell, Handle<Name> name, bool is_configurable) { 338 Handle<PropertyCell> cell, Handle<Name> name, bool is_configurable) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor( 370 Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor(
370 Handle<Name> name) { 371 Handle<Name> name) {
371 Label miss; 372 Label miss;
372 373
373 ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreInterceptor"); 374 ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreInterceptor");
374 375
375 __ Push(receiver(), this->name(), value()); 376 __ Push(receiver(), this->name(), value());
376 377
377 // Do tail-call to the runtime system. 378 // Do tail-call to the runtime system.
378 ExternalReference store_ic_property = ExternalReference( 379 ExternalReference store_ic_property = ExternalReference(
379 IC_Utility(IC::kStorePropertyWithInterceptor), isolate()); 380 Runtime::FunctionForId(Runtime::kStorePropertyWithInterceptor),
381 isolate());
380 __ TailCallExternalReference(store_ic_property, 3, 1); 382 __ TailCallExternalReference(store_ic_property, 3, 1);
381 383
382 // Return the generated code. 384 // Return the generated code.
383 return GetCode(kind(), Code::FAST, name); 385 return GetCode(kind(), Code::FAST, name);
384 } 386 }
385 387
386 388
387 Register NamedStoreHandlerCompiler::value() { 389 Register NamedStoreHandlerCompiler::value() {
388 return StoreDescriptor::ValueRegister(); 390 return StoreDescriptor::ValueRegister();
389 } 391 }
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 __ Push(receiver(), holder_reg, this->name()); 723 __ Push(receiver(), holder_reg, this->name());
722 } else { 724 } else {
723 __ Push(holder_reg, this->name()); 725 __ Push(holder_reg, this->name());
724 } 726 }
725 InterceptorVectorSlotPush(holder_reg); 727 InterceptorVectorSlotPush(holder_reg);
726 // Invoke an interceptor. Note: map checks from receiver to 728 // Invoke an interceptor. Note: map checks from receiver to
727 // interceptor's holder has been compiled before (see a caller 729 // interceptor's holder has been compiled before (see a caller
728 // of this method.) 730 // of this method.)
729 CompileCallLoadPropertyWithInterceptor( 731 CompileCallLoadPropertyWithInterceptor(
730 masm(), receiver(), holder_reg, this->name(), holder(), 732 masm(), receiver(), holder_reg, this->name(), holder(),
731 IC::kLoadPropertyWithInterceptorOnly); 733 Runtime::kLoadPropertyWithInterceptorOnly);
732 734
733 // Check if interceptor provided a value for property. If it's 735 // Check if interceptor provided a value for property. If it's
734 // the case, return immediately. 736 // the case, return immediately.
735 Label interceptor_failed; 737 Label interceptor_failed;
736 __ JumpIfRoot(x0, Heap::kNoInterceptorResultSentinelRootIndex, 738 __ JumpIfRoot(x0, Heap::kNoInterceptorResultSentinelRootIndex,
737 &interceptor_failed); 739 &interceptor_failed);
738 frame_scope.GenerateLeaveFrame(); 740 frame_scope.GenerateLeaveFrame();
739 __ Ret(); 741 __ Ret();
740 742
741 __ Bind(&interceptor_failed); 743 __ Bind(&interceptor_failed);
(...skipping 11 matching lines...) Expand all
753 755
754 756
755 void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) { 757 void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) {
756 // Call the runtime system to load the interceptor. 758 // Call the runtime system to load the interceptor.
757 DCHECK(holder()->HasNamedInterceptor()); 759 DCHECK(holder()->HasNamedInterceptor());
758 DCHECK(!holder()->GetNamedInterceptor()->getter()->IsUndefined()); 760 DCHECK(!holder()->GetNamedInterceptor()->getter()->IsUndefined());
759 PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(), 761 PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(),
760 holder()); 762 holder());
761 763
762 ExternalReference ref = ExternalReference( 764 ExternalReference ref = ExternalReference(
763 IC_Utility(IC::kLoadPropertyWithInterceptor), isolate()); 765 Runtime::FunctionForId(Runtime::kLoadPropertyWithInterceptor), isolate());
764 __ TailCallExternalReference( 766 __ TailCallExternalReference(
765 ref, NamedLoadHandlerCompiler::kInterceptorArgsLength, 1); 767 ref, NamedLoadHandlerCompiler::kInterceptorArgsLength, 1);
766 } 768 }
767 769
768 770
769 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( 771 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
770 Handle<JSObject> object, Handle<Name> name, 772 Handle<JSObject> object, Handle<Name> name,
771 Handle<ExecutableAccessorInfo> callback) { 773 Handle<ExecutableAccessorInfo> callback) {
772 ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreCallback"); 774 ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreCallback");
773 Register holder_reg = Frontend(name); 775 Register holder_reg = Frontend(name);
774 776
775 // Stub never generated for non-global objects that require access checks. 777 // Stub never generated for non-global objects that require access checks.
776 DCHECK(holder()->IsJSGlobalProxy() || !holder()->IsAccessCheckNeeded()); 778 DCHECK(holder()->IsJSGlobalProxy() || !holder()->IsAccessCheckNeeded());
777 779
778 // receiver() and holder_reg can alias. 780 // receiver() and holder_reg can alias.
779 DCHECK(!AreAliased(receiver(), scratch1(), scratch2(), value())); 781 DCHECK(!AreAliased(receiver(), scratch1(), scratch2(), value()));
780 DCHECK(!AreAliased(holder_reg, scratch1(), scratch2(), value())); 782 DCHECK(!AreAliased(holder_reg, scratch1(), scratch2(), value()));
781 // If the callback cannot leak, then push the callback directly, 783 // If the callback cannot leak, then push the callback directly,
782 // otherwise wrap it in a weak cell. 784 // otherwise wrap it in a weak cell.
783 if (callback->data()->IsUndefined() || callback->data()->IsSmi()) { 785 if (callback->data()->IsUndefined() || callback->data()->IsSmi()) {
784 __ Mov(scratch1(), Operand(callback)); 786 __ Mov(scratch1(), Operand(callback));
785 } else { 787 } else {
786 Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(callback); 788 Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(callback);
787 __ Mov(scratch1(), Operand(cell)); 789 __ Mov(scratch1(), Operand(cell));
788 } 790 }
789 __ Mov(scratch2(), Operand(name)); 791 __ Mov(scratch2(), Operand(name));
790 __ Push(receiver(), holder_reg, scratch1(), scratch2(), value()); 792 __ Push(receiver(), holder_reg, scratch1(), scratch2(), value());
791 793
792 // Do tail-call to the runtime system. 794 // Do tail-call to the runtime system.
793 ExternalReference store_callback_property = 795 ExternalReference store_callback_property = ExternalReference(
794 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); 796 Runtime::FunctionForId(Runtime::kStoreCallbackProperty), isolate());
795 __ TailCallExternalReference(store_callback_property, 5, 1); 797 __ TailCallExternalReference(store_callback_property, 5, 1);
796 798
797 // Return the generated code. 799 // Return the generated code.
798 return GetCode(kind(), Code::FAST, name); 800 return GetCode(kind(), Code::FAST, name);
799 } 801 }
800 802
801 803
802 #undef __ 804 #undef __
803 } // namespace internal 805 } // namespace internal
804 } // namespace v8 806 } // namespace v8
805 807
806 #endif // V8_TARGET_ARCH_IA32 808 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698