Ignore:
Timestamp:
Nov 14, 2017, 1:53:41 PM (8 years ago)
Author:
[email protected]
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().

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.