@@ -1641,9 +1641,25 @@ let isBarrier = 1, isBranch = 1, isIndirectBranch = 1, isTerminator = 1 in
1641
1641
def PseudoBRIND : Pseudo<(outs), (ins GPRJALR:$rs1, simm12:$imm12), []>,
1642
1642
PseudoInstExpansion<(JALR X0, GPR:$rs1, simm12:$imm12)>;
1643
1643
1644
+ let Predicates = [HasStdExtZicfilp],
1645
+ isBarrier = 1, isBranch = 1, isIndirectBranch = 1, isTerminator = 1 in {
1646
+ def PseudoBRINDNonX7 : Pseudo<(outs), (ins GPRJALRNonX7:$rs1, simm12:$imm12), []>,
1647
+ PseudoInstExpansion<(JALR X0, GPR:$rs1, simm12:$imm12)>;
1648
+ }
1649
+
1650
+ // For Zicfilp, need to avoid using X7/T2 for indirect branches which need
1651
+ // landing pad.
1652
+ let Predicates = [HasStdExtZicfilp] in {
1653
+ def : Pat<(brind GPRJALRNonX7:$rs1), (PseudoBRINDNonX7 GPRJALRNonX7:$rs1, 0)>;
1654
+ def : Pat<(brind (add GPRJALRNonX7:$rs1, simm12:$imm12)),
1655
+ (PseudoBRINDNonX7 GPRJALRNonX7:$rs1, simm12:$imm12)>;
1656
+ }
1657
+
1658
+ let Predicates = [NoStdExtZicfilp] in {
1644
1659
def : Pat<(brind GPRJALR:$rs1), (PseudoBRIND GPRJALR:$rs1, 0)>;
1645
1660
def : Pat<(brind (add GPRJALR:$rs1, simm12:$imm12)),
1646
1661
(PseudoBRIND GPRJALR:$rs1, simm12:$imm12)>;
1662
+ }
1647
1663
1648
1664
// PseudoCALLReg is a generic pseudo instruction for calls which will eventually
1649
1665
// expand to auipc and jalr while encoding, with any given register used as the
@@ -1673,10 +1689,16 @@ def : Pat<(riscv_call texternalsym:$func), (PseudoCALL texternalsym:$func)>;
1673
1689
def : Pat<(riscv_sret_glue), (SRET (XLenVT X0), (XLenVT X0))>;
1674
1690
def : Pat<(riscv_mret_glue), (MRET (XLenVT X0), (XLenVT X0))>;
1675
1691
1676
- let isCall = 1, Defs = [X1] in
1692
+ let isCall = 1, Defs = [X1] in {
1693
+ let Predicates = [NoStdExtZicfilp] in
1677
1694
def PseudoCALLIndirect : Pseudo<(outs), (ins GPRJALR:$rs1),
1678
1695
[(riscv_call GPRJALR:$rs1)]>,
1679
1696
PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>;
1697
+ let Predicates = [HasStdExtZicfilp] in
1698
+ def PseudoCALLIndirectNonX7 : Pseudo<(outs), (ins GPRJALRNonX7:$rs1),
1699
+ [(riscv_call GPRJALRNonX7:$rs1)]>,
1700
+ PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>;
1701
+ }
1680
1702
1681
1703
let isBarrier = 1, isReturn = 1, isTerminator = 1 in
1682
1704
def PseudoRET : Pseudo<(outs), (ins), [(riscv_ret_glue)]>,
@@ -1691,10 +1713,16 @@ def PseudoTAIL : Pseudo<(outs), (ins call_symbol:$dst), [],
1691
1713
"tail", "$dst">,
1692
1714
Sched<[WriteIALU, WriteJalr, ReadJalr]>;
1693
1715
1694
- let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [X2] in
1716
+ let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [X2] in {
1717
+ let Predicates = [NoStdExtZicfilp] in
1695
1718
def PseudoTAILIndirect : Pseudo<(outs), (ins GPRTC:$rs1),
1696
1719
[(riscv_tail GPRTC:$rs1)]>,
1697
1720
PseudoInstExpansion<(JALR X0, GPR:$rs1, 0)>;
1721
+ let Predicates = [HasStdExtZicfilp] in
1722
+ def PseudoTAILIndirectNonX7 : Pseudo<(outs), (ins GPRTCNonX7:$rs1),
1723
+ [(riscv_tail GPRTCNonX7:$rs1)]>,
1724
+ PseudoInstExpansion<(JALR X0, GPR:$rs1, 0)>;
1725
+ }
1698
1726
1699
1727
def : Pat<(riscv_tail (iPTR tglobaladdr:$dst)),
1700
1728
(PseudoTAIL tglobaladdr:$dst)>;
0 commit comments