OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |