Index: src/ppc/simulator-ppc.cc |
diff --git a/src/ppc/simulator-ppc.cc b/src/ppc/simulator-ppc.cc |
index 071b7e4199f7699547d9c65745c13eddf872327c..fab4913bda2f67bd2fbc0938e82f17d951b3678d 100644 |
--- a/src/ppc/simulator-ppc.cc |
+++ b/src/ppc/simulator-ppc.cc |
@@ -1292,7 +1292,9 @@ static void decodeObjectPair(ObjectPair* pair, intptr_t* x, intptr_t* y) { |
// Calls into the V8 runtime. |
typedef intptr_t (*SimulatorRuntimeCall)(intptr_t arg0, intptr_t arg1, |
intptr_t arg2, intptr_t arg3, |
- intptr_t arg4, intptr_t arg5); |
+ intptr_t arg4, intptr_t arg5, |
+ intptr_t arg6, intptr_t arg7, |
+ intptr_t arg8); |
typedef ObjectPair (*SimulatorRuntimePairCall)(intptr_t arg0, intptr_t arg1, |
intptr_t arg2, intptr_t arg3, |
intptr_t arg4, intptr_t arg5); |
@@ -1329,7 +1331,8 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { |
(get_register(sp) & (::v8::internal::FLAG_sim_stack_alignment - 1)) == |
0; |
Redirection* redirection = Redirection::FromSwiInstruction(instr); |
- const int kArgCount = 6; |
+ const int kArgCount = 9; |
+ const int kRegisterArgCount = 8; |
int arg0_regnum = 3; |
intptr_t result_buffer = 0; |
bool uses_result_buffer = |
@@ -1341,9 +1344,15 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { |
arg0_regnum++; |
} |
intptr_t arg[kArgCount]; |
- for (int i = 0; i < kArgCount; i++) { |
+ // First eight arguments in registers r3-r10. |
+ for (int i = 0; i < kRegisterArgCount; i++) { |
arg[i] = get_register(arg0_regnum + i); |
} |
+ intptr_t* stack_pointer = reinterpret_cast<intptr_t*>(get_register(sp)); |
+ // Remaining argument on stack |
+ arg[kRegisterArgCount] = stack_pointer[kStackFrameExtraParamSlot]; |
+ STATIC_ASSERT(kArgCount == kRegisterArgCount + 1); |
+ STATIC_ASSERT(kMaxCParameters == 9); |
bool fp_call = |
(redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) || |
(redirection->type() == ExternalReference::BUILTIN_COMPARE_CALL) || |
@@ -1519,9 +1528,10 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { |
PrintF( |
"Call to host function at %p,\n" |
"\t\t\t\targs %08" V8PRIxPTR ", %08" V8PRIxPTR ", %08" V8PRIxPTR |
+ ", %08" V8PRIxPTR ", %08" V8PRIxPTR ", %08" V8PRIxPTR |
", %08" V8PRIxPTR ", %08" V8PRIxPTR ", %08" V8PRIxPTR, |
- static_cast<void*>(FUNCTION_ADDR(target)), arg[0], arg[1], |
- arg[2], arg[3], arg[4], arg[5]); |
+ static_cast<void*>(FUNCTION_ADDR(target)), arg[0], arg[1], arg[2], |
+ arg[3], arg[4], arg[5], arg[6], arg[7], arg[8]); |
if (!stack_aligned) { |
PrintF(" with unaligned stack %08" V8PRIxPTR "\n", |
get_register(sp)); |
@@ -1568,8 +1578,8 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { |
DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL); |
SimulatorRuntimeCall target = |
reinterpret_cast<SimulatorRuntimeCall>(external); |
- intptr_t result = |
- target(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]); |
+ intptr_t result = target(arg[0], arg[1], arg[2], arg[3], arg[4], |
+ arg[5], arg[6], arg[7], arg[8]); |
if (::v8::internal::FLAG_trace_sim) { |
PrintF("Returned %08" V8PRIxPTR "\n", result); |
} |