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();