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 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 | 832 |
833 | 833 |
834 // Undoes the effects of ReserveSpaceForFastApiCall. | 834 // Undoes the effects of ReserveSpaceForFastApiCall. |
835 static void FreeSpaceForFastApiCall(MacroAssembler* masm) { | 835 static void FreeSpaceForFastApiCall(MacroAssembler* masm) { |
836 __ Drop(kFastApiCallArguments); | 836 __ Drop(kFastApiCallArguments); |
837 } | 837 } |
838 | 838 |
839 | 839 |
840 static void GenerateFastApiDirectCall(MacroAssembler* masm, | 840 static void GenerateFastApiDirectCall(MacroAssembler* masm, |
841 const CallOptimization& optimization, | 841 const CallOptimization& optimization, |
842 int argc) { | 842 int argc, |
| 843 bool restore_context) { |
843 // ----------- S t a t e ------------- | 844 // ----------- S t a t e ------------- |
844 // -- sp[0] : holder (set by CheckPrototypes) | 845 // -- sp[0] : context |
845 // -- sp[4] : callee JS function | 846 // -- sp[4] : holder (set by CheckPrototypes) |
846 // -- sp[8] : call data | 847 // -- sp[8] : callee JS function |
847 // -- sp[12] : isolate | 848 // -- sp[12] : call data |
848 // -- sp[16] : ReturnValue default value | 849 // -- sp[16] : isolate |
849 // -- sp[20] : ReturnValue | 850 // -- sp[20] : ReturnValue default value |
850 // -- sp[24] : last JS argument | 851 // -- sp[24] : ReturnValue |
| 852 // -- sp[28] : last JS argument |
851 // -- ... | 853 // -- ... |
852 // -- sp[(argc + 5) * 4] : first JS argument | 854 // -- sp[(argc + 6) * 4] : first JS argument |
853 // -- sp[(argc + 6) * 4] : receiver | 855 // -- sp[(argc + 7) * 4] : receiver |
854 // ----------------------------------- | 856 // ----------------------------------- |
| 857 // Save calling context. |
| 858 __ str(cp, MemOperand(sp)); |
855 // Get the function and setup the context. | 859 // Get the function and setup the context. |
856 Handle<JSFunction> function = optimization.constant_function(); | 860 Handle<JSFunction> function = optimization.constant_function(); |
857 __ LoadHeapObject(r5, function); | 861 __ LoadHeapObject(r5, function); |
858 __ ldr(cp, FieldMemOperand(r5, JSFunction::kContextOffset)); | 862 __ ldr(cp, FieldMemOperand(r5, JSFunction::kContextOffset)); |
| 863 __ str(r5, MemOperand(sp, 2 * kPointerSize)); |
859 | 864 |
860 // Pass the additional arguments. | 865 // Pass the additional arguments. |
861 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); | 866 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); |
862 Handle<Object> call_data(api_call_info->data(), masm->isolate()); | 867 Handle<Object> call_data(api_call_info->data(), masm->isolate()); |
863 if (masm->isolate()->heap()->InNewSpace(*call_data)) { | 868 if (masm->isolate()->heap()->InNewSpace(*call_data)) { |
864 __ Move(r0, api_call_info); | 869 __ Move(r0, api_call_info); |
865 __ ldr(r6, FieldMemOperand(r0, CallHandlerInfo::kDataOffset)); | 870 __ ldr(r6, FieldMemOperand(r0, CallHandlerInfo::kDataOffset)); |
866 } else { | 871 } else { |
867 __ Move(r6, call_data); | 872 __ Move(r6, call_data); |
868 } | 873 } |
| 874 // Store call data. |
| 875 __ str(r6, MemOperand(sp, 3 * kPointerSize)); |
| 876 // Store isolate. |
869 __ mov(r7, Operand(ExternalReference::isolate_address(masm->isolate()))); | 877 __ mov(r7, Operand(ExternalReference::isolate_address(masm->isolate()))); |
870 // Store JS function, call data, isolate ReturnValue default and ReturnValue. | 878 __ str(r7, MemOperand(sp, 4 * kPointerSize)); |
871 __ stm(ib, sp, r5.bit() | r6.bit() | r7.bit()); | 879 // Store ReturnValue default and ReturnValue. |
872 __ LoadRoot(r5, Heap::kUndefinedValueRootIndex); | 880 __ LoadRoot(r5, Heap::kUndefinedValueRootIndex); |
873 __ str(r5, MemOperand(sp, 4 * kPointerSize)); | |
874 __ str(r5, MemOperand(sp, 5 * kPointerSize)); | 881 __ str(r5, MemOperand(sp, 5 * kPointerSize)); |
| 882 __ str(r5, MemOperand(sp, 6 * kPointerSize)); |
875 | 883 |
876 // Prepare arguments. | 884 // Prepare arguments. |
877 __ add(r2, sp, Operand(5 * kPointerSize)); | 885 __ add(r2, sp, Operand((kFastApiCallArguments - 1) * kPointerSize)); |
878 | 886 |
879 // Allocate the v8::Arguments structure in the arguments' space since | 887 // Allocate the v8::Arguments structure in the arguments' space since |
880 // it's not controlled by GC. | 888 // it's not controlled by GC. |
881 const int kApiStackSpace = 4; | 889 const int kApiStackSpace = 4; |
882 | 890 |
883 FrameScope frame_scope(masm, StackFrame::MANUAL); | 891 FrameScope frame_scope(masm, StackFrame::MANUAL); |
884 __ EnterExitFrame(false, kApiStackSpace); | 892 __ EnterExitFrame(false, kApiStackSpace); |
885 | 893 |
886 // r0 = v8::Arguments& | 894 // r0 = v8::Arguments& |
887 // Arguments is after the return address. | 895 // Arguments is after the return address. |
(...skipping 17 matching lines...) Expand all Loading... |
905 ExternalReference ref = ExternalReference(&fun, | 913 ExternalReference ref = ExternalReference(&fun, |
906 type, | 914 type, |
907 masm->isolate()); | 915 masm->isolate()); |
908 Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); | 916 Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); |
909 ExternalReference::Type thunk_type = ExternalReference::PROFILING_API_CALL; | 917 ExternalReference::Type thunk_type = ExternalReference::PROFILING_API_CALL; |
910 ApiFunction thunk_fun(thunk_address); | 918 ApiFunction thunk_fun(thunk_address); |
911 ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, | 919 ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, |
912 masm->isolate()); | 920 masm->isolate()); |
913 | 921 |
914 AllowExternalCallThatCantCauseGC scope(masm); | 922 AllowExternalCallThatCantCauseGC scope(masm); |
| 923 MemOperand context_restore_operand( |
| 924 fp, 2 * kPointerSize); |
| 925 MemOperand return_value_operand( |
| 926 fp, (kFastApiCallArguments + 1) * kPointerSize); |
915 __ CallApiFunctionAndReturn(ref, | 927 __ CallApiFunctionAndReturn(ref, |
916 function_address, | 928 function_address, |
917 thunk_ref, | 929 thunk_ref, |
918 r1, | 930 r1, |
919 kStackUnwindSpace, | 931 kStackUnwindSpace, |
920 kFastApiCallArguments + 1); | 932 return_value_operand, |
| 933 restore_context ? |
| 934 &context_restore_operand : NULL); |
921 } | 935 } |
922 | 936 |
923 | 937 |
924 // Generate call to api function. | 938 // Generate call to api function. |
925 static void GenerateFastApiCall(MacroAssembler* masm, | 939 static void GenerateFastApiCall(MacroAssembler* masm, |
926 const CallOptimization& optimization, | 940 const CallOptimization& optimization, |
927 Register receiver, | 941 Register receiver, |
928 Register scratch, | 942 Register scratch, |
929 int argc, | 943 int argc, |
930 Register* values) { | 944 Register* values) { |
931 ASSERT(optimization.is_simple_api_call()); | 945 ASSERT(optimization.is_simple_api_call()); |
932 ASSERT(!receiver.is(scratch)); | 946 ASSERT(!receiver.is(scratch)); |
933 | 947 |
934 const int stack_space = kFastApiCallArguments + argc + 1; | 948 const int stack_space = kFastApiCallArguments + argc + 1; |
| 949 const int kHolderIndex = kFastApiCallArguments + |
| 950 FunctionCallbackArguments::kHolderIndex - 1; |
935 // Assign stack space for the call arguments. | 951 // Assign stack space for the call arguments. |
936 __ sub(sp, sp, Operand(stack_space * kPointerSize)); | 952 __ sub(sp, sp, Operand(stack_space * kPointerSize)); |
937 // Write holder to stack frame. | 953 // Write holder to stack frame. |
938 __ str(receiver, MemOperand(sp, 0)); | 954 __ str(receiver, MemOperand(sp, kHolderIndex * kPointerSize)); |
939 // Write receiver to stack frame. | 955 // Write receiver to stack frame. |
940 int index = stack_space - 1; | 956 int index = stack_space - 1; |
941 __ str(receiver, MemOperand(sp, index * kPointerSize)); | 957 __ str(receiver, MemOperand(sp, index * kPointerSize)); |
942 // Write the arguments to stack frame. | 958 // Write the arguments to stack frame. |
943 for (int i = 0; i < argc; i++) { | 959 for (int i = 0; i < argc; i++) { |
944 ASSERT(!receiver.is(values[i])); | 960 ASSERT(!receiver.is(values[i])); |
945 ASSERT(!scratch.is(values[i])); | 961 ASSERT(!scratch.is(values[i])); |
946 __ str(receiver, MemOperand(sp, index-- * kPointerSize)); | 962 __ str(receiver, MemOperand(sp, index-- * kPointerSize)); |
947 } | 963 } |
948 | 964 |
949 GenerateFastApiDirectCall(masm, optimization, argc); | 965 GenerateFastApiDirectCall(masm, optimization, argc, true); |
950 } | 966 } |
951 | 967 |
952 | 968 |
953 class CallInterceptorCompiler BASE_EMBEDDED { | 969 class CallInterceptorCompiler BASE_EMBEDDED { |
954 public: | 970 public: |
955 CallInterceptorCompiler(StubCompiler* stub_compiler, | 971 CallInterceptorCompiler(StubCompiler* stub_compiler, |
956 const ParameterCount& arguments, | 972 const ParameterCount& arguments, |
957 Register name, | 973 Register name, |
958 Code::ExtraICState extra_ic_state) | 974 Code::ExtraICState extra_ic_state) |
959 : stub_compiler_(stub_compiler), | 975 : stub_compiler_(stub_compiler), |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1053 } else { | 1069 } else { |
1054 // CheckPrototypes has a side effect of fetching a 'holder' | 1070 // CheckPrototypes has a side effect of fetching a 'holder' |
1055 // for API (object which is instanceof for the signature). It's | 1071 // for API (object which is instanceof for the signature). It's |
1056 // safe to omit it here, as if present, it should be fetched | 1072 // safe to omit it here, as if present, it should be fetched |
1057 // by the previous CheckPrototypes. | 1073 // by the previous CheckPrototypes. |
1058 ASSERT(depth2 == kInvalidProtoDepth); | 1074 ASSERT(depth2 == kInvalidProtoDepth); |
1059 } | 1075 } |
1060 | 1076 |
1061 // Invoke function. | 1077 // Invoke function. |
1062 if (can_do_fast_api_call) { | 1078 if (can_do_fast_api_call) { |
1063 GenerateFastApiDirectCall(masm, optimization, arguments_.immediate()); | 1079 GenerateFastApiDirectCall( |
| 1080 masm, optimization, arguments_.immediate(), false); |
1064 } else { | 1081 } else { |
1065 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 1082 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
1066 ? CALL_AS_FUNCTION | 1083 ? CALL_AS_FUNCTION |
1067 : CALL_AS_METHOD; | 1084 : CALL_AS_METHOD; |
1068 Handle<JSFunction> function = optimization.constant_function(); | 1085 Handle<JSFunction> function = optimization.constant_function(); |
1069 ParameterCount expected(function); | 1086 ParameterCount expected(function); |
1070 __ InvokeFunction(function, expected, arguments_, | 1087 __ InvokeFunction(function, expected, arguments_, |
1071 JUMP_FUNCTION, NullCallWrapper(), call_kind); | 1088 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
1072 } | 1089 } |
1073 | 1090 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1177 Register StubCompiler::CheckPrototypes(Handle<JSObject> object, | 1194 Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
1178 Register object_reg, | 1195 Register object_reg, |
1179 Handle<JSObject> holder, | 1196 Handle<JSObject> holder, |
1180 Register holder_reg, | 1197 Register holder_reg, |
1181 Register scratch1, | 1198 Register scratch1, |
1182 Register scratch2, | 1199 Register scratch2, |
1183 Handle<Name> name, | 1200 Handle<Name> name, |
1184 int save_at_depth, | 1201 int save_at_depth, |
1185 Label* miss, | 1202 Label* miss, |
1186 PrototypeCheckType check) { | 1203 PrototypeCheckType check) { |
| 1204 const int kHolderIndex = kFastApiCallArguments + |
| 1205 FunctionCallbackArguments::kHolderIndex - 1; |
1187 // Make sure that the type feedback oracle harvests the receiver map. | 1206 // Make sure that the type feedback oracle harvests the receiver map. |
1188 // TODO(svenpanne) Remove this hack when all ICs are reworked. | 1207 // TODO(svenpanne) Remove this hack when all ICs are reworked. |
1189 __ mov(scratch1, Operand(Handle<Map>(object->map()))); | 1208 __ mov(scratch1, Operand(Handle<Map>(object->map()))); |
1190 | 1209 |
1191 Handle<JSObject> first = object; | 1210 Handle<JSObject> first = object; |
1192 // Make sure there's no overlap between holder and object registers. | 1211 // Make sure there's no overlap between holder and object registers. |
1193 ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg)); | 1212 ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg)); |
1194 ASSERT(!scratch2.is(object_reg) && !scratch2.is(holder_reg) | 1213 ASSERT(!scratch2.is(object_reg) && !scratch2.is(holder_reg) |
1195 && !scratch2.is(scratch1)); | 1214 && !scratch2.is(scratch1)); |
1196 | 1215 |
1197 // Keep track of the current object in register reg. | 1216 // Keep track of the current object in register reg. |
1198 Register reg = object_reg; | 1217 Register reg = object_reg; |
1199 int depth = 0; | 1218 int depth = 0; |
1200 | 1219 |
1201 if (save_at_depth == depth) { | 1220 if (save_at_depth == depth) { |
1202 __ str(reg, MemOperand(sp)); | 1221 __ str(reg, MemOperand(sp, kHolderIndex * kPointerSize)); |
1203 } | 1222 } |
1204 | 1223 |
1205 // Check the maps in the prototype chain. | 1224 // Check the maps in the prototype chain. |
1206 // Traverse the prototype chain from the object and do map checks. | 1225 // Traverse the prototype chain from the object and do map checks. |
1207 Handle<JSObject> current = object; | 1226 Handle<JSObject> current = object; |
1208 while (!current.is_identical_to(holder)) { | 1227 while (!current.is_identical_to(holder)) { |
1209 ++depth; | 1228 ++depth; |
1210 | 1229 |
1211 // Only global objects and objects that do not require access | 1230 // Only global objects and objects that do not require access |
1212 // checks are allowed in stubs. | 1231 // checks are allowed in stubs. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1251 // The prototype is in new space; we cannot store a reference to it | 1270 // The prototype is in new space; we cannot store a reference to it |
1252 // in the code. Load it from the map. | 1271 // in the code. Load it from the map. |
1253 __ ldr(reg, FieldMemOperand(map_reg, Map::kPrototypeOffset)); | 1272 __ ldr(reg, FieldMemOperand(map_reg, Map::kPrototypeOffset)); |
1254 } else { | 1273 } else { |
1255 // The prototype is in old space; load it directly. | 1274 // The prototype is in old space; load it directly. |
1256 __ mov(reg, Operand(prototype)); | 1275 __ mov(reg, Operand(prototype)); |
1257 } | 1276 } |
1258 } | 1277 } |
1259 | 1278 |
1260 if (save_at_depth == depth) { | 1279 if (save_at_depth == depth) { |
1261 __ str(reg, MemOperand(sp)); | 1280 __ str(reg, MemOperand(sp, kHolderIndex * kPointerSize)); |
1262 } | 1281 } |
1263 | 1282 |
1264 // Go to the next object in the prototype chain. | 1283 // Go to the next object in the prototype chain. |
1265 current = prototype; | 1284 current = prototype; |
1266 } | 1285 } |
1267 | 1286 |
1268 // Log the check depth. | 1287 // Log the check depth. |
1269 LOG(isolate(), IntEvent("check-maps-depth", depth + 1)); | 1288 LOG(isolate(), IntEvent("check-maps-depth", depth + 1)); |
1270 | 1289 |
1271 if (!holder.is_identical_to(first) || check == CHECK_ALL_MAPS) { | 1290 if (!holder.is_identical_to(first) || check == CHECK_ALL_MAPS) { |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1446 | 1465 |
1447 const int kApiStackSpace = 1; | 1466 const int kApiStackSpace = 1; |
1448 FrameScope frame_scope(masm(), StackFrame::MANUAL); | 1467 FrameScope frame_scope(masm(), StackFrame::MANUAL); |
1449 __ EnterExitFrame(false, kApiStackSpace); | 1468 __ EnterExitFrame(false, kApiStackSpace); |
1450 | 1469 |
1451 // Create AccessorInfo instance on the stack above the exit frame with | 1470 // Create AccessorInfo instance on the stack above the exit frame with |
1452 // scratch2 (internal::Object** args_) as the data. | 1471 // scratch2 (internal::Object** args_) as the data. |
1453 __ str(scratch2(), MemOperand(sp, 1 * kPointerSize)); | 1472 __ str(scratch2(), MemOperand(sp, 1 * kPointerSize)); |
1454 __ add(r1, sp, Operand(1 * kPointerSize)); // r1 = AccessorInfo& | 1473 __ add(r1, sp, Operand(1 * kPointerSize)); // r1 = AccessorInfo& |
1455 | 1474 |
1456 const int kStackUnwindSpace = kFastApiCallArguments + 1; | 1475 const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1; |
1457 Address getter_address = v8::ToCData<Address>(callback->getter()); | 1476 Address getter_address = v8::ToCData<Address>(callback->getter()); |
1458 | 1477 |
1459 ApiFunction fun(getter_address); | 1478 ApiFunction fun(getter_address); |
1460 ExternalReference::Type type = ExternalReference::DIRECT_GETTER_CALL; | 1479 ExternalReference::Type type = ExternalReference::DIRECT_GETTER_CALL; |
1461 ExternalReference ref = ExternalReference(&fun, type, isolate()); | 1480 ExternalReference ref = ExternalReference(&fun, type, isolate()); |
1462 | 1481 |
1463 Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); | 1482 Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); |
1464 ExternalReference::Type thunk_type = | 1483 ExternalReference::Type thunk_type = |
1465 ExternalReference::PROFILING_GETTER_CALL; | 1484 ExternalReference::PROFILING_GETTER_CALL; |
1466 ApiFunction thunk_fun(thunk_address); | 1485 ApiFunction thunk_fun(thunk_address); |
1467 ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, | 1486 ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, |
1468 isolate()); | 1487 isolate()); |
1469 __ CallApiFunctionAndReturn(ref, | 1488 __ CallApiFunctionAndReturn(ref, |
1470 getter_address, | 1489 getter_address, |
1471 thunk_ref, | 1490 thunk_ref, |
1472 r2, | 1491 r2, |
1473 kStackUnwindSpace, | 1492 kStackUnwindSpace, |
1474 6); | 1493 MemOperand(fp, 6 * kPointerSize), |
| 1494 NULL); |
1475 } | 1495 } |
1476 | 1496 |
1477 | 1497 |
1478 void BaseLoadStubCompiler::GenerateLoadInterceptor( | 1498 void BaseLoadStubCompiler::GenerateLoadInterceptor( |
1479 Register holder_reg, | 1499 Register holder_reg, |
1480 Handle<JSObject> object, | 1500 Handle<JSObject> object, |
1481 Handle<JSObject> interceptor_holder, | 1501 Handle<JSObject> interceptor_holder, |
1482 LookupResult* lookup, | 1502 LookupResult* lookup, |
1483 Handle<Name> name) { | 1503 Handle<Name> name) { |
1484 ASSERT(interceptor_holder->HasNamedInterceptor()); | 1504 ASSERT(interceptor_holder->HasNamedInterceptor()); |
(...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2528 | 2548 |
2529 __ IncrementCounter(counters->call_const(), 1, r0, r3); | 2549 __ IncrementCounter(counters->call_const(), 1, r0, r3); |
2530 __ IncrementCounter(counters->call_const_fast_api(), 1, r0, r3); | 2550 __ IncrementCounter(counters->call_const_fast_api(), 1, r0, r3); |
2531 | 2551 |
2532 ReserveSpaceForFastApiCall(masm(), r0); | 2552 ReserveSpaceForFastApiCall(masm(), r0); |
2533 | 2553 |
2534 // Check that the maps haven't changed and find a Holder as a side effect. | 2554 // Check that the maps haven't changed and find a Holder as a side effect. |
2535 CheckPrototypes(Handle<JSObject>::cast(object), r1, holder, r0, r3, r4, name, | 2555 CheckPrototypes(Handle<JSObject>::cast(object), r1, holder, r0, r3, r4, name, |
2536 depth, &miss); | 2556 depth, &miss); |
2537 | 2557 |
2538 GenerateFastApiDirectCall(masm(), optimization, argc); | 2558 GenerateFastApiDirectCall(masm(), optimization, argc, false); |
2539 | 2559 |
2540 __ bind(&miss); | 2560 __ bind(&miss); |
2541 FreeSpaceForFastApiCall(masm()); | 2561 FreeSpaceForFastApiCall(masm()); |
2542 | 2562 |
2543 __ bind(&miss_before_stack_reserved); | 2563 __ bind(&miss_before_stack_reserved); |
2544 GenerateMissBranch(); | 2564 GenerateMissBranch(); |
2545 | 2565 |
2546 // Return the generated code. | 2566 // Return the generated code. |
2547 return GetCode(function); | 2567 return GetCode(function); |
2548 } | 2568 } |
(...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3171 // ----------------------------------- | 3191 // ----------------------------------- |
3172 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); | 3192 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); |
3173 } | 3193 } |
3174 | 3194 |
3175 | 3195 |
3176 #undef __ | 3196 #undef __ |
3177 | 3197 |
3178 } } // namespace v8::internal | 3198 } } // namespace v8::internal |
3179 | 3199 |
3180 #endif // V8_TARGET_ARCH_ARM | 3200 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |