Changeset 287468 in webkit


Ignore:
Timestamp:
Dec 28, 2021, 2:14:42 AM (4 years ago)
Author:
commit-queue@webkit.org
Message:

[RISCV64] Add MacroAssemblerRISCV64 operations for floating-point branches
https://bugs.webkit.org/show_bug.cgi?id=234631

Patch by Zan Dobersek <zdobersek@igalia.com> on 2021-12-28
Reviewed by Yusuke Suzuki.

Add the floating-point branching operation implementations in
MacroAssemblerRISCV64. Unordered status of values is determined through
the fclass instruction and then handled as appropriate for the desired
condition.

  • assembler/MacroAssemblerRISCV64.h:

(JSC::MacroAssemblerRISCV64::branchFloat):
(JSC::MacroAssemblerRISCV64::branchDouble):
(JSC::MacroAssemblerRISCV64::branchDoubleNonZero):
(JSC::MacroAssemblerRISCV64::branchDoubleZeroOrNaN):
(JSC::MacroAssemblerRISCV64::branchTruncateDoubleToInt32):
(JSC::MacroAssemblerRISCV64::branchConvertDoubleToInt32):
(JSC::MacroAssemblerRISCV64::branchFP):

Location:
trunk/Source/JavaScriptCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r287467 r287468  
     12021-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
    1222021-12-28  Zan Dobersek  <zdobersek@igalia.com>
    223
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerRISCV64.h

    r287467 r287468  
    20942094    }
    20952095
    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    }
    21002117
    21012118    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    }
    21052149
    21062150    Call call(PtrTag)
     
    28162860    }
    28172861
     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
    28182930    template<unsigned fpSize, RISCV64Assembler::FPRoundingMode RM>
    28192931    void roundFP(FPRegisterID src, FPRegisterID dest)
Note: See TracChangeset for help on using the changeset viewer.