[arm] Work-around sNaN issue in ARM simulator builds on IA-32.
authorBenedikt Meurer <bmeurer@chromium.org>
Wed, 21 Jan 2015 10:28:58 +0000 (11:28 +0100)
committerBenedikt Meurer <bmeurer@chromium.org>
Wed, 21 Jan 2015 10:29:12 +0000 (10:29 +0000)
R=jkummerow@chromium.org

Review URL: https://codereview.chromium.org/861093003

Cr-Commit-Position: refs/heads/master@{#26184}

src/arm/lithium-arm.h
src/arm/lithium-codegen-arm.cc

index 1920935..6f94100 100644 (file)
@@ -1360,6 +1360,7 @@ class LConstantD FINAL : public LTemplateInstruction<1, 0, 0> {
   DECLARE_HYDROGEN_ACCESSOR(Constant)
 
   double value() const { return hydrogen()->DoubleValue(); }
+  uint64_t bits() const { return hydrogen()->DoubleValueAsBits(); }
 };
 
 
index 939485d..26be241 100644 (file)
@@ -1904,6 +1904,20 @@ void LCodeGen::DoConstantS(LConstantS* instr) {
 void LCodeGen::DoConstantD(LConstantD* instr) {
   DCHECK(instr->result()->IsDoubleRegister());
   DwVfpRegister result = ToDoubleRegister(instr->result());
+#if V8_HOST_ARCH_IA32
+  // Need some crappy work-around for x87 sNaN -> qNaN breakage in simulator
+  // builds.
+  uint64_t bits = instr->bits();
+  if ((bits & V8_UINT64_C(0x7FF8000000000000)) ==
+      V8_UINT64_C(0x7FF0000000000000)) {
+    uint32_t lo = static_cast<uint32_t>(bits);
+    uint32_t hi = static_cast<uint32_t>(bits >> 32);
+    __ mov(ip, Operand(lo));
+    __ mov(scratch0(), Operand(hi));
+    __ vmov(result, ip, scratch0());
+    return;
+  }
+#endif
   double v = instr->value();
   __ Vmov(result, v, scratch0());
 }