| Index: src/mips/simulator-mips.cc | 
| diff --git a/src/mips/simulator-mips.cc b/src/mips/simulator-mips.cc | 
| index 18e78a5abda9921a281763a1d4899281c7b1ecfc..baf042c3b2191d0db70fd7e22b25228ff120f26f 100644 | 
| --- a/src/mips/simulator-mips.cc | 
| +++ b/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 = | 
|  |