| Index: src/s390/simulator-s390.cc
|
| diff --git a/src/s390/simulator-s390.cc b/src/s390/simulator-s390.cc
|
| index b0fa0917ad7ecad6a12657f9976d39f1aaba8a05..896b3d5009e95f181f2c5ed6c66ed9ff3d6ccc94 100644
|
| --- a/src/s390/simulator-s390.cc
|
| +++ b/src/s390/simulator-s390.cc
|
| @@ -1934,7 +1934,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);
|
| @@ -1971,7 +1973,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 = 5;
|
| int arg0_regnum = 2;
|
| intptr_t result_buffer = 0;
|
| bool uses_result_buffer =
|
| @@ -1983,11 +1986,18 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
| arg0_regnum++;
|
| }
|
| intptr_t arg[kArgCount];
|
| - for (int i = 0; i < kArgCount - 1; i++) {
|
| + // First 5 arguments in registers r2-r6.
|
| + for (int i = 0; i < kRegisterArgCount; i++) {
|
| arg[i] = get_register(arg0_regnum + i);
|
| }
|
| + // Remaining arguments on stack
|
| intptr_t* stack_pointer = reinterpret_cast<intptr_t*>(get_register(sp));
|
| - arg[5] = stack_pointer[kCalleeRegisterSaveAreaSize / kPointerSize];
|
| + for (int i = kRegisterArgCount; i < kArgCount; i++) {
|
| + arg[i] = stack_pointer[(kCalleeRegisterSaveAreaSize / kPointerSize) +
|
| + (i - kRegisterArgCount)];
|
| + }
|
| + STATIC_ASSERT(kArgCount == kRegisterArgCount + 4);
|
| + STATIC_ASSERT(kMaxCParameters == 9);
|
| bool fp_call =
|
| (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) ||
|
| (redirection->type() == ExternalReference::BUILTIN_COMPARE_CALL) ||
|
| @@ -2165,9 +2175,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]);
|
| + arg[3], arg[4], arg[5], arg[6], arg[7], arg[8]);
|
| if (!stack_aligned) {
|
| PrintF(" with unaligned stack %08" V8PRIxPTR "\n",
|
| static_cast<intptr_t>(get_register(sp)));
|
| @@ -2214,8 +2225,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);
|
| }
|
|
|