@@ -1448,13 +1448,29 @@ let isBarrier = 1, isBranch = 1, isTerminator = 1 in
1448
1448
def PseudoBR : Pseudo<(outs), (ins simm21_lsb0_jal:$imm20), [(br bb:$imm20)]>,
1449
1449
PseudoInstExpansion<(JAL X0, simm21_lsb0_jal:$imm20)>;
1450
1450
1451
- let isBarrier = 1, isBranch = 1, isIndirectBranch = 1, isTerminator = 1 in
1451
+ let Predicates = [NoStdExtZicfilp],
1452
+ isBarrier = 1, isBranch = 1, isIndirectBranch = 1, isTerminator = 1 in
1452
1453
def PseudoBRIND : Pseudo<(outs), (ins GPRJALR:$rs1, simm12:$imm12), []>,
1453
1454
PseudoInstExpansion<(JALR X0, GPR:$rs1, simm12:$imm12)>;
1454
1455
1456
+ let Predicates = [HasStdExtZicfilp],
1457
+ isBarrier = 1, isBranch = 1, isIndirectBranch = 1, isTerminator = 1 in
1458
+ def PseudoBRINDNonX7 : Pseudo<(outs), (ins GPRJALRNonX7:$rs1, simm12:$imm12), []>,
1459
+ PseudoInstExpansion<(JALR X0, GPR:$rs1, simm12:$imm12)>;
1460
+
1461
+ // For Zicfilp, need to avoid using X7/T2 for indirect branches which need
1462
+ // landing pad.
1463
+ let Predicates = [HasStdExtZicfilp] in {
1464
+ def : Pat<(brind GPRJALRNonX7:$rs1), (PseudoBRINDNonX7 GPRJALRNonX7:$rs1, 0)>;
1465
+ def : Pat<(brind (add GPRJALRNonX7:$rs1, simm12:$imm12)),
1466
+ (PseudoBRINDNonX7 GPRJALRNonX7:$rs1, simm12:$imm12)>;
1467
+ }
1468
+
1469
+ let Predicates = [NoStdExtZicfilp] in {
1455
1470
def : Pat<(brind GPRJALR:$rs1), (PseudoBRIND GPRJALR:$rs1, 0)>;
1456
1471
def : Pat<(brind (add GPRJALR:$rs1, simm12:$imm12)),
1457
1472
(PseudoBRIND GPRJALR:$rs1, simm12:$imm12)>;
1473
+ }
1458
1474
1459
1475
// PseudoCALLReg is a generic pseudo instruction for calls which will eventually
1460
1476
// expand to auipc and jalr while encoding, with any given register used as the
@@ -1484,10 +1500,16 @@ def : Pat<(riscv_call texternalsym:$func), (PseudoCALL texternalsym:$func)>;
1484
1500
def : Pat<(riscv_sret_glue), (SRET (XLenVT X0), (XLenVT X0))>;
1485
1501
def : Pat<(riscv_mret_glue), (MRET (XLenVT X0), (XLenVT X0))>;
1486
1502
1487
- let isCall = 1, Defs = [X1] in
1503
+ let isCall = 1, Defs = [X1] in {
1504
+ let Predicates = [NoStdExtZicfilp] in
1488
1505
def PseudoCALLIndirect : Pseudo<(outs), (ins GPRJALR:$rs1),
1489
1506
[(riscv_call GPRJALR:$rs1)]>,
1490
1507
PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>;
1508
+ let Predicates = [HasStdExtZicfilp] in
1509
+ def PseudoCALLIndirectNonX7 : Pseudo<(outs), (ins GPRJALRNonX7:$rs1),
1510
+ [(riscv_call GPRJALRNonX7:$rs1)]>,
1511
+ PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>;
1512
+ }
1491
1513
1492
1514
let isBarrier = 1, isReturn = 1, isTerminator = 1 in
1493
1515
def PseudoRET : Pseudo<(outs), (ins), [(riscv_ret_glue)]>,
@@ -1502,10 +1524,16 @@ def PseudoTAIL : Pseudo<(outs), (ins call_symbol:$dst), [],
1502
1524
"tail", "$dst">,
1503
1525
Sched<[WriteIALU, WriteJalr, ReadJalr]>;
1504
1526
1505
- let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [X2] in
1527
+ let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [X2] in {
1528
+ let Predicates = [NoStdExtZicfilp] in
1506
1529
def PseudoTAILIndirect : Pseudo<(outs), (ins GPRTC:$rs1),
1507
1530
[(riscv_tail GPRTC:$rs1)]>,
1508
1531
PseudoInstExpansion<(JALR X0, GPR:$rs1, 0)>;
1532
+ let Predicates = [HasStdExtZicfilp] in
1533
+ def PseudoTAILIndirectNonX7 : Pseudo<(outs), (ins GPRTCNonX7:$rs1),
1534
+ [(riscv_tail GPRTCNonX7:$rs1)]>,
1535
+ PseudoInstExpansion<(JALR X0, GPR:$rs1, 0)>;
1536
+ }
1509
1537
1510
1538
def : Pat<(riscv_tail (iPTR tglobaladdr:$dst)),
1511
1539
(PseudoTAIL tglobaladdr:$dst)>;
0 commit comments