| 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/bootstrapper.h" | 7 #include "src/bootstrapper.h" | 
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" | 
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" | 
| 10 #include "src/ic/handler-compiler.h" | 10 #include "src/ic/handler-compiler.h" | 
| (...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1097   // Derive argv from the stack pointer so that it points to the first argument | 1097   // Derive argv from the stack pointer so that it points to the first argument | 
| 1098   // (arg[argc-2]), or just below the receiver in case there are no arguments. | 1098   // (arg[argc-2]), or just below the receiver in case there are no arguments. | 
| 1099   //  - Adjust for the arg[] array. | 1099   //  - Adjust for the arg[] array. | 
| 1100   Register temp_argv = x11; | 1100   Register temp_argv = x11; | 
| 1101   if (!argv_in_register()) { | 1101   if (!argv_in_register()) { | 
| 1102     __ Add(temp_argv, jssp, Operand(x0, LSL, kPointerSizeLog2)); | 1102     __ Add(temp_argv, jssp, Operand(x0, LSL, kPointerSizeLog2)); | 
| 1103     //  - Adjust for the receiver. | 1103     //  - Adjust for the receiver. | 
| 1104     __ Sub(temp_argv, temp_argv, 1 * kPointerSize); | 1104     __ Sub(temp_argv, temp_argv, 1 * kPointerSize); | 
| 1105   } | 1105   } | 
| 1106 | 1106 | 
| 1107   // Enter the exit frame. Reserve three slots to preserve x21-x23 callee-saved | 1107   // Reserve three slots to preserve x21-x23 callee-saved registers. If the | 
| 1108   // registers. | 1108   // result size is too large to be returned in registers then also reserve | 
|  | 1109   // space for the return value. | 
|  | 1110   int extra_stack_space = 3 + (result_size() <= 2 ? 0 : result_size()); | 
|  | 1111   // Enter the exit frame. | 
| 1109   FrameScope scope(masm, StackFrame::MANUAL); | 1112   FrameScope scope(masm, StackFrame::MANUAL); | 
| 1110   __ EnterExitFrame(save_doubles(), x10, 3); | 1113   __ EnterExitFrame(save_doubles(), x10, extra_stack_space); | 
| 1111   DCHECK(csp.Is(__ StackPointer())); | 1114   DCHECK(csp.Is(__ StackPointer())); | 
| 1112 | 1115 | 
| 1113   // Poke callee-saved registers into reserved space. | 1116   // Poke callee-saved registers into reserved space. | 
| 1114   __ Poke(argv, 1 * kPointerSize); | 1117   __ Poke(argv, 1 * kPointerSize); | 
| 1115   __ Poke(argc, 2 * kPointerSize); | 1118   __ Poke(argc, 2 * kPointerSize); | 
| 1116   __ Poke(target, 3 * kPointerSize); | 1119   __ Poke(target, 3 * kPointerSize); | 
| 1117 | 1120 | 
|  | 1121   if (result_size() > 2) { | 
|  | 1122     // Save the location of the return value into x8 for call. | 
|  | 1123     __ Add(x8, __ StackPointer(), Operand(4 * kPointerSize)); | 
|  | 1124   } | 
|  | 1125 | 
| 1118   // We normally only keep tagged values in callee-saved registers, as they | 1126   // We normally only keep tagged values in callee-saved registers, as they | 
| 1119   // could be pushed onto the stack by called stubs and functions, and on the | 1127   // could be pushed onto the stack by called stubs and functions, and on the | 
| 1120   // stack they can confuse the GC. However, we're only calling C functions | 1128   // stack they can confuse the GC. However, we're only calling C functions | 
| 1121   // which can push arbitrary data onto the stack anyway, and so the GC won't | 1129   // which can push arbitrary data onto the stack anyway, and so the GC won't | 
| 1122   // examine that part of the stack. | 1130   // examine that part of the stack. | 
| 1123   __ Mov(argc, argc_input); | 1131   __ Mov(argc, argc_input); | 
| 1124   __ Mov(target, target_input); | 1132   __ Mov(target, target_input); | 
| 1125   __ Mov(argv, temp_argv); | 1133   __ Mov(argv, temp_argv); | 
| 1126 | 1134 | 
| 1127   // x21 : argv | 1135   // x21 : argv | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1177     __ Ldr(temp, MemOperand(fp, ExitFrameConstants::kSPOffset)); | 1185     __ Ldr(temp, MemOperand(fp, ExitFrameConstants::kSPOffset)); | 
| 1178     __ Ldr(temp, MemOperand(temp, -static_cast<int64_t>(kXRegSize))); | 1186     __ Ldr(temp, MemOperand(temp, -static_cast<int64_t>(kXRegSize))); | 
| 1179     __ Cmp(temp, x12); | 1187     __ Cmp(temp, x12); | 
| 1180     __ Check(eq, kReturnAddressNotFoundInFrame); | 1188     __ Check(eq, kReturnAddressNotFoundInFrame); | 
| 1181   } | 1189   } | 
| 1182 | 1190 | 
| 1183   // Call the builtin. | 1191   // Call the builtin. | 
| 1184   __ Blr(target); | 1192   __ Blr(target); | 
| 1185   __ Bind(&return_location); | 1193   __ Bind(&return_location); | 
| 1186 | 1194 | 
| 1187   //  x0    result      The return code from the call. | 1195   if (result_size() > 2) { | 
|  | 1196     DCHECK_EQ(3, result_size()); | 
|  | 1197     // Read result values stored on stack. | 
|  | 1198     __ Ldr(x0, MemOperand(__ StackPointer(), 4 * kPointerSize)); | 
|  | 1199     __ Ldr(x1, MemOperand(__ StackPointer(), 5 * kPointerSize)); | 
|  | 1200     __ Ldr(x2, MemOperand(__ StackPointer(), 6 * kPointerSize)); | 
|  | 1201   } | 
|  | 1202   // Result returned in x0, x1:x0 or x2:x1:x0 - do not destroy these registers! | 
|  | 1203 | 
|  | 1204   //  x0    result0      The return code from the call. | 
|  | 1205   //  x1    result1      For calls which return ObjectPair or ObjectTriple. | 
|  | 1206   //  x2    result2      For calls which return ObjectTriple. | 
| 1188   //  x21   argv | 1207   //  x21   argv | 
| 1189   //  x22   argc | 1208   //  x22   argc | 
| 1190   //  x23   target | 1209   //  x23   target | 
| 1191   const Register& result = x0; | 1210   const Register& result = x0; | 
| 1192 | 1211 | 
| 1193   // Check result for exception sentinel. | 1212   // Check result for exception sentinel. | 
| 1194   Label exception_returned; | 1213   Label exception_returned; | 
| 1195   __ CompareRoot(result, Heap::kExceptionRootIndex); | 1214   __ CompareRoot(result, Heap::kExceptionRootIndex); | 
| 1196   __ B(eq, &exception_returned); | 1215   __ B(eq, &exception_returned); | 
| 1197 | 1216 | 
| (...skipping 4637 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5835                            MemOperand(fp, 6 * kPointerSize), NULL); | 5854                            MemOperand(fp, 6 * kPointerSize), NULL); | 
| 5836 } | 5855 } | 
| 5837 | 5856 | 
| 5838 | 5857 | 
| 5839 #undef __ | 5858 #undef __ | 
| 5840 | 5859 | 
| 5841 }  // namespace internal | 5860 }  // namespace internal | 
| 5842 }  // namespace v8 | 5861 }  // namespace v8 | 
| 5843 | 5862 | 
| 5844 #endif  // V8_TARGET_ARCH_ARM64 | 5863 #endif  // V8_TARGET_ARCH_ARM64 | 
| OLD | NEW | 
|---|