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

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

Issue 62953007: Handle all object types (minus smi) in load/store ICs (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed commentsx Created 7 years, 1 month 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/type-info.cc ('k') | test/mjsunit/load-callback-from-value-classic.js » ('j') | 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 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1193 // If we've skipped any global objects, it's not enough to verify that 1193 // If we've skipped any global objects, it's not enough to verify that
1194 // their maps haven't changed. We also need to check that the property 1194 // their maps haven't changed. We also need to check that the property
1195 // cell for the property is still empty. 1195 // cell for the property is still empty.
1196 GenerateCheckPropertyCells(masm(), object, holder, name, scratch1, miss); 1196 GenerateCheckPropertyCells(masm(), object, holder, name, scratch1, miss);
1197 1197
1198 // Return the register containing the holder. 1198 // Return the register containing the holder.
1199 return reg; 1199 return reg;
1200 } 1200 }
1201 1201
1202 1202
1203 void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name, 1203 void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name, Label* miss) {
1204 Label* success,
1205 Label* miss) {
1206 if (!miss->is_unused()) { 1204 if (!miss->is_unused()) {
1207 __ jmp(success); 1205 Label success;
1206 __ jmp(&success);
1208 __ bind(miss); 1207 __ bind(miss);
1209 TailCallBuiltin(masm(), MissBuiltin(kind())); 1208 TailCallBuiltin(masm(), MissBuiltin(kind()));
1209 __ bind(&success);
1210 } 1210 }
1211 } 1211 }
1212 1212
1213 1213
1214 void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name, 1214 void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name, Label* miss) {
1215 Label* success,
1216 Label* miss) {
1217 if (!miss->is_unused()) { 1215 if (!miss->is_unused()) {
1218 __ jmp(success); 1216 Label success;
1217 __ jmp(&success);
1219 GenerateRestoreName(masm(), miss, name); 1218 GenerateRestoreName(masm(), miss, name);
1220 TailCallBuiltin(masm(), MissBuiltin(kind())); 1219 TailCallBuiltin(masm(), MissBuiltin(kind()));
1220 __ bind(&success);
1221 } 1221 }
1222 } 1222 }
1223 1223
1224 1224
1225 Register LoadStubCompiler::CallbackHandlerFrontend( 1225 Register LoadStubCompiler::CallbackHandlerFrontend(
1226 Handle<JSObject> object, 1226 Handle<Object> object,
1227 Register object_reg, 1227 Register object_reg,
1228 Handle<JSObject> holder, 1228 Handle<JSObject> holder,
1229 Handle<Name> name, 1229 Handle<Name> name,
1230 Label* success,
1231 Handle<Object> callback) { 1230 Handle<Object> callback) {
1232 Label miss; 1231 Label miss;
1233 1232
1234 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss); 1233 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss);
1235 1234
1236 if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { 1235 if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
1237 ASSERT(!reg.is(scratch2())); 1236 ASSERT(!reg.is(scratch2()));
1238 ASSERT(!reg.is(scratch3())); 1237 ASSERT(!reg.is(scratch3()));
1239 ASSERT(!reg.is(scratch4())); 1238 ASSERT(!reg.is(scratch4()));
1240 1239
(...skipping 20 matching lines...) Expand all
1261 NameDictionary::kElementsStartIndex * kPointerSize; 1260 NameDictionary::kElementsStartIndex * kPointerSize;
1262 const int kValueOffset = kElementsStartOffset + kPointerSize; 1261 const int kValueOffset = kElementsStartOffset + kPointerSize;
1263 __ movq(scratch2(), 1262 __ movq(scratch2(),
1264 Operand(dictionary, index, times_pointer_size, 1263 Operand(dictionary, index, times_pointer_size,
1265 kValueOffset - kHeapObjectTag)); 1264 kValueOffset - kHeapObjectTag));
1266 __ movq(scratch3(), callback, RelocInfo::EMBEDDED_OBJECT); 1265 __ movq(scratch3(), callback, RelocInfo::EMBEDDED_OBJECT);
1267 __ cmpq(scratch2(), scratch3()); 1266 __ cmpq(scratch2(), scratch3());
1268 __ j(not_equal, &miss); 1267 __ j(not_equal, &miss);
1269 } 1268 }
1270 1269
1271 HandlerFrontendFooter(name, success, &miss); 1270 HandlerFrontendFooter(name, &miss);
1272 return reg; 1271 return reg;
1273 } 1272 }
1274 1273
1275 1274
1276 void LoadStubCompiler::GenerateLoadField(Register reg, 1275 void LoadStubCompiler::GenerateLoadField(Register reg,
1277 Handle<JSObject> holder, 1276 Handle<JSObject> holder,
1278 PropertyIndex field, 1277 PropertyIndex field,
1279 Representation representation) { 1278 Representation representation) {
1280 if (!reg.is(receiver())) __ movq(receiver(), reg); 1279 if (!reg.is(receiver())) __ movq(receiver(), reg);
1281 if (kind() == Code::LOAD_IC) { 1280 if (kind() == Code::LOAD_IC) {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1382 1381
1383 void LoadStubCompiler::GenerateLoadConstant(Handle<Object> value) { 1382 void LoadStubCompiler::GenerateLoadConstant(Handle<Object> value) {
1384 // Return the constant value. 1383 // Return the constant value.
1385 __ Move(rax, value); 1384 __ Move(rax, value);
1386 __ ret(0); 1385 __ ret(0);
1387 } 1386 }
1388 1387
1389 1388
1390 void LoadStubCompiler::GenerateLoadInterceptor( 1389 void LoadStubCompiler::GenerateLoadInterceptor(
1391 Register holder_reg, 1390 Register holder_reg,
1392 Handle<JSObject> object, 1391 Handle<Object> object,
1393 Handle<JSObject> interceptor_holder, 1392 Handle<JSObject> interceptor_holder,
1394 LookupResult* lookup, 1393 LookupResult* lookup,
1395 Handle<Name> name) { 1394 Handle<Name> name) {
1396 ASSERT(interceptor_holder->HasNamedInterceptor()); 1395 ASSERT(interceptor_holder->HasNamedInterceptor());
1397 ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined()); 1396 ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
1398 1397
1399 // So far the most popular follow ups for interceptor loads are FIELD 1398 // So far the most popular follow ups for interceptor loads are FIELD
1400 // and CALLBACKS, so inline only them, other cases may be added 1399 // and CALLBACKS, so inline only them, other cases may be added
1401 // later. 1400 // later.
1402 bool compile_followup_inline = false; 1401 bool compile_followup_inline = false;
(...skipping 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after
2500 __ addq(rsp, Immediate(kFastApiCallArguments * kPointerSize)); 2499 __ addq(rsp, Immediate(kFastApiCallArguments * kPointerSize));
2501 2500
2502 __ bind(&miss_before_stack_reserved); 2501 __ bind(&miss_before_stack_reserved);
2503 GenerateMissBranch(); 2502 GenerateMissBranch();
2504 2503
2505 // Return the generated code. 2504 // Return the generated code.
2506 return GetCode(function); 2505 return GetCode(function);
2507 } 2506 }
2508 2507
2509 2508
2509 void StubCompiler::GenerateBooleanCheck(Register object, Label* miss) {
2510 Label success;
2511 // Check that the object is a boolean.
2512 __ CompareRoot(object, Heap::kTrueValueRootIndex);
2513 __ j(equal, &success);
2514 __ CompareRoot(object, Heap::kFalseValueRootIndex);
2515 __ j(not_equal, miss);
2516 __ bind(&success);
2517 }
2518
2519
2510 void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object, 2520 void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object,
2511 Handle<JSObject> holder, 2521 Handle<JSObject> holder,
2512 Handle<Name> name, 2522 Handle<Name> name,
2513 CheckType check, 2523 CheckType check) {
2514 Label* success) {
2515 // ----------- S t a t e ------------- 2524 // ----------- S t a t e -------------
2516 // rcx : function name 2525 // rcx : function name
2517 // rsp[0] : return address 2526 // rsp[0] : return address
2518 // rsp[8] : argument argc 2527 // rsp[8] : argument argc
2519 // rsp[16] : argument argc - 1 2528 // rsp[16] : argument argc - 1
2520 // ... 2529 // ...
2521 // rsp[argc * 8] : argument 1 2530 // rsp[argc * 8] : argument 1
2522 // rsp[(argc + 1) * 8] : argument 0 = receiver 2531 // rsp[(argc + 1) * 8] : argument 0 = receiver
2523 // ----------------------------------- 2532 // -----------------------------------
2524 Label miss; 2533 Label miss;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2586 __ bind(&fast); 2595 __ bind(&fast);
2587 // Check that the maps starting from the prototype haven't changed. 2596 // Check that the maps starting from the prototype haven't changed.
2588 GenerateDirectLoadGlobalFunctionPrototype( 2597 GenerateDirectLoadGlobalFunctionPrototype(
2589 masm(), Context::NUMBER_FUNCTION_INDEX, rax, &miss); 2598 masm(), Context::NUMBER_FUNCTION_INDEX, rax, &miss);
2590 CheckPrototypes( 2599 CheckPrototypes(
2591 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))), 2600 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))),
2592 rax, holder, rbx, rdx, rdi, name, &miss); 2601 rax, holder, rbx, rdx, rdi, name, &miss);
2593 break; 2602 break;
2594 } 2603 }
2595 case BOOLEAN_CHECK: { 2604 case BOOLEAN_CHECK: {
2596 Label fast; 2605 GenerateBooleanCheck(rdx, &miss);
2597 // Check that the object is a boolean.
2598 __ CompareRoot(rdx, Heap::kTrueValueRootIndex);
2599 __ j(equal, &fast);
2600 __ CompareRoot(rdx, Heap::kFalseValueRootIndex);
2601 __ j(not_equal, &miss);
2602 __ bind(&fast);
2603 // Check that the maps starting from the prototype haven't changed. 2606 // Check that the maps starting from the prototype haven't changed.
2604 GenerateDirectLoadGlobalFunctionPrototype( 2607 GenerateDirectLoadGlobalFunctionPrototype(
2605 masm(), Context::BOOLEAN_FUNCTION_INDEX, rax, &miss); 2608 masm(), Context::BOOLEAN_FUNCTION_INDEX, rax, &miss);
2606 CheckPrototypes( 2609 CheckPrototypes(
2607 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))), 2610 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))),
2608 rax, holder, rbx, rdx, rdi, name, &miss); 2611 rax, holder, rbx, rdx, rdi, name, &miss);
2609 break; 2612 break;
2610 } 2613 }
2611 } 2614 }
2612 2615
2613 __ jmp(success); 2616 Label success;
2617 __ jmp(&success);
2614 2618
2615 // Handle call cache miss. 2619 // Handle call cache miss.
2616 __ bind(&miss); 2620 __ bind(&miss);
2617 GenerateMissBranch(); 2621 GenerateMissBranch();
2622
2623 __ bind(&success);
2618 } 2624 }
2619 2625
2620 2626
2621 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) { 2627 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) {
2622 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) 2628 CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
2623 ? CALL_AS_FUNCTION 2629 ? CALL_AS_FUNCTION
2624 : CALL_AS_METHOD; 2630 : CALL_AS_METHOD;
2625 ParameterCount expected(function); 2631 ParameterCount expected(function);
2626 __ InvokeFunction(function, expected, arguments(), 2632 __ InvokeFunction(function, expected, arguments(),
2627 JUMP_FUNCTION, NullCallWrapper(), call_kind); 2633 JUMP_FUNCTION, NullCallWrapper(), call_kind);
2628 } 2634 }
2629 2635
2630 2636
2631 Handle<Code> CallStubCompiler::CompileCallConstant( 2637 Handle<Code> CallStubCompiler::CompileCallConstant(
2632 Handle<Object> object, 2638 Handle<Object> object,
2633 Handle<JSObject> holder, 2639 Handle<JSObject> holder,
2634 Handle<Name> name, 2640 Handle<Name> name,
2635 CheckType check, 2641 CheckType check,
2636 Handle<JSFunction> function) { 2642 Handle<JSFunction> function) {
2637 if (HasCustomCallGenerator(function)) { 2643 if (HasCustomCallGenerator(function)) {
2638 Handle<Code> code = CompileCustomCall(object, holder, 2644 Handle<Code> code = CompileCustomCall(object, holder,
2639 Handle<PropertyCell>::null(), 2645 Handle<PropertyCell>::null(),
2640 function, Handle<String>::cast(name), 2646 function, Handle<String>::cast(name),
2641 Code::CONSTANT); 2647 Code::CONSTANT);
2642 // A null handle means bail out to the regular compiler code below. 2648 // A null handle means bail out to the regular compiler code below.
2643 if (!code.is_null()) return code; 2649 if (!code.is_null()) return code;
2644 } 2650 }
2645 2651
2646 Label success; 2652 CompileHandlerFrontend(object, holder, name, check);
2647
2648 CompileHandlerFrontend(object, holder, name, check, &success);
2649 __ bind(&success);
2650 CompileHandlerBackend(function); 2653 CompileHandlerBackend(function);
2651 2654
2652 // Return the generated code. 2655 // Return the generated code.
2653 return GetCode(function); 2656 return GetCode(function);
2654 } 2657 }
2655 2658
2656 2659
2657 Handle<Code> CallStubCompiler::CompileCallInterceptor(Handle<JSObject> object, 2660 Handle<Code> CallStubCompiler::CompileCallInterceptor(Handle<JSObject> object,
2658 Handle<JSObject> holder, 2661 Handle<JSObject> holder,
2659 Handle<Name> name) { 2662 Handle<Name> name) {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
2775 // Return the generated code. 2778 // Return the generated code.
2776 return GetCode(Code::NORMAL, name); 2779 return GetCode(Code::NORMAL, name);
2777 } 2780 }
2778 2781
2779 2782
2780 Handle<Code> StoreStubCompiler::CompileStoreCallback( 2783 Handle<Code> StoreStubCompiler::CompileStoreCallback(
2781 Handle<JSObject> object, 2784 Handle<JSObject> object,
2782 Handle<JSObject> holder, 2785 Handle<JSObject> holder,
2783 Handle<Name> name, 2786 Handle<Name> name,
2784 Handle<ExecutableAccessorInfo> callback) { 2787 Handle<ExecutableAccessorInfo> callback) {
2785 Label success; 2788 HandlerFrontend(object, receiver(), holder, name);
2786 HandlerFrontend(object, receiver(), holder, name, &success);
2787 __ bind(&success);
2788 2789
2789 __ PopReturnAddressTo(scratch1()); 2790 __ PopReturnAddressTo(scratch1());
2790 __ push(receiver()); 2791 __ push(receiver());
2791 __ Push(callback); // callback info 2792 __ Push(callback); // callback info
2792 __ Push(name); 2793 __ Push(name);
2793 __ push(value()); 2794 __ push(value());
2794 __ PushReturnAddressFrom(scratch1()); 2795 __ PushReturnAddressFrom(scratch1());
2795 2796
2796 // Do tail-call to the runtime system. 2797 // Do tail-call to the runtime system.
2797 ExternalReference store_callback_property = 2798 ExternalReference store_callback_property =
2798 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); 2799 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate());
2799 __ TailCallExternalReference(store_callback_property, 4, 1); 2800 __ TailCallExternalReference(store_callback_property, 4, 1);
2800 2801
2801 // Return the generated code. 2802 // Return the generated code.
2802 return GetCode(kind(), Code::CALLBACKS, name); 2803 return GetCode(kind(), Code::CALLBACKS, name);
2803 } 2804 }
2804 2805
2805 2806
2806 Handle<Code> StoreStubCompiler::CompileStoreCallback( 2807 Handle<Code> StoreStubCompiler::CompileStoreCallback(
2807 Handle<JSObject> object, 2808 Handle<JSObject> object,
2808 Handle<JSObject> holder, 2809 Handle<JSObject> holder,
2809 Handle<Name> name, 2810 Handle<Name> name,
2810 const CallOptimization& call_optimization) { 2811 const CallOptimization& call_optimization) {
2811 Label success; 2812 HandlerFrontend(object, receiver(), holder, name);
2812 HandlerFrontend(object, receiver(), holder, name, &success);
2813 __ bind(&success);
2814 2813
2815 Register values[] = { value() }; 2814 Register values[] = { value() };
2816 GenerateFastApiCall( 2815 GenerateFastApiCall(
2817 masm(), call_optimization, receiver(), scratch3(), 1, values); 2816 masm(), call_optimization, receiver(), scratch3(), 1, values);
2818 2817
2819 // Return the generated code. 2818 // Return the generated code.
2820 return GetCode(kind(), Code::CALLBACKS, name); 2819 return GetCode(kind(), Code::CALLBACKS, name);
2821 } 2820 }
2822 2821
2823 2822
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
2917 2916
2918 TailCallBuiltin(masm(), MissBuiltin(kind())); 2917 TailCallBuiltin(masm(), MissBuiltin(kind()));
2919 2918
2920 // Return the generated code. 2919 // Return the generated code.
2921 return GetICCode( 2920 return GetICCode(
2922 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC); 2921 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC);
2923 } 2922 }
2924 2923
2925 2924
2926 Handle<Code> LoadStubCompiler::CompileLoadNonexistent( 2925 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(
2927 Handle<JSObject> object, 2926 Handle<Object> object,
2928 Handle<JSObject> last, 2927 Handle<JSObject> last,
2929 Handle<Name> name, 2928 Handle<Name> name,
2930 Handle<JSGlobalObject> global) { 2929 Handle<JSGlobalObject> global) {
2931 Label success; 2930 NonexistentHandlerFrontend(object, last, name, global);
2932 2931
2933 NonexistentHandlerFrontend(object, last, name, &success, global);
2934
2935 __ bind(&success);
2936 // Return undefined if maps of the full prototype chain are still the 2932 // Return undefined if maps of the full prototype chain are still the
2937 // same and no global property with this name contains a value. 2933 // same and no global property with this name contains a value.
2938 __ LoadRoot(rax, Heap::kUndefinedValueRootIndex); 2934 __ LoadRoot(rax, Heap::kUndefinedValueRootIndex);
2939 __ ret(0); 2935 __ ret(0);
2940 2936
2941 // Return the generated code. 2937 // Return the generated code.
2942 return GetCode(kind(), Code::NONEXISTENT, name); 2938 return GetCode(kind(), Code::NONEXISTENT, name);
2943 } 2939 }
2944 2940
2945 2941
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
3020 } 3016 }
3021 __ ret(0); 3017 __ ret(0);
3022 } 3018 }
3023 3019
3024 3020
3025 #undef __ 3021 #undef __
3026 #define __ ACCESS_MASM(masm()) 3022 #define __ ACCESS_MASM(masm())
3027 3023
3028 3024
3029 Handle<Code> LoadStubCompiler::CompileLoadGlobal( 3025 Handle<Code> LoadStubCompiler::CompileLoadGlobal(
3030 Handle<JSObject> object, 3026 Handle<Object> object,
3031 Handle<GlobalObject> global, 3027 Handle<GlobalObject> global,
3032 Handle<PropertyCell> cell, 3028 Handle<PropertyCell> cell,
3033 Handle<Name> name, 3029 Handle<Name> name,
3034 bool is_dont_delete) { 3030 bool is_dont_delete) {
3035 Label success, miss; 3031 Label miss;
3036 // TODO(verwaest): Directly store to rax. Currently we cannot do this, since 3032 // TODO(verwaest): Directly store to rax. Currently we cannot do this, since
3037 // rax is used as receiver(), which we would otherwise clobber before a 3033 // rax is used as receiver(), which we would otherwise clobber before a
3038 // potential miss. 3034 // potential miss.
3039 HandlerFrontendHeader(object, receiver(), global, name, &miss); 3035 HandlerFrontendHeader(object, receiver(), global, name, &miss);
3040 3036
3041 // Get the value from the cell. 3037 // Get the value from the cell.
3042 __ Move(rbx, cell); 3038 __ Move(rbx, cell);
3043 __ movq(rbx, FieldOperand(rbx, PropertyCell::kValueOffset)); 3039 __ movq(rbx, FieldOperand(rbx, PropertyCell::kValueOffset));
3044 3040
3045 // Check for deleted property if property can actually be deleted. 3041 // Check for deleted property if property can actually be deleted.
3046 if (!is_dont_delete) { 3042 if (!is_dont_delete) {
3047 __ CompareRoot(rbx, Heap::kTheHoleValueRootIndex); 3043 __ CompareRoot(rbx, Heap::kTheHoleValueRootIndex);
3048 __ j(equal, &miss); 3044 __ j(equal, &miss);
3049 } else if (FLAG_debug_code) { 3045 } else if (FLAG_debug_code) {
3050 __ CompareRoot(rbx, Heap::kTheHoleValueRootIndex); 3046 __ CompareRoot(rbx, Heap::kTheHoleValueRootIndex);
3051 __ Check(not_equal, kDontDeleteCellsCannotContainTheHole); 3047 __ Check(not_equal, kDontDeleteCellsCannotContainTheHole);
3052 } 3048 }
3053 3049
3054 HandlerFrontendFooter(name, &success, &miss); 3050 HandlerFrontendFooter(name, &miss);
3055 __ bind(&success);
3056 3051
3057 Counters* counters = isolate()->counters(); 3052 Counters* counters = isolate()->counters();
3058 __ IncrementCounter(counters->named_load_global_stub(), 1); 3053 __ IncrementCounter(counters->named_load_global_stub(), 1);
3059 __ movq(rax, rbx); 3054 __ movq(rax, rbx);
3060 __ ret(0); 3055 __ ret(0);
3061 3056
3062 // Return the generated code. 3057 // Return the generated code.
3063 return GetCode(kind(), Code::NORMAL, name); 3058 return GetCode(kind(), Code::NORMAL, name);
3064 } 3059 }
3065 3060
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
3146 // ----------------------------------- 3141 // -----------------------------------
3147 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); 3142 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric);
3148 } 3143 }
3149 3144
3150 3145
3151 #undef __ 3146 #undef __
3152 3147
3153 } } // namespace v8::internal 3148 } } // namespace v8::internal
3154 3149
3155 #endif // V8_TARGET_ARCH_X64 3150 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/type-info.cc ('k') | test/mjsunit/load-callback-from-value-classic.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698