Changeset 287468 in webkit
- Timestamp:
- Dec 28, 2021, 2:14:42 AM (4 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r287467 r287468 1 2021-12-28 Zan Dobersek <zdobersek@igalia.com> 2 3 [RISCV64] Add MacroAssemblerRISCV64 operations for floating-point branches 4 https://bugs.webkit.org/show_bug.cgi?id=234631 5 6 Reviewed by Yusuke Suzuki. 7 8 Add the floating-point branching operation implementations in 9 MacroAssemblerRISCV64. Unordered status of values is determined through 10 the fclass instruction and then handled as appropriate for the desired 11 condition. 12 13 * assembler/MacroAssemblerRISCV64.h: 14 (JSC::MacroAssemblerRISCV64::branchFloat): 15 (JSC::MacroAssemblerRISCV64::branchDouble): 16 (JSC::MacroAssemblerRISCV64::branchDoubleNonZero): 17 (JSC::MacroAssemblerRISCV64::branchDoubleZeroOrNaN): 18 (JSC::MacroAssemblerRISCV64::branchTruncateDoubleToInt32): 19 (JSC::MacroAssemblerRISCV64::branchConvertDoubleToInt32): 20 (JSC::MacroAssemblerRISCV64::branchFP): 21 1 22 2021-12-28 Zan Dobersek <zdobersek@igalia.com> 2 23 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerRISCV64.h
r287467 r287468 2094 2094 } 2095 2095 2096 MACRO_ASSEMBLER_RISCV64_TEMPLATED_NOOP_METHOD_WITH_RETURN(branchFloat, Jump); 2097 MACRO_ASSEMBLER_RISCV64_TEMPLATED_NOOP_METHOD_WITH_RETURN(branchDouble, Jump); 2098 MACRO_ASSEMBLER_RISCV64_TEMPLATED_NOOP_METHOD_WITH_RETURN(branchDoubleNonZero, Jump); 2099 MACRO_ASSEMBLER_RISCV64_TEMPLATED_NOOP_METHOD_WITH_RETURN(branchDoubleZeroOrNaN, Jump); 2096 Jump branchFloat(DoubleCondition cond, FPRegisterID lhs, FPRegisterID rhs) 2097 { 2098 return branchFP<32>(cond, lhs, rhs); 2099 } 2100 2101 Jump branchDouble(DoubleCondition cond, FPRegisterID lhs, FPRegisterID rhs) 2102 { 2103 return branchFP<64>(cond, lhs, rhs); 2104 } 2105 2106 Jump branchDoubleNonZero(FPRegisterID reg, FPRegisterID) 2107 { 2108 m_assembler.fcvtInsn<RISCV64Assembler::FCVTType::D, RISCV64Assembler::FCVTType::L>(fpTempRegister, RISCV64Registers::zero); 2109 return branchFP<64>(DoubleNotEqualAndOrdered, reg, fpTempRegister); 2110 } 2111 2112 Jump branchDoubleZeroOrNaN(FPRegisterID reg, FPRegisterID) 2113 { 2114 m_assembler.fcvtInsn<RISCV64Assembler::FCVTType::D, RISCV64Assembler::FCVTType::L>(fpTempRegister, RISCV64Registers::zero); 2115 return branchFP<64>(DoubleEqualOrUnordered, reg, fpTempRegister); 2116 } 2100 2117 2101 2118 enum BranchTruncateType { BranchIfTruncateFailed, BranchIfTruncateSuccessful }; 2102 MACRO_ASSEMBLER_RISCV64_TEMPLATED_NOOP_METHOD_WITH_RETURN(branchTruncateDoubleToInt32, Jump); 2103 2104 MACRO_ASSEMBLER_RISCV64_TEMPLATED_NOOP_METHOD(branchConvertDoubleToInt32); 2119 Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed) 2120 { 2121 auto temp = temps<Data>(); 2122 m_assembler.fcvtInsn<RISCV64Assembler::FPRoundingMode::RTZ, RISCV64Assembler::FCVTType::L, RISCV64Assembler::FCVTType::D>(dest, src); 2123 m_assembler.signExtend<32>(temp.data(), dest); 2124 m_assembler.xorInsn(temp.data(), dest, temp.data()); 2125 if (branchType == BranchIfTruncateFailed) 2126 m_assembler.sltuInsn(temp.data(), RISCV64Registers::zero, temp.data()); 2127 else 2128 m_assembler.sltiuInsn(temp.data(), temp.data(), Imm::I<1>()); 2129 2130 m_assembler.maskRegister<32>(dest); 2131 return makeBranch(NotEqual, temp.data(), RISCV64Registers::zero); 2132 } 2133 2134 void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID, bool negZeroCheck = true) 2135 { 2136 auto temp = temps<Data>(); 2137 m_assembler.fcvtInsn<RISCV64Assembler::FCVTType::W, RISCV64Assembler::FCVTType::D>(temp.data(), src); 2138 m_assembler.fcvtInsn<RISCV64Assembler::FCVTType::D, RISCV64Assembler::FCVTType::W>(fpTempRegister, temp.data()); 2139 m_assembler.maskRegister<32>(dest, temp.data()); 2140 failureCases.append(branchFP<64>(DoubleNotEqualOrUnordered, src, fpTempRegister)); 2141 2142 if (negZeroCheck) { 2143 Jump resultIsNonZero = makeBranch(NotEqual, temp.data(), RISCV64Registers::zero); 2144 m_assembler.fmvInsn<RISCV64Assembler::FMVType::X, RISCV64Assembler::FMVType::D>(temp.data(), src); 2145 failureCases.append(makeBranch(LessThan, temp.data(), RISCV64Registers::zero)); 2146 resultIsNonZero.link(this); 2147 } 2148 } 2105 2149 2106 2150 Call call(PtrTag) … … 2816 2860 } 2817 2861 2862 template<unsigned fpSize, bool invert = false> 2863 Jump branchFP(DoubleCondition cond, FPRegisterID lhs, FPRegisterID rhs) 2864 { 2865 auto temp = temps<Data>(); 2866 JumpList unorderedJump; 2867 2868 m_assembler.fclassInsn<fpSize>(temp.data(), lhs); 2869 m_assembler.andiInsn(temp.data(), temp.data(), Imm::I<0b1100000000>()); 2870 unorderedJump.append(makeBranch(NotEqual, temp.data(), RISCV64Registers::zero)); 2871 2872 m_assembler.fclassInsn<fpSize>(temp.data(), rhs); 2873 m_assembler.andiInsn(temp.data(), temp.data(), Imm::I<0b1100000000>()); 2874 unorderedJump.append(makeBranch(NotEqual, temp.data(), RISCV64Registers::zero)); 2875 2876 switch (cond) { 2877 case DoubleEqualAndOrdered: 2878 case DoubleEqualOrUnordered: 2879 m_assembler.feqInsn<fpSize>(temp.data(), lhs, rhs); 2880 break; 2881 case DoubleNotEqualAndOrdered: 2882 case DoubleNotEqualOrUnordered: 2883 m_assembler.feqInsn<fpSize>(temp.data(), lhs, rhs); 2884 m_assembler.xoriInsn(temp.data(), temp.data(), Imm::I<1>()); 2885 break; 2886 case DoubleGreaterThanAndOrdered: 2887 case DoubleGreaterThanOrUnordered: 2888 m_assembler.fltInsn<fpSize>(temp.data(), rhs, lhs); 2889 break; 2890 case DoubleGreaterThanOrEqualAndOrdered: 2891 case DoubleGreaterThanOrEqualOrUnordered: 2892 m_assembler.fleInsn<fpSize>(temp.data(), rhs, lhs); 2893 break; 2894 case DoubleLessThanAndOrdered: 2895 case DoubleLessThanOrUnordered: 2896 m_assembler.fltInsn<fpSize>(temp.data(), lhs, rhs); 2897 break; 2898 case DoubleLessThanOrEqualAndOrdered: 2899 case DoubleLessThanOrEqualOrUnordered: 2900 m_assembler.fleInsn<fpSize>(temp.data(), lhs, rhs); 2901 break; 2902 } 2903 2904 Jump end = jump(); 2905 unorderedJump.link(this); 2906 2907 switch (cond) { 2908 case DoubleEqualAndOrdered: 2909 case DoubleNotEqualAndOrdered: 2910 case DoubleGreaterThanAndOrdered: 2911 case DoubleGreaterThanOrEqualAndOrdered: 2912 case DoubleLessThanAndOrdered: 2913 case DoubleLessThanOrEqualAndOrdered: 2914 m_assembler.addiInsn(temp.data(), RISCV64Registers::zero, Imm::I<0>()); 2915 break; 2916 case DoubleEqualOrUnordered: 2917 case DoubleNotEqualOrUnordered: 2918 case DoubleGreaterThanOrUnordered: 2919 case DoubleGreaterThanOrEqualOrUnordered: 2920 case DoubleLessThanOrUnordered: 2921 case DoubleLessThanOrEqualOrUnordered: 2922 m_assembler.addiInsn(temp.data(), RISCV64Registers::zero, Imm::I<1>()); 2923 break; 2924 } 2925 2926 end.link(this); 2927 return makeBranch(invert ? Equal : NotEqual, temp.data(), RISCV64Registers::zero); 2928 } 2929 2818 2930 template<unsigned fpSize, RISCV64Assembler::FPRoundingMode RM> 2819 2931 void roundFP(FPRegisterID src, FPRegisterID dest)
Note:
See TracChangeset
for help on using the changeset viewer.