ARM: Fix handling of return value of compare_doubles in the simulator.
Review URL: http://codereview.chromium.org/6904124 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7722 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
4f41d895b0
commit
03459506e8
@ -1770,9 +1770,9 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|||||||
intptr_t external =
|
intptr_t external =
|
||||||
reinterpret_cast<intptr_t>(redirection->external_function());
|
reinterpret_cast<intptr_t>(redirection->external_function());
|
||||||
if (fp_call) {
|
if (fp_call) {
|
||||||
|
if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
||||||
SimulatorRuntimeFPCall target =
|
SimulatorRuntimeFPCall target =
|
||||||
reinterpret_cast<SimulatorRuntimeFPCall>(external);
|
reinterpret_cast<SimulatorRuntimeFPCall>(external);
|
||||||
if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
|
||||||
double dval0, dval1;
|
double dval0, dval1;
|
||||||
int32_t ival;
|
int32_t ival;
|
||||||
switch (redirection->type()) {
|
switch (redirection->type()) {
|
||||||
@ -1785,7 +1785,7 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|||||||
case ExternalReference::BUILTIN_FP_CALL:
|
case ExternalReference::BUILTIN_FP_CALL:
|
||||||
GetFpArgs(&dval0);
|
GetFpArgs(&dval0);
|
||||||
PrintF("Call to host function at %p with arg %f",
|
PrintF("Call to host function at %p with arg %f",
|
||||||
FUNCTION_ADDR(target), dval1);
|
FUNCTION_ADDR(target), dval0);
|
||||||
break;
|
break;
|
||||||
case ExternalReference::BUILTIN_FP_INT_CALL:
|
case ExternalReference::BUILTIN_FP_INT_CALL:
|
||||||
GetFpArgs(&dval0, &ival);
|
GetFpArgs(&dval0, &ival);
|
||||||
@ -1802,9 +1802,22 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|||||||
PrintF("\n");
|
PrintF("\n");
|
||||||
}
|
}
|
||||||
CHECK(stack_aligned);
|
CHECK(stack_aligned);
|
||||||
double result = target(arg0, arg1, arg2, arg3);
|
|
||||||
if (redirection->type() != ExternalReference::BUILTIN_COMPARE_CALL) {
|
if (redirection->type() != ExternalReference::BUILTIN_COMPARE_CALL) {
|
||||||
|
SimulatorRuntimeFPCall target =
|
||||||
|
reinterpret_cast<SimulatorRuntimeFPCall>(external);
|
||||||
|
double result = target(arg0, arg1, arg2, arg3);
|
||||||
SetFpResult(result);
|
SetFpResult(result);
|
||||||
|
} else {
|
||||||
|
SimulatorRuntimeCall target =
|
||||||
|
reinterpret_cast<SimulatorRuntimeCall>(external);
|
||||||
|
int64_t result = target(arg0, arg1, arg2, arg3, arg4, arg5);
|
||||||
|
int32_t lo_res = static_cast<int32_t>(result);
|
||||||
|
int32_t hi_res = static_cast<int32_t>(result >> 32);
|
||||||
|
if (::v8::internal::FLAG_trace_sim) {
|
||||||
|
PrintF("Returned %08x\n", lo_res);
|
||||||
|
}
|
||||||
|
set_register(r0, lo_res);
|
||||||
|
set_register(r1, hi_res);
|
||||||
}
|
}
|
||||||
} else if (redirection->type() == ExternalReference::DIRECT_API_CALL) {
|
} else if (redirection->type() == ExternalReference::DIRECT_API_CALL) {
|
||||||
SimulatorRuntimeDirectApiCall target =
|
SimulatorRuntimeDirectApiCall target =
|
||||||
|
Loading…
Reference in New Issue
Block a user