Changeset 224843 in webkit


Ignore:
Timestamp:
Nov 14, 2017 1:53:41 PM (6 years ago)
Author:
guijemont@igalia.com
Message:

REGRESSION(r224623) [MIPS] branchTruncateDoubleToInt32() doesn't set return register when branching
https://bugs.webkit.org/show_bug.cgi?id=179563

Reviewed by Carlos Alberto Lopez Perez.

When run with BranchIfTruncateSuccessful,
branchTruncateDoubleToInt32() should set the destination register
before branching.
This change also removes branchTruncateDoubleToUInt32() as it is
deprecated (see r160205), merges branchOnTruncateResult() into
branchTruncateDoubleToInt32() and adds test cases in testmasm.

  • assembler/MacroAssemblerMIPS.h:

(JSC::MacroAssemblerMIPS::branchOnTruncateResult): Deleted.
(JSC::MacroAssemblerMIPS::branchTruncateDoubleToInt32):
Properly set dest before branching.
(JSC::MacroAssemblerMIPS::branchTruncateDoubleToUInt32): Deleted.

  • assembler/testmasm.cpp:

(JSC::testBranchTruncateDoubleToInt32):
(JSC::run):
Add tests for branchTruncateDoubleToInt32().

Location:
trunk/Source/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r224841 r224843  
     12017-11-14  Guillaume Emont  <guijemont@igalia.com>
     2
     3        REGRESSION(r224623) [MIPS] branchTruncateDoubleToInt32() doesn't set return register when branching
     4        https://bugs.webkit.org/show_bug.cgi?id=179563
     5
     6        Reviewed by Carlos Alberto Lopez Perez.
     7
     8        When run with BranchIfTruncateSuccessful,
     9        branchTruncateDoubleToInt32() should set the destination register
     10        before branching.
     11        This change also removes branchTruncateDoubleToUInt32() as it is
     12        deprecated (see r160205), merges branchOnTruncateResult() into
     13        branchTruncateDoubleToInt32() and adds test cases in testmasm.
     14
     15        * assembler/MacroAssemblerMIPS.h:
     16        (JSC::MacroAssemblerMIPS::branchOnTruncateResult): Deleted.
     17        (JSC::MacroAssemblerMIPS::branchTruncateDoubleToInt32):
     18        Properly set dest before branching.
     19        (JSC::MacroAssemblerMIPS::branchTruncateDoubleToUInt32): Deleted.
     20        * assembler/testmasm.cpp:
     21        (JSC::testBranchTruncateDoubleToInt32):
     22        (JSC::run):
     23        Add tests for branchTruncateDoubleToInt32().
     24
    1252017-11-14  Daniel Bates  <dabates@apple.com>
    226
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h

    r224623 r224843  
    29552955    enum BranchTruncateType { BranchIfTruncateFailed, BranchIfTruncateSuccessful };
    29562956
    2957     Jump branchOnTruncateResult(BranchTruncateType branchType)
    2958     {
     2957    Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed)
     2958    {
     2959        m_assembler.truncwd(fpTempRegister, src);
    29592960        m_assembler.cfc1(dataTempRegister, MIPSRegisters::fcsr);
     2961        m_assembler.mfc1(dest, fpTempRegister);
    29602962        and32(TrustedImm32(MIPSAssembler::FP_CAUSE_INVALID_OPERATION), dataTempRegister);
    29612963        return branch32(branchType == BranchIfTruncateFailed ? NotEqual : Equal, dataTempRegister, MIPSRegisters::zero);
    2962     }
    2963 
    2964     Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed)
    2965     {
    2966         m_assembler.truncwd(fpTempRegister, src);
    2967         Jump truncateResult = branchOnTruncateResult(branchType);
    2968         m_assembler.mfc1(dest, fpTempRegister);
    2969         return truncateResult;
    2970     }
    2971 
    2972     Jump branchTruncateDoubleToUint32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed)
    2973     {
    2974         m_assembler.truncwd(fpTempRegister, src);
    2975         Jump truncateResult = branchOnTruncateResult(branchType);
    2976         m_assembler.mfc1(dest, fpTempRegister);
    2977         return truncateResult;
    29782964    }
    29792965
  • trunk/Source/JavaScriptCore/assembler/testmasm.cpp

    r222058 r224843  
    3333#include "LinkBuffer.h"
    3434#include "ProbeContext.h"
     35#include <limits>
    3536#include <wtf/Compiler.h>
    3637#include <wtf/DataLog.h>
     
    170171    }), 42);
    171172}
     173
     174// branchTruncateDoubleToInt32(), when encountering Infinity, -Infinity or a
     175// Nan, should either yield 0 in dest or fail.
     176void testBranchTruncateDoubleToInt32(double val, int32_t expected)
     177{
     178    const uint64_t valAsUInt = *reinterpret_cast<uint64_t*>(&val);
     179#if CPU(BIG_ENDIAN)
     180    const bool isBigEndian = true;
     181#else
     182    const bool isBigEndian = false;
     183#endif
     184    CHECK_EQ(compileAndRun<int>([&] (CCallHelpers& jit) {
     185        jit.emitFunctionPrologue();
     186        jit.subPtr(CCallHelpers::TrustedImm32(8), MacroAssembler::stackPointerRegister);
     187        if (isBigEndian) {
     188            jit.store32(CCallHelpers::TrustedImm32(valAsUInt >> 32),
     189                MacroAssembler::stackPointerRegister);
     190            jit.store32(CCallHelpers::TrustedImm32(valAsUInt & 0xffffffff),
     191                MacroAssembler::Address(MacroAssembler::stackPointerRegister, 4));
     192        } else {
     193            jit.store32(CCallHelpers::TrustedImm32(valAsUInt & 0xffffffff),
     194                MacroAssembler::stackPointerRegister);
     195            jit.store32(CCallHelpers::TrustedImm32(valAsUInt >> 32),
     196                MacroAssembler::Address(MacroAssembler::stackPointerRegister, 4));
     197        }
     198        jit.loadDouble(MacroAssembler::stackPointerRegister, FPRInfo::fpRegT0);
     199
     200        MacroAssembler::Jump done;
     201        done = jit.branchTruncateDoubleToInt32(FPRInfo::fpRegT0, GPRInfo::returnValueGPR, MacroAssembler::BranchIfTruncateSuccessful);
     202
     203        jit.move(CCallHelpers::TrustedImm32(0), GPRInfo::returnValueGPR);
     204
     205        done.link(&jit);
     206        jit.addPtr(CCallHelpers::TrustedImm32(8), MacroAssembler::stackPointerRegister);
     207        jit.emitFunctionEpilogue();
     208        jit.ret();
     209    }), expected);
     210}
     211
    172212
    173213#if ENABLE(MASM_PROBE)
     
    691731
    692732    RUN(testSimple());
     733    RUN(testBranchTruncateDoubleToInt32(0, 0));
     734    RUN(testBranchTruncateDoubleToInt32(42, 42));
     735    RUN(testBranchTruncateDoubleToInt32(42.7, 42));
     736    RUN(testBranchTruncateDoubleToInt32(-1234, -1234));
     737    RUN(testBranchTruncateDoubleToInt32(-1234.56, -1234));
     738    RUN(testBranchTruncateDoubleToInt32(std::numeric_limits<double>::infinity(), 0));
     739    RUN(testBranchTruncateDoubleToInt32(-std::numeric_limits<double>::infinity(), 0));
     740    RUN(testBranchTruncateDoubleToInt32(std::numeric_limits<double>::quiet_NaN(), 0));
     741    RUN(testBranchTruncateDoubleToInt32(std::numeric_limits<double>::signaling_NaN(), 0));
     742    RUN(testBranchTruncateDoubleToInt32(std::numeric_limits<double>::max(), 0));
     743    RUN(testBranchTruncateDoubleToInt32(-std::numeric_limits<double>::max(), 0));
     744    // We run this last one to make sure that we don't use flags that were not
     745    // reset to check a conversion result
     746    RUN(testBranchTruncateDoubleToInt32(123, 123));
    693747
    694748#if ENABLE(MASM_PROBE)
Note: See TracChangeset for help on using the changeset viewer.