Changeset 224843 in webkit
- Timestamp:
- Nov 14, 2017 1:53:41 PM (6 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r224841 r224843 1 2017-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 1 25 2017-11-14 Daniel Bates <dabates@apple.com> 2 26 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r224623 r224843 2955 2955 enum BranchTruncateType { BranchIfTruncateFailed, BranchIfTruncateSuccessful }; 2956 2956 2957 Jump branchOnTruncateResult(BranchTruncateType branchType) 2958 { 2957 Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed) 2958 { 2959 m_assembler.truncwd(fpTempRegister, src); 2959 2960 m_assembler.cfc1(dataTempRegister, MIPSRegisters::fcsr); 2961 m_assembler.mfc1(dest, fpTempRegister); 2960 2962 and32(TrustedImm32(MIPSAssembler::FP_CAUSE_INVALID_OPERATION), dataTempRegister); 2961 2963 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;2978 2964 } 2979 2965 -
trunk/Source/JavaScriptCore/assembler/testmasm.cpp
r222058 r224843 33 33 #include "LinkBuffer.h" 34 34 #include "ProbeContext.h" 35 #include <limits> 35 36 #include <wtf/Compiler.h> 36 37 #include <wtf/DataLog.h> … … 170 171 }), 42); 171 172 } 173 174 // branchTruncateDoubleToInt32(), when encountering Infinity, -Infinity or a 175 // Nan, should either yield 0 in dest or fail. 176 void 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 172 212 173 213 #if ENABLE(MASM_PROBE) … … 691 731 692 732 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)); 693 747 694 748 #if ENABLE(MASM_PROBE)
Note: See TracChangeset
for help on using the changeset viewer.