Index: src/ppc/simulator-ppc.cc |
diff --git a/src/ppc/simulator-ppc.cc b/src/ppc/simulator-ppc.cc |
index 853b2076ba9e3247689d375bc88f2ead10c14681..0face8c5628b109d4592ffdd7b8f8608235cab20 100644 |
--- a/src/ppc/simulator-ppc.cc |
+++ b/src/ppc/simulator-ppc.cc |
@@ -3294,15 +3294,18 @@ void Simulator::ExecuteGeneric(Instruction* instr) { |
intptr_t ra_val = ra == 0 ? 0 : get_register(ra); |
int32_t val = ReadW(ra_val + offset, instr); |
float* fptr = reinterpret_cast<float*>(&val); |
-// Conversion using double changes sNan to qNan on ia32/x64 |
#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 |
- if (val == 0x7fa00000) { |
- set_d_register(frt, 0x7ff4000000000000); |
+ // Conversion using double changes sNan to qNan on ia32/x64 |
+ if ((val & 0x7f800000) == 0x7f800000) { |
+ int64_t dval = static_cast<int64_t>(val); |
+ dval = ((dval & 0xc0000000) << 32) | ((dval & 0x40000000) << 31) | |
+ ((dval & 0x40000000) << 30) | ((dval & 0x7fffffff) << 29) | 0x0; |
+ set_d_register(frt, dval); |
} else { |
-#endif |
set_d_register_from_double(frt, static_cast<double>(*fptr)); |
-#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 |
} |
+#else |
+ set_d_register_from_double(frt, static_cast<double>(*fptr)); |
#endif |
if (opcode == LFSU) { |
DCHECK(ra != 0); |
@@ -3334,17 +3337,19 @@ void Simulator::ExecuteGeneric(Instruction* instr) { |
intptr_t ra_val = ra == 0 ? 0 : get_register(ra); |
float frs_val = static_cast<float>(get_double_from_d_register(frs)); |
int32_t* p; |
-// Conversion using double changes sNan to qNan on ia32/x64 |
#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 |
- int64_t frs_isnan = get_d_register(frs); |
- int32_t frs_nan_single = 0x7fa00000; |
- if (frs_isnan == 0x7ff4000000000000) { |
- p = &frs_nan_single; |
+ // Conversion using double changes sNan to qNan on ia32/x64 |
+ int32_t sval = 0; |
+ int64_t dval = get_d_register(frs); |
+ if ((dval & 0x7ff0000000000000) == 0x7ff0000000000000) { |
+ sval = ((dval & 0xc000000000000000) >> 32) | |
+ ((dval & 0x07ffffffe0000000) >> 29); |
+ p = &sval; |
} else { |
-#endif |
p = reinterpret_cast<int32_t*>(&frs_val); |
-#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 |
} |
+#else |
+ p = reinterpret_cast<int32_t*>(&frs_val); |
#endif |
WriteW(ra_val + offset, *p, instr); |
if (opcode == STFSU) { |
@@ -3999,7 +4004,6 @@ void Simulator::ExecuteGeneric(Instruction* instr) { |
} |
default: { |
-printf("opcode = %x \n", instr->InstructionBits()); |
UNIMPLEMENTED(); |
break; |
} |