diff options
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVInstrInfoSFB.td')
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfoSFB.td | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoSFB.td b/llvm/lib/Target/RISCV/RISCVInstrInfoSFB.td index 0114fbd..6563cc2 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoSFB.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoSFB.td @@ -10,7 +10,7 @@ // //===----------------------------------------------------------------------===// -let Predicates = [HasShortForwardBranchOpt], isSelect = 1, +let Predicates = [HasShortForwardBranchIALU], isSelect = 1, Constraints = "$dst = $falsev", isCommutable = 1, Size = 8 in { // This instruction moves $truev to $dst when the condition is true. It will // be expanded to control flow in RISCVExpandPseudoInsts. @@ -28,7 +28,7 @@ def PseudoCCMOVGPR : Pseudo<(outs GPR:$dst), // This should always expand to a branch+c.mv so the size is 6 or 4 if the // branch is compressible. -let Predicates = [HasConditionalMoveFusion, NoShortForwardBranchOpt], +let Predicates = [HasConditionalMoveFusion, NoShortForwardBranch], Constraints = "$dst = $falsev", isCommutable = 1, Size = 6 in { // This instruction moves $truev to $dst when the condition is true. It will // be expanded to control flow in RISCVExpandPseudoInsts. @@ -69,6 +69,17 @@ class SFBALU_ri let Constraints = "$dst = $falsev"; } +class SFBLUI + : Pseudo<(outs GPR:$dst), + (ins GPR:$lhs, GPR:$rhs, cond_code:$cc, GPR:$falsev, + uimm20_lui:$imm), []> { + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 0; + let Size = 8; + let Constraints = "$dst = $falsev"; +} + class SFBShift_ri : Pseudo<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs, cond_code:$cc, GPR:$falsev, GPR:$rs1, @@ -97,7 +108,7 @@ class SFBShiftW_ri // is true. Returns $falsev otherwise. Selected by optimizeSelect. // TODO: Can we use DefaultOperands on the regular binop to accomplish this more // like how ARM does predication? -let Predicates = [HasShortForwardBranchOpt] in { +let Predicates = [HasShortForwardBranchIALU] in { def PseudoCCADD : SFBALU_rr; def PseudoCCSUB : SFBALU_rr; def PseudoCCSLL : SFBALU_rr; @@ -112,6 +123,8 @@ def PseudoCCANDI : SFBALU_ri; def PseudoCCORI : SFBALU_ri; def PseudoCCXORI : SFBALU_ri; +def PseudoCCLUI : SFBLUI; + def PseudoCCSLLI : SFBShift_ri; def PseudoCCSRLI : SFBShift_ri; def PseudoCCSRAI : SFBShift_ri; @@ -135,11 +148,21 @@ def PseudoCCORN : SFBALU_rr; def PseudoCCXNOR : SFBALU_rr; } -let Predicates = [HasShortForwardBranchOpt] in +let Predicates = [HasShortForwardBranchIALU] in def : Pat<(XLenVT (abs GPR:$rs1)), (PseudoCCSUB (XLenVT GPR:$rs1), (XLenVT X0), /* COND_LT */ 2, (XLenVT GPR:$rs1), (XLenVT X0), (XLenVT GPR:$rs1))>; -let Predicates = [HasShortForwardBranchOpt, IsRV64] in +let Predicates = [HasShortForwardBranchIALU, IsRV64] in def : Pat<(sext_inreg (abs 33signbits_node:$rs1), i32), (PseudoCCSUBW (i64 GPR:$rs1), (i64 X0), /* COND_LT */ 2, (i64 GPR:$rs1), (i64 X0), (i64 GPR:$rs1))>; + +let Predicates = [HasShortForwardBranchIMinMax] in { +def PseudoCCMAX : SFBALU_rr; +def PseudoCCMIN : SFBALU_rr; +def PseudoCCMAXU : SFBALU_rr; +def PseudoCCMINU : SFBALU_rr; +} + +let Predicates = [HasShortForwardBranchIMul] in +def PseudoCCMUL : SFBALU_rr; |
