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