Title: [246134] trunk
Revision
246134
Author
justin_mich...@apple.com
Date
2019-06-05 17:28:53 -0700 (Wed, 05 Jun 2019)

Log Message

WebAssembly: pow functions returns 0 when exponent 1.0 or -1.0
https://bugs.webkit.org/show_bug.cgi?id=198106

Reviewed by Saam Barati.

JSTests:

* wasm/regress/selectf64.js: Added.
* wasm/regress/selectf64.wasm: Added.
* wasm/regress/selectf64.wat: Added.

Source/_javascript_Core:

Fix bug caused by using fcsel sX instead of fcsel dX on an f64 value in moveDoubleConditionally32.

* assembler/MacroAssemblerARM64.h:
(JSC::MacroAssemblerARM64::moveDoubleConditionally32):

Modified Paths

Added Paths

Diff

Modified: trunk/JSTests/ChangeLog (246133 => 246134)


--- trunk/JSTests/ChangeLog	2019-06-05 23:55:54 UTC (rev 246133)
+++ trunk/JSTests/ChangeLog	2019-06-06 00:28:53 UTC (rev 246134)
@@ -1,3 +1,14 @@
+2019-06-05  Justin Michaud  <justin_mich...@apple.com>
+
+        WebAssembly: pow functions returns 0 when exponent 1.0 or -1.0
+        https://bugs.webkit.org/show_bug.cgi?id=198106
+
+        Reviewed by Saam Barati.
+
+        * wasm/regress/selectf64.js: Added.
+        * wasm/regress/selectf64.wasm: Added.
+        * wasm/regress/selectf64.wat: Added.
+
 2019-06-04  Tadeu Zagallo  <tzaga...@apple.com>
 
         Argument elimination should check transitive dependents for interference

Added: trunk/JSTests/wasm/regress/selectf64.js (0 => 246134)


--- trunk/JSTests/wasm/regress/selectf64.js	                        (rev 0)
+++ trunk/JSTests/wasm/regress/selectf64.js	2019-06-06 00:28:53 UTC (rev 246134)
@@ -0,0 +1,4 @@
+import { test } from 'selectf64.wasm'
+import * as assert from '../assert.js';
+
+assert.eq(test(), 43)

Added: trunk/JSTests/wasm/regress/selectf64.wasm (0 => 246134)


