Skip to content

Commit 11b5e29

Browse files
authored
[RISCV] Add compress patterns for QC_E_J/JAL and QC_E_LI (#141561)
1 parent 0b75a20 commit 11b5e29

File tree

4 files changed

+31
-3
lines changed

4 files changed

+31
-3
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,8 @@ def Simm21Lsb0JALAsmOperand : BareSImmNLsb0AsmOperand<21> {
379379
}
380380

381381
// A 21-bit signed immediate where the least significant bit is zero.
382-
def simm21_lsb0_jal : Operand<OtherVT> {
382+
def simm21_lsb0_jal : Operand<OtherVT>,
383+
ImmLeaf<XLenVT, [{return isShiftedInt<20, 1>(Imm);}]> {
383384
let ParserMatchClass = Simm21Lsb0JALAsmOperand;
384385
let PrintMethod = "printBranchOperand";
385386
let EncoderMethod = "getImmOpValueAsrN<1>";

llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ def simm16nonzero : RISCVOp<XLenVT>,
124124
let OperandType = "OPERAND_SIMM16_NONZERO";
125125
}
126126

127-
def simm20_li : RISCVOp<XLenVT> {
127+
def simm20_li : RISCVOp<XLenVT>,
128+
ImmLeaf<XLenVT, [{return isInt<20>(Imm);}]>{
128129
let ParserMatchClass = SImmAsmOperand<20, "LI">;
129130
let EncoderMethod = "getImmOpValue";
130131
let DecoderMethod = "decodeSImmOperand<20>";
@@ -1514,15 +1515,22 @@ def : CompressPat<(QC_E_J bare_simm12_lsb0:$offset),
15141515
(C_J bare_simm12_lsb0:$offset)>;
15151516
def : CompressPat<(QC_E_JAL bare_simm12_lsb0:$offset),
15161517
(C_JAL bare_simm12_lsb0:$offset)>;
1518+
def : CompressPat<(QC_E_JAL simm21_lsb0_jal:$offset),
1519+
(JAL X1, simm21_lsb0_jal:$offset)>;
1520+
def : CompressPat<(QC_E_J simm21_lsb0_jal:$offset),
1521+
(JAL X0, simm21_lsb0_jal:$offset)>;
15171522
} // isCompressOnly = true, Predicates = [HasVendorXqcilb, IsRV32]
15181523

15191524
let Predicates = [HasVendorXqcili, IsRV32] in {
15201525
def : CompressPat<(QC_LI GPRNoX0:$rd, simm6:$imm),
15211526
(C_LI GPRNoX0:$rd, simm6:$imm)>;
15221527

1523-
let isCompressOnly = true in
1528+
let isCompressOnly = true in {
15241529
def : CompressPat<(QC_E_LI GPRNoX0:$rd, simm6:$imm),
15251530
(C_LI GPRNoX0:$rd, simm6:$imm)>;
1531+
def : CompressPat<(QC_E_LI GPRNoX0:$rd, simm20_li:$imm),
1532+
(QC_LI GPRNoX0:$rd, simm20_li:$imm)>;
1533+
} // isCompressOnly = true
15261534
} // Predicates = [HasVendorXqcili, IsRV32]
15271535

15281536
let isCompressOnly = true, Predicates = [HasVendorXqcilia, IsRV32] in {

llvm/test/MC/RISCV/xqcilb-valid.s

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,17 @@ qc.e.jal 0xffffff8c
3535
# CHECK-OBJ-ALIAS: j 0x40e
3636
# CHECK-ENC: encoding: [0x01,0xa1]
3737
qc.e.j 1024
38+
39+
# CHECK-NOALIAS: jal ra, 3000
40+
# CHECK-ALIAS: jal 3000
41+
# CHECK-OBJ-NOALIAS: jal ra, 0xbc8
42+
# CHECK-OBJ-ALIAS: jal 0xbc8
43+
# CHECK-ENC: encoding: [0xef,0x00,0x90,0x3b]
44+
qc.e.jal 3000
45+
46+
# CHECK-NOALIAS: jal zero, -3000
47+
# CHECK-ALIAS: j -3000
48+
# CHECK-OBJ-NOALIAS: jal zero, 0xfffff45c
49+
# CHECK-OBJ-ALIAS: j 0xfffff45c
50+
# CHECK-ENC: encoding: [0x6f,0xf0,0x8f,0xc4]
51+
qc.e.j -3000

llvm/test/MC/RISCV/xqcili-valid.s

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,8 @@ qc.e.li x10, 4294967295
5353
# CHECK-NOALIAS: c.li a0, 31
5454
# CHECK-ENC: encoding: [0x7d,0x45]
5555
qc.li x10, 31
56+
57+
# CHECK-ALIAS: li a0, 4294
58+
# CHECK-NOALIAS: qc.li a0, 4294
59+
# CHECK-ENC: encoding: [0x1b,0x05,0xc6,0x10]
60+
qc.e.li x10, 4294

0 commit comments

Comments
 (0)