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

Side by Side Diff: src/ppc/simulator-ppc.cc

Issue 1604653006: Introduce BUILTIN_CALL_PAIR. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Changes based on review comments. Created 4 years, 11 months 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
« no previous file with comments | « src/assembler.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 #include <stdarg.h> 5 #include <stdarg.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 #include <cmath> 7 #include <cmath>
8 8
9 #if V8_TARGET_ARCH_PPC 9 #if V8_TARGET_ARCH_PPC
10 10
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 #if V8_TARGET_BIG_ENDIAN 1181 #if V8_TARGET_BIG_ENDIAN
1182 *x = static_cast<int32_t>(*pair >> 32); 1182 *x = static_cast<int32_t>(*pair >> 32);
1183 *y = static_cast<int32_t>(*pair); 1183 *y = static_cast<int32_t>(*pair);
1184 #else 1184 #else
1185 *x = static_cast<int32_t>(*pair); 1185 *x = static_cast<int32_t>(*pair);
1186 *y = static_cast<int32_t>(*pair >> 32); 1186 *y = static_cast<int32_t>(*pair >> 32);
1187 #endif 1187 #endif
1188 } 1188 }
1189 #endif 1189 #endif
1190 1190
1191 // Calls into the V8 runtime are based on this very simple interface. 1191 // Calls into the V8 runtime.
1192 // Note: To be able to return two values from some calls the code in 1192 typedef intptr_t (*SimulatorRuntimeCall)(intptr_t arg0, intptr_t arg1,
1193 // runtime.cc uses the ObjectPair which is essentially two pointer 1193 intptr_t arg2, intptr_t arg3,
1194 // values stuffed into a structure. With the code below we assume that 1194 intptr_t arg4, intptr_t arg5);
1195 // all runtime calls return this pair. If they don't, the r4 result 1195 typedef ObjectPair (*SimulatorRuntimePairCall)(intptr_t arg0, intptr_t arg1,
1196 // register contains a bogus value, which is fine because it is 1196 intptr_t arg2, intptr_t arg3,
1197 // caller-saved. 1197 intptr_t arg4, intptr_t arg5);
1198 typedef ObjectPair (*SimulatorRuntimeCall)(intptr_t arg0, intptr_t arg1,
1199 intptr_t arg2, intptr_t arg3,
1200 intptr_t arg4, intptr_t arg5);
1201
1202 typedef ObjectTriple (*SimulatorRuntimeTripleCall)(intptr_t arg0, intptr_t arg1, 1198 typedef ObjectTriple (*SimulatorRuntimeTripleCall)(intptr_t arg0, intptr_t arg1,
1203 intptr_t arg2, intptr_t arg3, 1199 intptr_t arg2, intptr_t arg3,
1204 intptr_t arg4, 1200 intptr_t arg4,
1205 intptr_t arg5); 1201 intptr_t arg5);
1206 1202
1207 // These prototypes handle the four types of FP calls. 1203 // These prototypes handle the four types of FP calls.
1208 typedef int (*SimulatorRuntimeCompareCall)(double darg0, double darg1); 1204 typedef int (*SimulatorRuntimeCompareCall)(double darg0, double darg1);
1209 typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1); 1205 typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1);
1210 typedef double (*SimulatorRuntimeFPCall)(double darg0); 1206 typedef double (*SimulatorRuntimeFPCall)(double darg0);
1211 typedef double (*SimulatorRuntimeFPIntCall)(double darg0, intptr_t arg0); 1207 typedef double (*SimulatorRuntimeFPIntCall)(double darg0, intptr_t arg0);
(...skipping 17 matching lines...) Expand all
1229 // Check if stack is aligned. Error if not aligned is reported below to 1225 // Check if stack is aligned. Error if not aligned is reported below to
1230 // include information on the function called. 1226 // include information on the function called.
1231 bool stack_aligned = 1227 bool stack_aligned =
1232 (get_register(sp) & (::v8::internal::FLAG_sim_stack_alignment - 1)) == 1228 (get_register(sp) & (::v8::internal::FLAG_sim_stack_alignment - 1)) ==
1233 0; 1229 0;
1234 Redirection* redirection = Redirection::FromSwiInstruction(instr); 1230 Redirection* redirection = Redirection::FromSwiInstruction(instr);
1235 const int kArgCount = 6; 1231 const int kArgCount = 6;
1236 int arg0_regnum = 3; 1232 int arg0_regnum = 3;
1237 intptr_t result_buffer = 0; 1233 intptr_t result_buffer = 0;
1238 bool uses_result_buffer = 1234 bool uses_result_buffer =
1239 redirection->type() == ExternalReference::BUILTIN_CALL_TRIPLE; 1235 redirection->type() == ExternalReference::BUILTIN_CALL_TRIPLE ||
1236 (redirection->type() == ExternalReference::BUILTIN_CALL_PAIR &&
1237 !ABI_RETURNS_OBJECT_PAIRS_IN_REGS);
1240 if (uses_result_buffer) { 1238 if (uses_result_buffer) {
1241 result_buffer = get_register(r3); 1239 result_buffer = get_register(r3);
1242 arg0_regnum++; 1240 arg0_regnum++;
1243 } 1241 }
1244 intptr_t arg[kArgCount]; 1242 intptr_t arg[kArgCount];
1245 for (int i = 0; i < kArgCount; i++) { 1243 for (int i = 0; i < kArgCount; i++) {
1246 arg[i] = get_register(arg0_regnum + i); 1244 arg[i] = get_register(arg0_regnum + i);
1247 } 1245 }
1248 bool fp_call = 1246 bool fp_call =
1249 (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) || 1247 (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) ||
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1436 PrintF("Returned {%08" V8PRIxPTR ", %08" V8PRIxPTR ", %08" V8PRIxPTR 1434 PrintF("Returned {%08" V8PRIxPTR ", %08" V8PRIxPTR ", %08" V8PRIxPTR
1437 "}\n", 1435 "}\n",
1438 reinterpret_cast<intptr_t>(result.x), 1436 reinterpret_cast<intptr_t>(result.x),
1439 reinterpret_cast<intptr_t>(result.y), 1437 reinterpret_cast<intptr_t>(result.y),
1440 reinterpret_cast<intptr_t>(result.z)); 1438 reinterpret_cast<intptr_t>(result.z));
1441 } 1439 }
1442 memcpy(reinterpret_cast<void*>(result_buffer), &result, 1440 memcpy(reinterpret_cast<void*>(result_buffer), &result,
1443 sizeof(ObjectTriple)); 1441 sizeof(ObjectTriple));
1444 set_register(r3, result_buffer); 1442 set_register(r3, result_buffer);
1445 } else { 1443 } else {
1446 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL); 1444 if (redirection->type() == ExternalReference::BUILTIN_CALL_PAIR) {
1447 SimulatorRuntimeCall target = 1445 SimulatorRuntimePairCall target =
1448 reinterpret_cast<SimulatorRuntimeCall>(external); 1446 reinterpret_cast<SimulatorRuntimePairCall>(external);
1449 ObjectPair result = 1447 ObjectPair result =
1450 target(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]); 1448 target(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);
1451 intptr_t x; 1449 intptr_t x;
1452 intptr_t y; 1450 intptr_t y;
1453 decodeObjectPair(&result, &x, &y); 1451 decodeObjectPair(&result, &x, &y);
1454 if (::v8::internal::FLAG_trace_sim) { 1452 if (::v8::internal::FLAG_trace_sim) {
1455 PrintF("Returned {%08" V8PRIxPTR ", %08" V8PRIxPTR "}\n", x, y); 1453 PrintF("Returned {%08" V8PRIxPTR ", %08" V8PRIxPTR "}\n", x, y);
1454 }
1455 if (ABI_RETURNS_OBJECT_PAIRS_IN_REGS) {
1456 set_register(r3, x);
1457 set_register(r4, y);
1458 } else {
1459 memcpy(reinterpret_cast<void*>(result_buffer), &result,
1460 sizeof(ObjectPair));
1461 set_register(r3, result_buffer);
1462 }
1463 } else {
1464 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL);
1465 SimulatorRuntimeCall target =
1466 reinterpret_cast<SimulatorRuntimeCall>(external);
1467 intptr_t result =
1468 target(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);
1469 if (::v8::internal::FLAG_trace_sim) {
1470 PrintF("Returned %08" V8PRIxPTR "\n", result);
1471 }
1472 set_register(r3, result);
1456 } 1473 }
1457 set_register(r3, x);
1458 set_register(r4, y);
1459 } 1474 }
1460 } 1475 }
1461 set_pc(saved_lr); 1476 set_pc(saved_lr);
1462 break; 1477 break;
1463 } 1478 }
1464 case kBreakpoint: { 1479 case kBreakpoint: {
1465 PPCDebugger dbg(this); 1480 PPCDebugger dbg(this);
1466 dbg.Debug(); 1481 dbg.Debug();
1467 break; 1482 break;
1468 } 1483 }
(...skipping 2585 matching lines...) Expand 10 before | Expand all | Expand 10 after
4054 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp); 4069 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp);
4055 uintptr_t address = *stack_slot; 4070 uintptr_t address = *stack_slot;
4056 set_register(sp, current_sp + sizeof(uintptr_t)); 4071 set_register(sp, current_sp + sizeof(uintptr_t));
4057 return address; 4072 return address;
4058 } 4073 }
4059 } // namespace internal 4074 } // namespace internal
4060 } // namespace v8 4075 } // namespace v8
4061 4076
4062 #endif // USE_SIMULATOR 4077 #endif // USE_SIMULATOR
4063 #endif // V8_TARGET_ARCH_PPC 4078 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « src/assembler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698