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

Side by Side Diff: src/ia32/stub-cache-ia32.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/arm/stub-cache-arm.cc ('k') | src/ic.h » ('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 1249 matching lines...) Expand 10 before | Expand all | Expand 10 after
1260 // If we've skipped any global objects, it's not enough to verify that 1260 // If we've skipped any global objects, it's not enough to verify that
1261 // their maps haven't changed. We also need to check that the property 1261 // their maps haven't changed. We also need to check that the property
1262 // cell for the property is still empty. 1262 // cell for the property is still empty.
1263 GenerateCheckPropertyCells(masm(), object, holder, name, scratch1, miss); 1263 GenerateCheckPropertyCells(masm(), object, holder, name, scratch1, miss);
1264 1264
1265 // Return the register containing the holder. 1265 // Return the register containing the holder.
1266 return reg; 1266 return reg;
1267 } 1267 }
1268 1268
1269 1269
1270 void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name, 1270 void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name, Label* miss) {
1271 Label* success,
1272 Label* miss) {
1273 if (!miss->is_unused()) { 1271 if (!miss->is_unused()) {
1274 __ jmp(success); 1272 Label success;
1273 __ jmp(&success);
1275 __ bind(miss); 1274 __ bind(miss);
1276 TailCallBuiltin(masm(), MissBuiltin(kind())); 1275 TailCallBuiltin(masm(), MissBuiltin(kind()));
1276 __ bind(&success);
1277 } 1277 }
1278 } 1278 }
1279 1279
1280 1280
1281 void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name, 1281 void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name, Label* miss) {
1282 Label* success,
1283 Label* miss) {
1284 if (!miss->is_unused()) { 1282 if (!miss->is_unused()) {
1285 __ jmp(success); 1283 Label success;
1284 __ jmp(&success);
1286 GenerateRestoreName(masm(), miss, name); 1285 GenerateRestoreName(masm(), miss, name);
1287 TailCallBuiltin(masm(), MissBuiltin(kind())); 1286 TailCallBuiltin(masm(), MissBuiltin(kind()));
1287 __ bind(&success);
1288 } 1288 }
1289 } 1289 }
1290 1290
1291 1291
1292 Register LoadStubCompiler::CallbackHandlerFrontend( 1292 Register LoadStubCompiler::CallbackHandlerFrontend(
1293 Handle<JSObject> object, 1293 Handle<Object> object,
1294 Register object_reg, 1294 Register object_reg,
1295 Handle<JSObject> holder, 1295 Handle<JSObject> holder,
1296 Handle<Name> name, 1296 Handle<Name> name,
1297 Label* success,
1298 Handle<Object> callback) { 1297 Handle<Object> callback) {
1299 Label miss; 1298 Label miss;
1300 1299
1301 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss); 1300 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss);
1302 1301
1303 if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { 1302 if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
1304 ASSERT(!reg.is(scratch2())); 1303 ASSERT(!reg.is(scratch2()));
1305 ASSERT(!reg.is(scratch3())); 1304 ASSERT(!reg.is(scratch3()));
1306 Register dictionary = scratch1(); 1305 Register dictionary = scratch1();
1307 bool must_preserve_dictionary_reg = reg.is(dictionary); 1306 bool must_preserve_dictionary_reg = reg.is(dictionary);
(...skipping 29 matching lines...) Expand all
1337 const int kValueOffset = kElementsStartOffset + kPointerSize; 1336 const int kValueOffset = kElementsStartOffset + kPointerSize;
1338 __ mov(scratch3(), 1337 __ mov(scratch3(),
1339 Operand(dictionary, index, times_4, kValueOffset - kHeapObjectTag)); 1338 Operand(dictionary, index, times_4, kValueOffset - kHeapObjectTag));
1340 if (must_preserve_dictionary_reg) { 1339 if (must_preserve_dictionary_reg) {
1341 __ pop(dictionary); 1340 __ pop(dictionary);
1342 } 1341 }
1343 __ cmp(scratch3(), callback); 1342 __ cmp(scratch3(), callback);
1344 __ j(not_equal, &miss); 1343 __ j(not_equal, &miss);
1345 } 1344 }
1346 1345
1347 HandlerFrontendFooter(name, success, &miss); 1346 HandlerFrontendFooter(name, &miss);
1348 return reg; 1347 return reg;
1349 } 1348 }
1350 1349
1351 1350
1352 void LoadStubCompiler::GenerateLoadField(Register reg, 1351 void LoadStubCompiler::GenerateLoadField(Register reg,
1353 Handle<JSObject> holder, 1352 Handle<JSObject> holder,
1354 PropertyIndex field, 1353 PropertyIndex field,
1355 Representation representation) { 1354 Representation representation) {
1356 if (!reg.is(receiver())) __ mov(receiver(), reg); 1355 if (!reg.is(receiver())) __ mov(receiver(), reg);
1357 if (kind() == Code::LOAD_IC) { 1356 if (kind() == Code::LOAD_IC) {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 1442
1444 void LoadStubCompiler::GenerateLoadConstant(Handle<Object> value) { 1443 void LoadStubCompiler::GenerateLoadConstant(Handle<Object> value) {
1445 // Return the constant value. 1444 // Return the constant value.
1446 __ LoadObject(eax, value); 1445 __ LoadObject(eax, value);
1447 __ ret(0); 1446 __ ret(0);
1448 } 1447 }
1449 1448
1450 1449
1451 void LoadStubCompiler::GenerateLoadInterceptor( 1450 void LoadStubCompiler::GenerateLoadInterceptor(
1452 Register holder_reg, 1451 Register holder_reg,
1453 Handle<JSObject> object, 1452 Handle<Object> object,
1454 Handle<JSObject> interceptor_holder, 1453 Handle<JSObject> interceptor_holder,
1455 LookupResult* lookup, 1454 LookupResult* lookup,
1456 Handle<Name> name) { 1455 Handle<Name> name) {
1457 ASSERT(interceptor_holder->HasNamedInterceptor()); 1456 ASSERT(interceptor_holder->HasNamedInterceptor());
1458 ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined()); 1457 ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
1459 1458
1460 // So far the most popular follow ups for interceptor loads are FIELD 1459 // So far the most popular follow ups for interceptor loads are FIELD
1461 // and CALLBACKS, so inline only them, other cases may be added 1460 // and CALLBACKS, so inline only them, other cases may be added
1462 // later. 1461 // later.
1463 bool compile_followup_inline = false; 1462 bool compile_followup_inline = false;
(...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2606 __ add(esp, Immediate(kFastApiCallArguments * kPointerSize)); 2605 __ add(esp, Immediate(kFastApiCallArguments * kPointerSize));
2607 2606
2608 __ bind(&miss_before_stack_reserved); 2607 __ bind(&miss_before_stack_reserved);
2609 GenerateMissBranch(); 2608 GenerateMissBranch();
2610 2609
2611 // Return the generated code. 2610 // Return the generated code.
2612 return GetCode(function); 2611 return GetCode(function);
2613 } 2612 }
2614 2613
2615 2614
2615 void StubCompiler::GenerateBooleanCheck(Register object, Label* miss) {
2616 Label success;
2617 // Check that the object is a boolean.
2618 __ cmp(object, factory()->true_value());
2619 __ j(equal, &success);
2620 __ cmp(object, factory()->false_value());
2621 __ j(not_equal, miss);
2622 __ bind(&success);
2623 }
2624
2625
2616 void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object, 2626 void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object,
2617 Handle<JSObject> holder, 2627 Handle<JSObject> holder,
2618 Handle<Name> name, 2628 Handle<Name> name,
2619 CheckType check, 2629 CheckType check) {
2620 Label* success) {
2621 // ----------- S t a t e ------------- 2630 // ----------- S t a t e -------------
2622 // -- ecx : name 2631 // -- ecx : name
2623 // -- esp[0] : return address 2632 // -- esp[0] : return address
2624 // -- esp[(argc - n) * 4] : arg[n] (zero-based) 2633 // -- esp[(argc - n) * 4] : arg[n] (zero-based)
2625 // -- ... 2634 // -- ...
2626 // -- esp[(argc + 1) * 4] : receiver 2635 // -- esp[(argc + 1) * 4] : receiver
2627 // ----------------------------------- 2636 // -----------------------------------
2628 Label miss; 2637 Label miss;
2629 GenerateNameCheck(name, &miss); 2638 GenerateNameCheck(name, &miss);
2630 2639
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2689 __ bind(&fast); 2698 __ bind(&fast);
2690 // Check that the maps starting from the prototype haven't changed. 2699 // Check that the maps starting from the prototype haven't changed.
2691 GenerateDirectLoadGlobalFunctionPrototype( 2700 GenerateDirectLoadGlobalFunctionPrototype(
2692 masm(), Context::NUMBER_FUNCTION_INDEX, eax, &miss); 2701 masm(), Context::NUMBER_FUNCTION_INDEX, eax, &miss);
2693 CheckPrototypes( 2702 CheckPrototypes(
2694 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))), 2703 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))),
2695 eax, holder, ebx, edx, edi, name, &miss); 2704 eax, holder, ebx, edx, edi, name, &miss);
2696 break; 2705 break;
2697 } 2706 }
2698 case BOOLEAN_CHECK: { 2707 case BOOLEAN_CHECK: {
2699 Label fast; 2708 GenerateBooleanCheck(edx, &miss);
2700 // Check that the object is a boolean.
2701 __ cmp(edx, factory()->true_value());
2702 __ j(equal, &fast);
2703 __ cmp(edx, factory()->false_value());
2704 __ j(not_equal, &miss);
2705 __ bind(&fast);
2706 // Check that the maps starting from the prototype haven't changed. 2709 // Check that the maps starting from the prototype haven't changed.
2707 GenerateDirectLoadGlobalFunctionPrototype( 2710 GenerateDirectLoadGlobalFunctionPrototype(
2708 masm(), Context::BOOLEAN_FUNCTION_INDEX, eax, &miss); 2711 masm(), Context::BOOLEAN_FUNCTION_INDEX, eax, &miss);
2709 CheckPrototypes( 2712 CheckPrototypes(
2710 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))), 2713 Handle<JSObject>(JSObject::cast(object->GetPrototype(isolate()))),
2711 eax, holder, ebx, edx, edi, name, &miss); 2714 eax, holder, ebx, edx, edi, name, &miss);
2712 break; 2715 break;
2713 } 2716 }
2714 } 2717 }
2715 2718
2716 __ jmp(success); 2719 Label success;
2720 __ jmp(&success);
2717 2721
2718 // Handle call cache miss. 2722 // Handle call cache miss.
2719 __ bind(&miss); 2723 __ bind(&miss);
2720 GenerateMissBranch(); 2724 GenerateMissBranch();
2725
2726 __ bind(&success);
2721 } 2727 }
2722 2728
2723 2729
2724 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) { 2730 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) {
2725 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) 2731 CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
2726 ? CALL_AS_FUNCTION 2732 ? CALL_AS_FUNCTION
2727 : CALL_AS_METHOD; 2733 : CALL_AS_METHOD;
2728 ParameterCount expected(function); 2734 ParameterCount expected(function);
2729 __ InvokeFunction(function, expected, arguments(), 2735 __ InvokeFunction(function, expected, arguments(),
2730 JUMP_FUNCTION, NullCallWrapper(), call_kind); 2736 JUMP_FUNCTION, NullCallWrapper(), call_kind);
2731 } 2737 }
2732 2738
2733 2739
2734 Handle<Code> CallStubCompiler::CompileCallConstant( 2740 Handle<Code> CallStubCompiler::CompileCallConstant(
2735 Handle<Object> object, 2741 Handle<Object> object,
2736 Handle<JSObject> holder, 2742 Handle<JSObject> holder,
2737 Handle<Name> name, 2743 Handle<Name> name,
2738 CheckType check, 2744 CheckType check,
2739 Handle<JSFunction> function) { 2745 Handle<JSFunction> function) {
2740 2746
2741 if (HasCustomCallGenerator(function)) { 2747 if (HasCustomCallGenerator(function)) {
2742 Handle<Code> code = CompileCustomCall(object, holder, 2748 Handle<Code> code = CompileCustomCall(object, holder,
2743 Handle<Cell>::null(), 2749 Handle<Cell>::null(),
2744 function, Handle<String>::cast(name), 2750 function, Handle<String>::cast(name),
2745 Code::CONSTANT); 2751 Code::CONSTANT);
2746 // A null handle means bail out to the regular compiler code below. 2752 // A null handle means bail out to the regular compiler code below.
2747 if (!code.is_null()) return code; 2753 if (!code.is_null()) return code;
2748 } 2754 }
2749 2755
2750 Label success; 2756 CompileHandlerFrontend(object, holder, name, check);
2751
2752 CompileHandlerFrontend(object, holder, name, check, &success);
2753 __ bind(&success);
2754 CompileHandlerBackend(function); 2757 CompileHandlerBackend(function);
2755 2758
2756 // Return the generated code. 2759 // Return the generated code.
2757 return GetCode(function); 2760 return GetCode(function);
2758 } 2761 }
2759 2762
2760 2763
2761 Handle<Code> CallStubCompiler::CompileCallInterceptor(Handle<JSObject> object, 2764 Handle<Code> CallStubCompiler::CompileCallInterceptor(Handle<JSObject> object,
2762 Handle<JSObject> holder, 2765 Handle<JSObject> holder,
2763 Handle<Name> name) { 2766 Handle<Name> name) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
2878 // Return the generated code. 2881 // Return the generated code.
2879 return GetCode(Code::NORMAL, name); 2882 return GetCode(Code::NORMAL, name);
2880 } 2883 }
2881 2884
2882 2885
2883 Handle<Code> StoreStubCompiler::CompileStoreCallback( 2886 Handle<Code> StoreStubCompiler::CompileStoreCallback(
2884 Handle<JSObject> object, 2887 Handle<JSObject> object,
2885 Handle<JSObject> holder, 2888 Handle<JSObject> holder,
2886 Handle<Name> name, 2889 Handle<Name> name,
2887 Handle<ExecutableAccessorInfo> callback) { 2890 Handle<ExecutableAccessorInfo> callback) {
2888 Label success; 2891 HandlerFrontend(object, receiver(), holder, name);
2889 HandlerFrontend(object, receiver(), holder, name, &success);
2890 __ bind(&success);
2891 2892
2892 __ pop(scratch1()); // remove the return address 2893 __ pop(scratch1()); // remove the return address
2893 __ push(receiver()); 2894 __ push(receiver());
2894 __ Push(callback); 2895 __ Push(callback);
2895 __ Push(name); 2896 __ Push(name);
2896 __ push(value()); 2897 __ push(value());
2897 __ push(scratch1()); // restore return address 2898 __ push(scratch1()); // restore return address
2898 2899
2899 // Do tail-call to the runtime system. 2900 // Do tail-call to the runtime system.
2900 ExternalReference store_callback_property = 2901 ExternalReference store_callback_property =
2901 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); 2902 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate());
2902 __ TailCallExternalReference(store_callback_property, 4, 1); 2903 __ TailCallExternalReference(store_callback_property, 4, 1);
2903 2904
2904 // Return the generated code. 2905 // Return the generated code.
2905 return GetCode(kind(), Code::CALLBACKS, name); 2906 return GetCode(kind(), Code::CALLBACKS, name);
2906 } 2907 }
2907 2908
2908 2909
2909 Handle<Code> StoreStubCompiler::CompileStoreCallback( 2910 Handle<Code> StoreStubCompiler::CompileStoreCallback(
2910 Handle<JSObject> object, 2911 Handle<JSObject> object,
2911 Handle<JSObject> holder, 2912 Handle<JSObject> holder,
2912 Handle<Name> name, 2913 Handle<Name> name,
2913 const CallOptimization& call_optimization) { 2914 const CallOptimization& call_optimization) {
2914 Label success; 2915 HandlerFrontend(object, receiver(), holder, name);
2915 HandlerFrontend(object, receiver(), holder, name, &success);
2916 __ bind(&success);
2917 2916
2918 Register values[] = { value() }; 2917 Register values[] = { value() };
2919 GenerateFastApiCall( 2918 GenerateFastApiCall(
2920 masm(), call_optimization, receiver(), scratch1(), 1, values); 2919 masm(), call_optimization, receiver(), scratch1(), 1, values);
2921 2920
2922 // Return the generated code. 2921 // Return the generated code.
2923 return GetCode(kind(), Code::CALLBACKS, name); 2922 return GetCode(kind(), Code::CALLBACKS, name);
2924 } 2923 }
2925 2924
2926 2925
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
3013 __ bind(&miss); 3012 __ bind(&miss);
3014 TailCallBuiltin(masm(), MissBuiltin(kind())); 3013 TailCallBuiltin(masm(), MissBuiltin(kind()));
3015 3014
3016 // Return the generated code. 3015 // Return the generated code.
3017 return GetICCode( 3016 return GetICCode(
3018 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC); 3017 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC);
3019 } 3018 }
3020 3019
3021 3020
3022 Handle<Code> LoadStubCompiler::CompileLoadNonexistent( 3021 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(
3023 Handle<JSObject> object, 3022 Handle<Object> object,
3024 Handle<JSObject> last, 3023 Handle<JSObject> last,
3025 Handle<Name> name, 3024 Handle<Name> name,
3026 Handle<JSGlobalObject> global) { 3025 Handle<JSGlobalObject> global) {
3027 Label success; 3026 NonexistentHandlerFrontend(object, last, name, global);
3028 3027
3029 NonexistentHandlerFrontend(object, last, name, &success, global);
3030
3031 __ bind(&success);
3032 // Return undefined if maps of the full prototype chain are still the 3028 // Return undefined if maps of the full prototype chain are still the
3033 // same and no global property with this name contains a value. 3029 // same and no global property with this name contains a value.
3034 __ mov(eax, isolate()->factory()->undefined_value()); 3030 __ mov(eax, isolate()->factory()->undefined_value());
3035 __ ret(0); 3031 __ ret(0);
3036 3032
3037 // Return the generated code. 3033 // Return the generated code.
3038 return GetCode(kind(), Code::NONEXISTENT, name); 3034 return GetCode(kind(), Code::NONEXISTENT, name);
3039 } 3035 }
3040 3036
3041 3037
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
3111 } 3107 }
3112 __ ret(0); 3108 __ ret(0);
3113 } 3109 }
3114 3110
3115 3111
3116 #undef __ 3112 #undef __
3117 #define __ ACCESS_MASM(masm()) 3113 #define __ ACCESS_MASM(masm())
3118 3114
3119 3115
3120 Handle<Code> LoadStubCompiler::CompileLoadGlobal( 3116 Handle<Code> LoadStubCompiler::CompileLoadGlobal(
3121 Handle<JSObject> object, 3117 Handle<Object> object,
3122 Handle<GlobalObject> global, 3118 Handle<GlobalObject> global,
3123 Handle<PropertyCell> cell, 3119 Handle<PropertyCell> cell,
3124 Handle<Name> name, 3120 Handle<Name> name,
3125 bool is_dont_delete) { 3121 bool is_dont_delete) {
3126 Label success, miss; 3122 Label miss;
3127 3123
3128 HandlerFrontendHeader(object, receiver(), global, name, &miss); 3124 HandlerFrontendHeader(object, receiver(), global, name, &miss);
3129 // Get the value from the cell. 3125 // Get the value from the cell.
3130 if (Serializer::enabled()) { 3126 if (Serializer::enabled()) {
3131 __ mov(eax, Immediate(cell)); 3127 __ mov(eax, Immediate(cell));
3132 __ mov(eax, FieldOperand(eax, PropertyCell::kValueOffset)); 3128 __ mov(eax, FieldOperand(eax, PropertyCell::kValueOffset));
3133 } else { 3129 } else {
3134 __ mov(eax, Operand::ForCell(cell)); 3130 __ mov(eax, Operand::ForCell(cell));
3135 } 3131 }
3136 3132
3137 // Check for deleted property if property can actually be deleted. 3133 // Check for deleted property if property can actually be deleted.
3138 if (!is_dont_delete) { 3134 if (!is_dont_delete) {
3139 __ cmp(eax, factory()->the_hole_value()); 3135 __ cmp(eax, factory()->the_hole_value());
3140 __ j(equal, &miss); 3136 __ j(equal, &miss);
3141 } else if (FLAG_debug_code) { 3137 } else if (FLAG_debug_code) {
3142 __ cmp(eax, factory()->the_hole_value()); 3138 __ cmp(eax, factory()->the_hole_value());
3143 __ Check(not_equal, kDontDeleteCellsCannotContainTheHole); 3139 __ Check(not_equal, kDontDeleteCellsCannotContainTheHole);
3144 } 3140 }
3145 3141
3146 HandlerFrontendFooter(name, &success, &miss); 3142 HandlerFrontendFooter(name, &miss);
3147 __ bind(&success);
3148 3143
3149 Counters* counters = isolate()->counters(); 3144 Counters* counters = isolate()->counters();
3150 __ IncrementCounter(counters->named_load_global_stub(), 1); 3145 __ IncrementCounter(counters->named_load_global_stub(), 1);
3151 // The code above already loads the result into the return register. 3146 // The code above already loads the result into the return register.
3152 __ ret(0); 3147 __ ret(0);
3153 3148
3154 // Return the generated code. 3149 // Return the generated code.
3155 return GetCode(kind(), Code::NORMAL, name); 3150 return GetCode(kind(), Code::NORMAL, name);
3156 } 3151 }
3157 3152
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
3239 // ----------------------------------- 3234 // -----------------------------------
3240 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); 3235 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric);
3241 } 3236 }
3242 3237
3243 3238
3244 #undef __ 3239 #undef __
3245 3240
3246 } } // namespace v8::internal 3241 } } // namespace v8::internal
3247 3242
3248 #endif // V8_TARGET_ARCH_IA32 3243 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/arm/stub-cache-arm.cc ('k') | src/ic.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698