| Index: src/arm/simulator-arm.cc
|
| diff --git a/src/arm/simulator-arm.cc b/src/arm/simulator-arm.cc
|
| index 6e193885b046f5801e87ad843af0474a02fd03c3..75a75ecd0ae7c66362c7ca77e3e05ab90366aa44 100644
|
| --- a/src/arm/simulator-arm.cc
|
| +++ b/src/arm/simulator-arm.cc
|
| @@ -14,6 +14,7 @@
|
| #include "src/base/bits.h"
|
| #include "src/codegen.h"
|
| #include "src/disasm.h"
|
| +#include "src/runtime/runtime-utils.h"
|
|
|
| #if defined(USE_SIMULATOR)
|
|
|
| @@ -1717,6 +1718,10 @@ typedef int64_t (*SimulatorRuntimeCall)(int32_t arg0,
|
| int32_t arg4,
|
| int32_t arg5);
|
|
|
| +typedef ObjectTriple (*SimulatorRuntimeTripleCall)(int32_t arg0, int32_t arg1,
|
| + int32_t arg2, int32_t arg3,
|
| + int32_t arg4);
|
| +
|
| // These prototypes handle the four types of FP calls.
|
| typedef int64_t (*SimulatorRuntimeCompareCall)(double darg0, double darg1);
|
| typedef double (*SimulatorRuntimeFPFPCall)(double darg0, double darg1);
|
| @@ -1900,6 +1905,32 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
| reinterpret_cast<SimulatorRuntimeProfilingGetterCall>(
|
| external);
|
| target(arg0, arg1, Redirection::ReverseRedirection(arg2));
|
| + } else if (redirection->type() ==
|
| + ExternalReference::BUILTIN_CALL_TRIPLE) {
|
| + // builtin call returning ObjectTriple.
|
| + SimulatorRuntimeTripleCall target =
|
| + reinterpret_cast<SimulatorRuntimeTripleCall>(external);
|
| + if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
| + PrintF(
|
| + "Call to host triple returning runtime function %p "
|
| + "args %08x, %08x, %08x, %08x, %08x",
|
| + FUNCTION_ADDR(target), arg1, arg2, arg3, arg4, arg5);
|
| + if (!stack_aligned) {
|
| + PrintF(" with unaligned stack %08x\n", get_register(sp));
|
| + }
|
| + PrintF("\n");
|
| + }
|
| + CHECK(stack_aligned);
|
| + // arg0 is a hidden argument pointing to the return location, so don't
|
| + // pass it to the target function.
|
| + ObjectTriple result = target(arg1, arg2, arg3, arg4, arg5);
|
| + if (::v8::internal::FLAG_trace_sim) {
|
| + PrintF("Returned { %p, %p, %p }\n", result.x, result.y, result.z);
|
| + }
|
| + // Return is passed back in address pointed to by hidden first argument.
|
| + ObjectTriple* sim_result = reinterpret_cast<ObjectTriple*>(arg0);
|
| + *sim_result = result;
|
| + set_register(r0, arg0);
|
| } else {
|
| // builtin call.
|
| DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL);
|
|
|