| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #if V8_TARGET_ARCH_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 | 
| 6 | 6 | 
| 7 #include "src/arm64/frames-arm64.h" | 7 #include "src/arm64/frames-arm64.h" | 
| 8 #include "src/codegen.h" | 8 #include "src/codegen.h" | 
| 9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" | 
| 10 #include "src/deoptimizer.h" | 10 #include "src/deoptimizer.h" | 
| (...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1184 | 1184 | 
| 1185 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, | 1185 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, | 
| 1186                                     Register function_template_info, | 1186                                     Register function_template_info, | 
| 1187                                     Register scratch0, Register scratch1, | 1187                                     Register scratch0, Register scratch1, | 
| 1188                                     Register scratch2, | 1188                                     Register scratch2, | 
| 1189                                     Label* receiver_check_failed) { | 1189                                     Label* receiver_check_failed) { | 
| 1190   Register signature = scratch0; | 1190   Register signature = scratch0; | 
| 1191   Register map = scratch1; | 1191   Register map = scratch1; | 
| 1192   Register constructor = scratch2; | 1192   Register constructor = scratch2; | 
| 1193 | 1193 | 
| 1194   // If the receiver is not an object, jump to receiver_check_failed. |  | 
| 1195   __ CompareObjectType(receiver, map, x16, FIRST_JS_OBJECT_TYPE); |  | 
| 1196   __ B(lo, receiver_check_failed); |  | 
| 1197 |  | 
| 1198   // If there is no signature, return the holder. | 1194   // If there is no signature, return the holder. | 
| 1199   __ Ldr(signature, FieldMemOperand(function_template_info, | 1195   __ Ldr(signature, FieldMemOperand(function_template_info, | 
| 1200                                     FunctionTemplateInfo::kSignatureOffset)); | 1196                                     FunctionTemplateInfo::kSignatureOffset)); | 
| 1201   __ CompareRoot(signature, Heap::kUndefinedValueRootIndex); | 1197   __ CompareRoot(signature, Heap::kUndefinedValueRootIndex); | 
| 1202   Label receiver_check_passed; | 1198   Label receiver_check_passed; | 
| 1203   __ B(eq, &receiver_check_passed); | 1199   __ B(eq, &receiver_check_passed); | 
| 1204 | 1200 | 
| 1205   // Walk the prototype chain. | 1201   // Walk the prototype chain. | 
| 1206   Label prototype_loop_start; | 1202   Label prototype_loop_start; | 
| 1207   __ Bind(&prototype_loop_start); | 1203   __ Bind(&prototype_loop_start); | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1256   // ----------- S t a t e ------------- | 1252   // ----------- S t a t e ------------- | 
| 1257   //  -- x0                 : number of arguments excluding receiver | 1253   //  -- x0                 : number of arguments excluding receiver | 
| 1258   //  -- x1                 : callee | 1254   //  -- x1                 : callee | 
| 1259   //  -- lr                 : return address | 1255   //  -- lr                 : return address | 
| 1260   //  -- sp[0]              : last argument | 1256   //  -- sp[0]              : last argument | 
| 1261   //  -- ... | 1257   //  -- ... | 
| 1262   //  -- sp[8 * (argc - 1)] : first argument | 1258   //  -- sp[8 * (argc - 1)] : first argument | 
| 1263   //  -- sp[8 * argc]       : receiver | 1259   //  -- sp[8 * argc]       : receiver | 
| 1264   // ----------------------------------- | 1260   // ----------------------------------- | 
| 1265 | 1261 | 
| 1266   // Load the receiver. |  | 
| 1267   __ Ldr(x2, MemOperand(jssp, x0, LSL, kPointerSizeLog2)); |  | 
| 1268 |  | 
| 1269   // Update the receiver if this is a contextual call. |  | 
| 1270   Label set_global_proxy, valid_receiver; |  | 
| 1271   __ CompareRoot(x2, Heap::kUndefinedValueRootIndex); |  | 
| 1272   __ B(eq, &set_global_proxy); |  | 
| 1273   __ Bind(&valid_receiver); |  | 
| 1274 |  | 
| 1275   // Load the FunctionTemplateInfo. | 1262   // Load the FunctionTemplateInfo. | 
| 1276   __ Ldr(x3, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset)); | 1263   __ Ldr(x3, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset)); | 
| 1277   __ Ldr(x3, FieldMemOperand(x3, SharedFunctionInfo::kFunctionDataOffset)); | 1264   __ Ldr(x3, FieldMemOperand(x3, SharedFunctionInfo::kFunctionDataOffset)); | 
| 1278 | 1265 | 
| 1279   // Do the compatible receiver check. | 1266   // Do the compatible receiver check. | 
| 1280   Label receiver_check_failed; | 1267   Label receiver_check_failed; | 
|  | 1268   __ Ldr(x2, MemOperand(jssp, x0, LSL, kPointerSizeLog2)); | 
| 1281   CompatibleReceiverCheck(masm, x2, x3, x4, x5, x6, &receiver_check_failed); | 1269   CompatibleReceiverCheck(masm, x2, x3, x4, x5, x6, &receiver_check_failed); | 
| 1282 | 1270 | 
| 1283   // Get the callback offset from the FunctionTemplateInfo, and jump to the | 1271   // Get the callback offset from the FunctionTemplateInfo, and jump to the | 
| 1284   // beginning of the code. | 1272   // beginning of the code. | 
| 1285   __ Ldr(x4, FieldMemOperand(x3, FunctionTemplateInfo::kCallCodeOffset)); | 1273   __ Ldr(x4, FieldMemOperand(x3, FunctionTemplateInfo::kCallCodeOffset)); | 
| 1286   __ Ldr(x4, FieldMemOperand(x4, CallHandlerInfo::kFastHandlerOffset)); | 1274   __ Ldr(x4, FieldMemOperand(x4, CallHandlerInfo::kFastHandlerOffset)); | 
| 1287   __ Add(x4, x4, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1275   __ Add(x4, x4, Operand(Code::kHeaderSize - kHeapObjectTag)); | 
| 1288   __ Jump(x4); | 1276   __ Jump(x4); | 
| 1289 | 1277 | 
| 1290   __ Bind(&set_global_proxy); |  | 
| 1291   __ LoadGlobalProxy(x2); |  | 
| 1292   __ Str(x2, MemOperand(jssp, x0, LSL, kPointerSizeLog2)); |  | 
| 1293   __ B(&valid_receiver); |  | 
| 1294 |  | 
| 1295   // Compatible receiver check failed: throw an Illegal Invocation exception. | 1278   // Compatible receiver check failed: throw an Illegal Invocation exception. | 
| 1296   __ Bind(&receiver_check_failed); | 1279   __ Bind(&receiver_check_failed); | 
| 1297   // Drop the arguments (including the receiver) | 1280   // Drop the arguments (including the receiver) | 
| 1298   __ add(x0, x0, Operand(1)); | 1281   __ add(x0, x0, Operand(1)); | 
| 1299   __ Drop(x0); | 1282   __ Drop(x0); | 
| 1300   __ TailCallRuntime(Runtime::kThrowIllegalInvocation); | 1283   __ TailCallRuntime(Runtime::kThrowIllegalInvocation); | 
| 1301 } | 1284 } | 
| 1302 | 1285 | 
| 1303 | 1286 | 
| 1304 void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) { | 1287 void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) { | 
| (...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2508   } | 2491   } | 
| 2509 } | 2492 } | 
| 2510 | 2493 | 
| 2511 | 2494 | 
| 2512 #undef __ | 2495 #undef __ | 
| 2513 | 2496 | 
| 2514 }  // namespace internal | 2497 }  // namespace internal | 
| 2515 }  // namespace v8 | 2498 }  // namespace v8 | 
| 2516 | 2499 | 
| 2517 #endif  // V8_TARGET_ARCH_ARM | 2500 #endif  // V8_TARGET_ARCH_ARM | 
| OLD | NEW | 
|---|