Index: runtime/vm/simulator_arm.cc |
=================================================================== |
--- runtime/vm/simulator_arm.cc (revision 24294) |
+++ runtime/vm/simulator_arm.cc (working copy) |
@@ -2968,15 +2968,24 @@ |
int32_t parameter0, |
int32_t parameter1, |
int32_t parameter2, |
- int32_t parameter3) { |
+ int32_t parameter3, |
+ bool fp_return, |
+ bool fp_args) { |
// Save the SP register before the call so we can restore it. |
int32_t sp_before_call = get_register(SP); |
// Setup parameters. |
- set_register(R0, parameter0); |
- set_register(R1, parameter1); |
- set_register(R2, parameter2); |
- set_register(R3, parameter3); |
+ if (fp_args) { |
+ set_sregister(S0, bit_cast<float, int32_t>(parameter0)); |
+ set_sregister(S1, bit_cast<float, int32_t>(parameter1)); |
+ set_sregister(S2, bit_cast<float, int32_t>(parameter2)); |
+ set_sregister(S3, bit_cast<float, int32_t>(parameter3)); |
+ } else { |
+ set_register(R0, parameter0); |
+ set_register(R1, parameter1); |
+ set_register(R2, parameter2); |
+ set_register(R3, parameter3); |
+ } |
// Make sure the activation frames are properly aligned. |
int32_t stack_pointer = sp_before_call; |
@@ -3042,7 +3051,13 @@ |
// Restore the SP register and return R1:R0. |
set_register(SP, sp_before_call); |
- return Utils::LowHighTo64Bits(get_register(R0), get_register(R1)); |
+ int64_t return_value; |
+ if (fp_return) { |
+ return_value = bit_cast<int64_t, double>(get_dregister(D0)); |
+ } else { |
+ return_value = Utils::LowHighTo64Bits(get_register(R0), get_register(R1)); |
+ } |
+ return return_value; |
} |