| Index: src/arm64/simulator-arm64.cc
|
| diff --git a/src/arm64/simulator-arm64.cc b/src/arm64/simulator-arm64.cc
|
| index c8a26e44fda04e1126f4bbe7e1667a671661b6b2..59fa0fdbfc569c9ff49ce60d7dc5c97c709970f8 100644
|
| --- a/src/arm64/simulator-arm64.cc
|
| +++ b/src/arm64/simulator-arm64.cc
|
| @@ -538,14 +538,11 @@ void Simulator::TearDown(base::CustomMatcherHashMap* i_cache,
|
| // uses the ObjectPair structure.
|
| // The simulator assumes all runtime calls return two 64-bits values. If they
|
| // don't, register x1 is clobbered. This is fine because x1 is caller-saved.
|
| -typedef ObjectPair (*SimulatorRuntimeCall)(int64_t arg0,
|
| - int64_t arg1,
|
| - int64_t arg2,
|
| - int64_t arg3,
|
| - int64_t arg4,
|
| - int64_t arg5,
|
| - int64_t arg6,
|
| - int64_t arg7);
|
| +typedef ObjectPair (*SimulatorRuntimeCall)(int64_t arg0, int64_t arg1,
|
| + int64_t arg2, int64_t arg3,
|
| + int64_t arg4, int64_t arg5,
|
| + int64_t arg6, int64_t arg7,
|
| + int64_t arg8);
|
|
|
| typedef ObjectTriple (*SimulatorRuntimeTripleCall)(int64_t arg0, int64_t arg1,
|
| int64_t arg2, int64_t arg3,
|
| @@ -587,6 +584,19 @@ void Simulator::DoRuntimeCall(Instruction* instr) {
|
| FATAL("ALIGNMENT EXCEPTION");
|
| }
|
|
|
| + int64_t* stack_pointer = reinterpret_cast<int64_t*>(sp());
|
| +
|
| + const int64_t arg0 = xreg(0);
|
| + const int64_t arg1 = xreg(1);
|
| + const int64_t arg2 = xreg(2);
|
| + const int64_t arg3 = xreg(3);
|
| + const int64_t arg4 = xreg(4);
|
| + const int64_t arg5 = xreg(5);
|
| + const int64_t arg6 = xreg(6);
|
| + const int64_t arg7 = xreg(7);
|
| + const int64_t arg8 = stack_pointer[0];
|
| + STATIC_ASSERT(kMaxCParameters == 9);
|
| +
|
| switch (redirection->type()) {
|
| default:
|
| TraceSim("Type: Unknown.\n");
|
| @@ -604,15 +614,20 @@ void Simulator::DoRuntimeCall(Instruction* instr) {
|
| // We don't know how many arguments are being passed, but we can
|
| // pass 8 without touching the stack. They will be ignored by the
|
| // host function if they aren't used.
|
| - TraceSim("Arguments: "
|
| - "0x%016" PRIx64 ", 0x%016" PRIx64 ", "
|
| - "0x%016" PRIx64 ", 0x%016" PRIx64 ", "
|
| - "0x%016" PRIx64 ", 0x%016" PRIx64 ", "
|
| - "0x%016" PRIx64 ", 0x%016" PRIx64,
|
| - xreg(0), xreg(1), xreg(2), xreg(3),
|
| - xreg(4), xreg(5), xreg(6), xreg(7));
|
| - ObjectPair result = target(xreg(0), xreg(1), xreg(2), xreg(3),
|
| - xreg(4), xreg(5), xreg(6), xreg(7));
|
| + TraceSim(
|
| + "Arguments: "
|
| + "0x%016" PRIx64 ", 0x%016" PRIx64
|
| + ", "
|
| + "0x%016" PRIx64 ", 0x%016" PRIx64
|
| + ", "
|
| + "0x%016" PRIx64 ", 0x%016" PRIx64
|
| + ", "
|
| + "0x%016" PRIx64 ", 0x%016" PRIx64
|
| + ", "
|
| + "0x%016" PRIx64,
|
| + arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
|
| + ObjectPair result =
|
| + target(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
|
| TraceSim("Returned: {%p, %p}\n", static_cast<void*>(result.x),
|
| static_cast<void*>(result.y));
|
| #ifdef DEBUG
|
| @@ -634,16 +649,18 @@ void Simulator::DoRuntimeCall(Instruction* instr) {
|
| // host function if they aren't used.
|
| TraceSim(
|
| "Arguments: "
|
| - "0x%016" PRIx64 ", 0x%016" PRIx64 ", "
|
| - "0x%016" PRIx64 ", 0x%016" PRIx64 ", "
|
| - "0x%016" PRIx64 ", 0x%016" PRIx64 ", "
|
| + "0x%016" PRIx64 ", 0x%016" PRIx64
|
| + ", "
|
| + "0x%016" PRIx64 ", 0x%016" PRIx64
|
| + ", "
|
| + "0x%016" PRIx64 ", 0x%016" PRIx64
|
| + ", "
|
| "0x%016" PRIx64 ", 0x%016" PRIx64,
|
| - xreg(0), xreg(1), xreg(2), xreg(3), xreg(4), xreg(5), xreg(6),
|
| - xreg(7));
|
| + arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
|
| // Return location passed in x8.
|
| ObjectTriple* sim_result = reinterpret_cast<ObjectTriple*>(xreg(8));
|
| - ObjectTriple result = target(xreg(0), xreg(1), xreg(2), xreg(3), xreg(4),
|
| - xreg(5), xreg(6), xreg(7));
|
| + ObjectTriple result =
|
| + target(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
|
| TraceSim("Returned: {%p, %p, %p}\n", static_cast<void*>(result.x),
|
| static_cast<void*>(result.y), static_cast<void*>(result.z));
|
| #ifdef DEBUG
|
|
|