--- trunk/JSTests/wasm/regress/selectf64.wasm	                        (rev 0)
+++ trunk/JSTests/wasm/regress/selectf64.wasm	2019-06-06 00:28:53 UTC (rev 246134)
@@ -0,0 +1,2 @@
+asm`|test
+DE@D\x80E@AA~F
\ No newline at end of file

Added: trunk/JSTests/wasm/regress/selectf64.wat (0 => 246134)


--- trunk/JSTests/wasm/regress/selectf64.wat	                        (rev 0)
+++ trunk/JSTests/wasm/regress/selectf64.wat	2019-06-06 00:28:53 UTC (rev 246134)
@@ -0,0 +1,9 @@
+(module
+  (func (export "test") (result f64)
+    f64.const 42
+    f64.const 43
+    i32.const -1
+    i32.const -2
+    i32.eq
+    select
+))

Modified: trunk/Source/_javascript_Core/ChangeLog (246133 => 246134)


--- trunk/Source/_javascript_Core/ChangeLog	2019-06-05 23:55:54 UTC (rev 246133)
+++ trunk/Source/_javascript_Core/ChangeLog	2019-06-06 00:28:53 UTC (rev 246134)
@@ -1,3 +1,15 @@
+2019-06-05  Justin Michaud  <justin_mich...@apple.com>
+
+        WebAssembly: pow functions returns 0 when exponent 1.0 or -1.0
+        https://bugs.webkit.org/show_bug.cgi?id=198106
+
+        Reviewed by Saam Barati.
+
+        Fix bug caused by using fcsel sX instead of fcsel dX on an f64 value in moveDoubleConditionally32.
+
+        * assembler/MacroAssemblerARM64.h:
+        (JSC::MacroAssemblerARM64::moveDoubleConditionally32):
+
 2019-06-05  Alex Christensen  <achristen...@webkit.org>
 
         Progress towards resurrecting Mac CMake build

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (246133 => 246134)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2019-06-05 23:55:54 UTC (rev 246133)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2019-06-06 00:28:53 UTC (rev 246134)
@@ -2459,7 +2459,7 @@
     void moveDoubleConditionally32(RelationalCondition cond, RegisterID left, RegisterID right, FPRegisterID thenCase, FPRegisterID elseCase, FPRegisterID dest)
     {
         m_assembler.cmp<32>(left, right);
-        m_assembler.fcsel<32>(dest, thenCase, elseCase, ARM64Condition(cond));
+        m_assembler.fcsel<64>(dest, thenCase, elseCase, ARM64Condition(cond));
     }
 
     void moveDoubleConditionally32(RelationalCondition cond, RegisterID left, TrustedImm32 right, FPRegisterID thenCase, FPRegisterID elseCase, FPRegisterID dest)

Modified: trunk/Source/_javascript_Core/assembler/testmasm.cpp (246133 => 246134)


--- trunk/Source/_javascript_Core/assembler/testmasm.cpp	2019-06-05 23:55:54 UTC (rev 246133)
+++ trunk/Source/_javascript_Core/assembler/testmasm.cpp	2019-06-06 00:28:53 UTC (rev 246134)
@@ -935,6 +935,74 @@
 #endif
 }
 
+void testMoveDoubleConditionally32()
+{
+#if CPU(X86_64) | CPU(ARM64)
+    double arg1 = 0;
+    double arg2 = 0;
+    const double zero = -0;
+
+    const double chosenDouble = 6.00000059604644775390625;
+    CHECK_EQ(static_cast<double>(static_cast<float>(chosenDouble)) == chosenDouble, false);
+
+    auto sel = compile([&] (CCallHelpers& jit) {
+        jit.emitFunctionPrologue();
+        jit.loadDouble(CCallHelpers::TrustedImmPtr(&zero), FPRInfo::returnValueFPR);
+        jit.loadDouble(CCallHelpers::TrustedImmPtr(&arg1), FPRInfo::fpRegT1);
+        jit.loadDouble(CCallHelpers::TrustedImmPtr(&arg2), FPRInfo::fpRegT2);
+
+        jit.move(MacroAssembler::TrustedImm32(-1), GPRInfo::regT0);
+        jit.moveDoubleConditionally32(MacroAssembler::Equal, GPRInfo::regT0, GPRInfo::regT0, FPRInfo::fpRegT1, FPRInfo::fpRegT2, FPRInfo::returnValueFPR);
+
+        jit.emitFunctionEpilogue();
+        jit.ret();
+    });
+
+    arg1 = chosenDouble;
+    arg2 = 43;
+    CHECK_EQ(invoke<double>(sel), chosenDouble);
+
+    arg1 = 43;
+    arg2 = chosenDouble;
+    CHECK_EQ(invoke<double>(sel), 43.0);
+
+#endif
+}
+
+void testMoveDoubleConditionally64()
+{
+#if CPU(X86_64) | CPU(ARM64)
+    double arg1 = 0;
+    double arg2 = 0;
+    const double zero = -0;
+
+    const double chosenDouble = 6.00000059604644775390625;
+    CHECK_EQ(static_cast<double>(static_cast<float>(chosenDouble)) == chosenDouble, false);
+
+    auto sel = compile([&] (CCallHelpers& jit) {
+        jit.emitFunctionPrologue();
+        jit.loadDouble(CCallHelpers::TrustedImmPtr(&zero), FPRInfo::returnValueFPR);
+        jit.loadDouble(CCallHelpers::TrustedImmPtr(&arg1), FPRInfo::fpRegT1);
+        jit.loadDouble(CCallHelpers::TrustedImmPtr(&arg2), FPRInfo::fpRegT2);
+
+        jit.move(MacroAssembler::TrustedImm64(-1), GPRInfo::regT0);
+        jit.moveDoubleConditionally64(MacroAssembler::Equal, GPRInfo::regT0, GPRInfo::regT0, FPRInfo::fpRegT1, FPRInfo::fpRegT2, FPRInfo::returnValueFPR);
+
+        jit.emitFunctionEpilogue();
+        jit.ret();
+    });
+
+    arg1 = chosenDouble;
+    arg2 = 43;
+    CHECK_EQ(invoke<double>(sel), chosenDouble);
+
+    arg1 = 43;
+    arg2 = chosenDouble;
+    CHECK_EQ(invoke<double>(sel), 43.0);
+
+#endif
+}
+
 #define RUN(test) do {                          \
         if (!shouldRun(#test))                  \
             break;                              \
@@ -1017,6 +1085,8 @@
 #endif // ENABLE(MASM_PROBE)
 
     RUN(testByteSwap());
+    RUN(testMoveDoubleConditionally32());
+    RUN(testMoveDoubleConditionally64());
 
     if (tasks.isEmpty())
         usage();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to