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

Side by Side Diff: src/x64/stub-cache-x64.cc

Issue 21477002: Introduce PopReturnAddressTo and PushReturnAddressFrom macro-assembler instructions for X64 (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « src/x64/macro-assembler-x64.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 823
824 // Stub never generated for non-global objects that require access 824 // Stub never generated for non-global objects that require access
825 // checks. 825 // checks.
826 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); 826 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
827 827
828 // Perform map transition for the receiver if necessary. 828 // Perform map transition for the receiver if necessary.
829 if (details.type() == FIELD && 829 if (details.type() == FIELD &&
830 object->map()->unused_property_fields() == 0) { 830 object->map()->unused_property_fields() == 0) {
831 // The properties must be extended before we can store the value. 831 // The properties must be extended before we can store the value.
832 // We jump to a runtime call that extends the properties array. 832 // We jump to a runtime call that extends the properties array.
833 __ pop(scratch1); // Return address. 833 __ PopReturnAddressTo(scratch1);
834 __ push(receiver_reg); 834 __ push(receiver_reg);
835 __ Push(transition); 835 __ Push(transition);
836 __ push(value_reg); 836 __ push(value_reg);
837 __ push(scratch1); 837 __ PushReturnAddressFrom(scratch1);
838 __ TailCallExternalReference( 838 __ TailCallExternalReference(
839 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), 839 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage),
840 masm->isolate()), 840 masm->isolate()),
841 3, 841 3,
842 1); 842 1);
843 return; 843 return;
844 } 844 }
845 845
846 // Update the map of the object. 846 // Update the map of the object.
847 __ Move(scratch1, transition); 847 __ Move(scratch1, transition);
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
1277 GenerateTailCall(masm(), stub.GetCode(isolate())); 1277 GenerateTailCall(masm(), stub.GetCode(isolate()));
1278 } 1278 }
1279 } 1279 }
1280 1280
1281 1281
1282 void BaseLoadStubCompiler::GenerateLoadCallback( 1282 void BaseLoadStubCompiler::GenerateLoadCallback(
1283 Register reg, 1283 Register reg,
1284 Handle<ExecutableAccessorInfo> callback) { 1284 Handle<ExecutableAccessorInfo> callback) {
1285 // Insert additional parameters into the stack frame above return address. 1285 // Insert additional parameters into the stack frame above return address.
1286 ASSERT(!scratch4().is(reg)); 1286 ASSERT(!scratch4().is(reg));
1287 __ pop(scratch4()); // Get return address to place it below. 1287 __ PopReturnAddressTo(scratch4());
1288 1288
1289 __ push(receiver()); // receiver 1289 __ push(receiver()); // receiver
1290 __ push(reg); // holder 1290 __ push(reg); // holder
1291 if (heap()->InNewSpace(callback->data())) { 1291 if (heap()->InNewSpace(callback->data())) {
1292 __ Move(scratch1(), callback); 1292 __ Move(scratch1(), callback);
1293 __ push(FieldOperand(scratch1(), 1293 __ push(FieldOperand(scratch1(),
1294 ExecutableAccessorInfo::kDataOffset)); // data 1294 ExecutableAccessorInfo::kDataOffset)); // data
1295 } else { 1295 } else {
1296 __ Push(Handle<Object>(callback->data(), isolate())); 1296 __ Push(Handle<Object>(callback->data(), isolate()));
1297 } 1297 }
(...skipping 19 matching lines...) Expand all
1317 Register accessor_info_arg = returns_handle ? r8 : rdx; 1317 Register accessor_info_arg = returns_handle ? r8 : rdx;
1318 Register name_arg = returns_handle ? rdx : rcx; 1318 Register name_arg = returns_handle ? rdx : rcx;
1319 #else 1319 #else
1320 Register getter_arg = rdx; 1320 Register getter_arg = rdx;
1321 Register accessor_info_arg = rsi; 1321 Register accessor_info_arg = rsi;
1322 Register name_arg = rdi; 1322 Register name_arg = rdi;
1323 #endif 1323 #endif
1324 1324
1325 ASSERT(!name_arg.is(scratch4())); 1325 ASSERT(!name_arg.is(scratch4()));
1326 __ movq(name_arg, rsp); 1326 __ movq(name_arg, rsp);
1327 __ push(scratch4()); // Restore return address. 1327 __ PushReturnAddressFrom(scratch4());
1328 1328
1329 // v8::Arguments::values_ and handler for name. 1329 // v8::Arguments::values_ and handler for name.
1330 const int kStackSpace = PropertyCallbackArguments::kArgsLength + 1; 1330 const int kStackSpace = PropertyCallbackArguments::kArgsLength + 1;
1331 1331
1332 // Allocate v8::AccessorInfo in non-GCed stack space. 1332 // Allocate v8::AccessorInfo in non-GCed stack space.
1333 const int kArgStackSpace = 1; 1333 const int kArgStackSpace = 1;
1334 1334
1335 __ PrepareCallApiFunction(kArgStackSpace, returns_handle); 1335 __ PrepareCallApiFunction(kArgStackSpace, returns_handle);
1336 STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6); 1336 STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6);
1337 __ lea(rax, Operand(name_arg, 6 * kPointerSize)); 1337 __ lea(rax, Operand(name_arg, 6 * kPointerSize));
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1437 __ pop(receiver()); 1437 __ pop(receiver());
1438 } 1438 }
1439 1439
1440 // Leave the internal frame. 1440 // Leave the internal frame.
1441 } 1441 }
1442 1442
1443 GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup); 1443 GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup);
1444 } else { // !compile_followup_inline 1444 } else { // !compile_followup_inline
1445 // Call the runtime system to load the interceptor. 1445 // Call the runtime system to load the interceptor.
1446 // Check that the maps haven't changed. 1446 // Check that the maps haven't changed.
1447 __ pop(scratch2()); // save old return address 1447 __ PopReturnAddressTo(scratch2());
1448 PushInterceptorArguments(masm(), receiver(), holder_reg, 1448 PushInterceptorArguments(masm(), receiver(), holder_reg,
1449 this->name(), interceptor_holder); 1449 this->name(), interceptor_holder);
1450 __ push(scratch2()); // restore old return address 1450 __ PushReturnAddressFrom(scratch2());
1451 1451
1452 ExternalReference ref = ExternalReference( 1452 ExternalReference ref = ExternalReference(
1453 IC_Utility(IC::kLoadPropertyWithInterceptorForLoad), isolate()); 1453 IC_Utility(IC::kLoadPropertyWithInterceptorForLoad), isolate());
1454 __ TailCallExternalReference(ref, 6, 1); 1454 __ TailCallExternalReference(ref, 6, 1);
1455 } 1455 }
1456 } 1456 }
1457 1457
1458 1458
1459 void CallStubCompiler::GenerateNameCheck(Handle<Name> name, Label* miss) { 1459 void CallStubCompiler::GenerateNameCheck(Handle<Name> name, Label* miss) {
1460 if (kind_ == Code::KEYED_CALL_IC) { 1460 if (kind_ == Code::KEYED_CALL_IC) {
(...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after
2643 2643
2644 Handle<Code> StoreStubCompiler::CompileStoreCallback( 2644 Handle<Code> StoreStubCompiler::CompileStoreCallback(
2645 Handle<JSObject> object, 2645 Handle<JSObject> object,
2646 Handle<JSObject> holder, 2646 Handle<JSObject> holder,
2647 Handle<Name> name, 2647 Handle<Name> name,
2648 Handle<ExecutableAccessorInfo> callback) { 2648 Handle<ExecutableAccessorInfo> callback) {
2649 Label success; 2649 Label success;
2650 HandlerFrontend(object, receiver(), holder, name, &success); 2650 HandlerFrontend(object, receiver(), holder, name, &success);
2651 __ bind(&success); 2651 __ bind(&success);
2652 2652
2653 __ pop(scratch1()); // remove the return address 2653 __ PopReturnAddressTo(scratch1());
2654 __ push(receiver()); 2654 __ push(receiver());
2655 __ Push(callback); // callback info 2655 __ Push(callback); // callback info
2656 __ Push(name); 2656 __ Push(name);
2657 __ push(value()); 2657 __ push(value());
2658 __ push(scratch1()); // restore return address 2658 __ PushReturnAddressFrom(scratch1());
2659 2659
2660 // Do tail-call to the runtime system. 2660 // Do tail-call to the runtime system.
2661 ExternalReference store_callback_property = 2661 ExternalReference store_callback_property =
2662 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); 2662 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate());
2663 __ TailCallExternalReference(store_callback_property, 4, 1); 2663 __ TailCallExternalReference(store_callback_property, 4, 1);
2664 2664
2665 // Return the generated code. 2665 // Return the generated code.
2666 return GetCode(kind(), Code::CALLBACKS, name); 2666 return GetCode(kind(), Code::CALLBACKS, name);
2667 } 2667 }
2668 2668
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2710 } 2710 }
2711 2711
2712 2712
2713 #undef __ 2713 #undef __
2714 #define __ ACCESS_MASM(masm()) 2714 #define __ ACCESS_MASM(masm())
2715 2715
2716 2716
2717 Handle<Code> StoreStubCompiler::CompileStoreInterceptor( 2717 Handle<Code> StoreStubCompiler::CompileStoreInterceptor(
2718 Handle<JSObject> object, 2718 Handle<JSObject> object,
2719 Handle<Name> name) { 2719 Handle<Name> name) {
2720 __ pop(scratch1()); // remove the return address 2720 __ PopReturnAddressTo(scratch1());
2721 __ push(receiver()); 2721 __ push(receiver());
2722 __ push(this->name()); 2722 __ push(this->name());
2723 __ push(value()); 2723 __ push(value());
2724 __ Push(Smi::FromInt(strict_mode())); 2724 __ Push(Smi::FromInt(strict_mode()));
2725 __ push(scratch1()); // restore return address 2725 __ PushReturnAddressFrom(scratch1());
2726 2726
2727 // Do tail-call to the runtime system. 2727 // Do tail-call to the runtime system.
2728 ExternalReference store_ic_property = 2728 ExternalReference store_ic_property =
2729 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate()); 2729 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate());
2730 __ TailCallExternalReference(store_ic_property, 4, 1); 2730 __ TailCallExternalReference(store_ic_property, 4, 1);
2731 2731
2732 // Return the generated code. 2732 // Return the generated code.
2733 return GetCode(kind(), Code::INTERCEPTOR, name); 2733 return GetCode(kind(), Code::INTERCEPTOR, name);
2734 } 2734 }
2735 2735
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
3514 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); 3514 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow);
3515 } 3515 }
3516 } 3516 }
3517 3517
3518 3518
3519 #undef __ 3519 #undef __
3520 3520
3521 } } // namespace v8::internal 3521 } } // namespace v8::internal
3522 3522
3523 #endif // V8_TARGET_ARCH_X64 3523 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/macro-assembler-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698