Changeset 246134 in webkit


Ignore:
Timestamp:
Jun 5, 2019 5:28:53 PM (5 years ago)
Author:
Justin Michaud
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/JavaScriptCore:

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

  • assembler/MacroAssemblerARM64.h:

(JSC::MacroAssemblerARM64::moveDoubleConditionally32):

Location:
trunk
Files:
3 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r246075 r246134  
     12019-06-05  Justin Michaud  <justin_michaud@apple.com>
     2
     3        WebAssembly: pow functions returns 0 when exponent 1.0 or -1.0
     4        https://bugs.webkit.org/show_bug.cgi?id=198106
     5
     6        Reviewed by Saam Barati.
     7
     8        * wasm/regress/selectf64.js: Added.
     9        * wasm/regress/selectf64.wasm: Added.
     10        * wasm/regress/selectf64.wat: Added.
     11
    1122019-06-04  Tadeu Zagallo  <tzagallo@apple.com>
    213
  • trunk/Source/JavaScriptCore/ChangeLog

    r246126 r246134  
     12019-06-05  Justin Michaud  <justin_michaud@apple.com>
     2
     3        WebAssembly: pow functions returns 0 when exponent 1.0 or -1.0
     4        https://bugs.webkit.org/show_bug.cgi?id=198106
     5
     6        Reviewed by Saam Barati.
     7
     8        Fix bug caused by using fcsel sX instead of fcsel dX on an f64 value in moveDoubleConditionally32.
     9
     10        * assembler/MacroAssemblerARM64.h:
     11        (JSC::MacroAssemblerARM64::moveDoubleConditionally32):
     12
    1132019-06-05  Alex Christensen  <achristensen@webkit.org>
    214
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h

    r242252 r246134  
    24602460    {
    24612461        m_assembler.cmp<32>(left, right);
    2462         m_assembler.fcsel<32>(dest, thenCase, elseCase, ARM64Condition(cond));
     2462        m_assembler.fcsel<64>(dest, thenCase, elseCase, ARM64Condition(cond));
    24632463    }
    24642464
  • trunk/Source/JavaScriptCore/assembler/testmasm.cpp

    r244694 r246134  
    936936}
    937937
     938void testMoveDoubleConditionally32()
     939{
     940#if CPU(X86_64) | CPU(ARM64)
     941    double arg1 = 0;
     942    double arg2 = 0;
     943    const double zero = -0;
     944
     945    const double chosenDouble = 6.00000059604644775390625;
     946    CHECK_EQ(static_cast<double>(static_cast<float>(chosenDouble)) == chosenDouble, false);
     947
     948    auto sel = compile([&] (CCallHelpers& jit) {
     949        jit.emitFunctionPrologue();
     950        jit.loadDouble(CCallHelpers::TrustedImmPtr(&zero), FPRInfo::returnValueFPR);
     951        jit.loadDouble(CCallHelpers::TrustedImmPtr(&arg1), FPRInfo::fpRegT1);
     952        jit.loadDouble(CCallHelpers::TrustedImmPtr(&arg2), FPRInfo::fpRegT2);
     953
     954        jit.move(MacroAssembler::TrustedImm32(-1), GPRInfo::regT0);
     955        jit.moveDoubleConditionally32(MacroAssembler::Equal, GPRInfo::regT0, GPRInfo::regT0, FPRInfo::fpRegT1, FPRInfo::fpRegT2, FPRInfo::returnValueFPR);
     956
     957        jit.emitFunctionEpilogue();
     958        jit.ret();
     959    });
     960
     961    arg1 = chosenDouble;
     962    arg2 = 43;
     963    CHECK_EQ(invoke<double>(sel), chosenDouble);
     964
     965    arg1 = 43;
     966    arg2 = chosenDouble;
     967    CHECK_EQ(invoke<double>(sel), 43.0);
     968
     969#endif
     970}
     971
     972void testMoveDoubleConditionally64()
     973{
     974#if CPU(X86_64) | CPU(ARM64)
     975    double arg1 = 0;
     976    double arg2 = 0;
     977    const double zero = -0;
     978
     979    const double chosenDouble = 6.00000059604644775390625;
     980    CHECK_EQ(static_cast<double>(static_cast<float>(chosenDouble)) == chosenDouble, false);
     981
     982    auto sel = compile([&] (CCallHelpers& jit) {
     983        jit.emitFunctionPrologue();
     984        jit.loadDouble(CCallHelpers::TrustedImmPtr(&zero), FPRInfo::returnValueFPR);
     985        jit.loadDouble(CCallHelpers::TrustedImmPtr(&arg1), FPRInfo::fpRegT1);
     986        jit.loadDouble(CCallHelpers::TrustedImmPtr(&arg2), FPRInfo::fpRegT2);
     987
     988        jit.move(MacroAssembler::TrustedImm64(-1), GPRInfo::regT0);
     989        jit.moveDoubleConditionally64(MacroAssembler::Equal, GPRInfo::regT0, GPRInfo::regT0, FPRInfo::fpRegT1, FPRInfo::fpRegT2, FPRInfo::returnValueFPR);
     990
     991        jit.emitFunctionEpilogue();
     992        jit.ret();
     993    });
     994
     995    arg1 = chosenDouble;
     996    arg2 = 43;
     997    CHECK_EQ(invoke<double>(sel), chosenDouble);
     998
     999    arg1 = 43;
     1000    arg2 = chosenDouble;
     1001    CHECK_EQ(invoke<double>(sel), 43.0);
     1002
     1003#endif
     1004}
     1005
    9381006#define RUN(test) do {                          \
    9391007        if (!shouldRun(#test))                  \
     
    10181086
    10191087    RUN(testByteSwap());
     1088    RUN(testMoveDoubleConditionally32());
     1089    RUN(testMoveDoubleConditionally64());
    10201090
    10211091    if (tasks.isEmpty())
Note: See TracChangeset for help on using the changeset viewer.