diff options
Diffstat (limited to 'deps/v8/src/mips/simulator-mips.cc')
-rw-r--r-- | deps/v8/src/mips/simulator-mips.cc | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/deps/v8/src/mips/simulator-mips.cc b/deps/v8/src/mips/simulator-mips.cc index 18e78a5abd..d8a39ab30c 100644 --- a/deps/v8/src/mips/simulator-mips.cc +++ b/deps/v8/src/mips/simulator-mips.cc @@ -1387,12 +1387,19 @@ typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); // This signature supports direct call in to API function native callback // (refer to InvocationCallback in v8.h). +// NOTE: the O32 abi requires a0 to hold a special pointer when returning a +// struct from the function (which is currently the case). This means we pass +// the first argument in a1 instead of a0. typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectApiCall)(int32_t arg0); +// Here, we pass the first argument in a0, because this function +// does not return a struct. typedef void (*SimulatorRuntimeDirectApiCallNew)(int32_t arg0); // This signature supports direct call to accessor getter callback. +// See comment at SimulatorRuntimeDirectApiCall. typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectGetterCall)(int32_t arg0, int32_t arg1); +// See comment at SimulatorRuntimeDirectApiCallNew. typedef void (*SimulatorRuntimeDirectGetterCallNew)(int32_t arg0, int32_t arg1); @@ -1542,40 +1549,50 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { } else if ( redirection->type() == ExternalReference::DIRECT_API_CALL || redirection->type() == ExternalReference::DIRECT_API_CALL_NEW) { - // See DirectCEntryStub::GenerateCall for explanation of register usage. - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x\n", - reinterpret_cast<void*>(external), arg1); - } if (redirection->type() == ExternalReference::DIRECT_API_CALL) { + // See comment at type definition of SimulatorRuntimeDirectApiCall + // for explanation of register usage. + if (::v8::internal::FLAG_trace_sim) { + PrintF("Call to host function at %p args %08x\n", + reinterpret_cast<void*>(external), arg1); + } SimulatorRuntimeDirectApiCall target = reinterpret_cast<SimulatorRuntimeDirectApiCall>(external); v8::Handle<v8::Value> result = target(arg1); *(reinterpret_cast<int*>(arg0)) = reinterpret_cast<int32_t>(*result); set_register(v0, arg0); } else { + if (::v8::internal::FLAG_trace_sim) { + PrintF("Call to host function at %p args %08x\n", + reinterpret_cast<void*>(external), arg0); + } SimulatorRuntimeDirectApiCallNew target = reinterpret_cast<SimulatorRuntimeDirectApiCallNew>(external); - target(arg1); + target(arg0); } } else if ( redirection->type() == ExternalReference::DIRECT_GETTER_CALL || redirection->type() == ExternalReference::DIRECT_GETTER_CALL_NEW) { - // See DirectCEntryStub::GenerateCall for explanation of register usage. - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x %08x\n", - reinterpret_cast<void*>(external), arg1, arg2); - } if (redirection->type() == ExternalReference::DIRECT_GETTER_CALL) { + // See comment at type definition of SimulatorRuntimeDirectGetterCall + // for explanation of register usage. + if (::v8::internal::FLAG_trace_sim) { + PrintF("Call to host function at %p args %08x %08x\n", + reinterpret_cast<void*>(external), arg1, arg2); + } SimulatorRuntimeDirectGetterCall target = reinterpret_cast<SimulatorRuntimeDirectGetterCall>(external); v8::Handle<v8::Value> result = target(arg1, arg2); *(reinterpret_cast<int*>(arg0)) = reinterpret_cast<int32_t>(*result); set_register(v0, arg0); } else { + if (::v8::internal::FLAG_trace_sim) { + PrintF("Call to host function at %p args %08x %08x\n", + reinterpret_cast<void*>(external), arg0, arg1); + } SimulatorRuntimeDirectGetterCallNew target = reinterpret_cast<SimulatorRuntimeDirectGetterCallNew>(external); - target(arg1, arg2); + target(arg0, arg1); } } else { SimulatorRuntimeCall target = @@ -2074,7 +2091,7 @@ void Simulator::DecodeTypeRegister(Instruction* instr) { set_fpu_register_double(fd_reg, fs / ft); break; case ABS_D: - set_fpu_register_double(fd_reg, fs < 0 ? -fs : fs); + set_fpu_register_double(fd_reg, fabs(fs)); break; case MOV_D: set_fpu_register_double(fd_reg, fs); |