Skip to content

Commit ebe7fd6

Browse files
authored
[RISCV] Add some more compress patterns for Xqcilo instructions (llvm#138309)
There are some load/store instructions that are a part of the Zcb extension that the Xqcilo instructions can be compressed to. Add patterns for the same.
1 parent 6b25cfb commit ebe7fd6

File tree

2 files changed

+181
-0
lines changed

2 files changed

+181
-0
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,6 +1329,19 @@ def : Pat<(riscv_mileaveret_glue), (QC_C_MILEAVERET)>;
13291329
// Compress Instruction tablegen backend.
13301330
//===----------------------------------------------------------------------===//
13311331

1332+
let isCompressOnly = true, Predicates = [HasVendorXqcilo, HasStdExtZcb, IsRV32] in {
1333+
def : CompressPat<(QC_E_LBU GPRC:$rd, GPRCMem:$rs1, uimm2:$imm),
1334+
(C_LBU GPRC:$rd, GPRCMem:$rs1, uimm2:$imm)>;
1335+
def : CompressPat<(QC_E_LHU GPRC:$rd, GPRCMem:$rs1, uimm2_lsb0:$imm),
1336+
(C_LHU GPRC:$rd, GPRCMem:$rs1, uimm2_lsb0:$imm)>;
1337+
def : CompressPat<(QC_E_LH GPRC:$rd, GPRCMem:$rs1, uimm2_lsb0:$imm),
1338+
(C_LH GPRC:$rd, GPRCMem:$rs1, uimm2_lsb0:$imm)>;
1339+
def : CompressPat<(QC_E_SB GPRC:$rs2, GPRCMem:$rs1, uimm2:$imm),
1340+
(C_SB GPRC:$rs2, GPRCMem:$rs1, uimm2:$imm)>;
1341+
def : CompressPat<(QC_E_SH GPRC:$rs2, GPRCMem:$rs1, uimm2_lsb0:$imm),
1342+
(C_SH GPRC:$rs2, GPRCMem:$rs1, uimm2_lsb0:$imm)>;
1343+
} // isCompressOnly = true, Predicates = [HasVendorXqcilo, HasStdExtZcb, IsRV32]
1344+
13321345
let isCompressOnly = true, Predicates = [HasVendorXqcilo, IsRV32] in {
13331346
def : CompressPat<(QC_E_LW GPRC:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm),
13341347
(C_LW GPRC:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm)>;

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

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,159 +10,327 @@
1010
# RUN: | llvm-objdump --mattr=+experimental-xqcilo --no-print-imm-hex -d - \
1111
# RUN: | FileCheck -check-prefix=CHECK-INST %s
1212

13+
# RUN: llvm-mc %s -triple=riscv32 -mattr=+zcb,+experimental-xqcilo -M no-aliases -show-encoding \
14+
# RUN: | FileCheck -check-prefixes=CHECK-ENC-ZCB,CHECK-INST-ZCB,CHECK-NOALIAS-ZCB %s
15+
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+zcb,+experimental-xqcilo < %s \
16+
# RUN: | llvm-objdump --mattr=+zcb,+experimental-xqcilo -M no-aliases --no-print-imm-hex -d - \
17+
# RUN: | FileCheck -check-prefix=CHECK-INST-ZCB %s
18+
# RUN: llvm-mc %s -triple=riscv32 -mattr=+zcb,+experimental-xqcilo -show-encoding \
19+
# RUN: | FileCheck -check-prefixes=CHECK-ENC-ZCB,CHECK-INST-ZCB,CHECK-ALIAS-ZCB %s
20+
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+zcb,+experimental-xqcilo < %s \
21+
# RUN: | llvm-objdump --mattr=+experimental-xqcilo --no-print-imm-hex -d - \
22+
# RUN: | FileCheck -check-prefix=CHECK-INST-ZCB %s
23+
1324
# CHECK-INST: qc.e.lb a1, 3000(a0)
1425
# CHECK-ENC: encoding: [0x9f,0x55,0x85,0x3b,0x02,0x00]
26+
27+
# CHECK-INST-ZCB: qc.e.lb a1, 3000(a0)
28+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0x85,0x3b,0x02,0x00]
1529
qc.e.lb x11, 3000(x10)
1630

1731
# CHECK-INST: qc.e.lb a1, -33554432(a0)
1832
# CHECK-ENC: encoding: [0x9f,0x55,0x05,0x00,0x00,0x80]
33+
34+
# CHECK-INST-ZCB: qc.e.lb a1, -33554432(a0)
35+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0x05,0x00,0x00,0x80]
1936
qc.e.lb x11, -33554432(x10)
2037

2138
# CHECK-INST: qc.e.lb a1, 33554431(a0)
2239
# CHECK-ENC: encoding: [0x9f,0x55,0xf5,0x3f,0xff,0x7f]
40+
41+
# CHECK-INST-ZCB: qc.e.lb a1, 33554431(a0)
42+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0xf5,0x3f,0xff,0x7f]
2343
qc.e.lb x11, 33554431(x10)
2444

2545

2646
# CHECK-INST: qc.e.lbu a1, 3000(a0)
2747
# CHECK-ENC: encoding: [0x9f,0x55,0x85,0x7b,0x02,0x00]
48+
49+
# CHECK-INST-ZCB: qc.e.lbu a1, 3000(a0)
50+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0x85,0x7b,0x02,0x00]
2851
qc.e.lbu x11, 3000(x10)
2952

3053
# CHECK-INST: qc.e.lbu a1, -33554432(a0)
3154
# CHECK-ENC: encoding: [0x9f,0x55,0x05,0x40,0x00,0x80]
55+
56+
# CHECK-INST-ZCB: qc.e.lbu a1, -33554432(a0)
57+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0x05,0x40,0x00,0x80]
3258
qc.e.lbu x11, -33554432(x10)
3359

3460
# CHECK-INST: qc.e.lbu a1, 33554431(a0)
3561
# CHECK-ENC: encoding: [0x9f,0x55,0xf5,0x7f,0xff,0x7f]
62+
63+
# CHECK-INST-ZCB: qc.e.lbu a1, 33554431(a0)
64+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0xf5,0x7f,0xff,0x7f]
3665
qc.e.lbu x11, 33554431(x10)
3766

3867

3968
# CHECK-INST: qc.e.lh a1, 3000(a0)
4069
# CHECK-ENC: encoding: [0x9f,0x55,0x85,0xbb,0x02,0x00]
70+
71+
# CHECK-INST-ZCB: qc.e.lh a1, 3000(a0)
72+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0x85,0xbb,0x02,0x00]
4173
qc.e.lh x11, 3000(x10)
4274

4375
# CHECK-INST: qc.e.lh a1, -33554432(a0)
4476
# CHECK-ENC: encoding: [0x9f,0x55,0x05,0x80,0x00,0x80]
77+
78+
# CHECK-INST-ZCB: qc.e.lh a1, -33554432(a0)
79+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0x05,0x80,0x00,0x80]
4580
qc.e.lh x11, -33554432(x10)
4681

4782
# CHECK-INST: qc.e.lh a1, 33554431(a0)
4883
# CHECK-ENC: encoding: [0x9f,0x55,0xf5,0xbf,0xff,0x7f]
84+
85+
# CHECK-INST-ZCB: qc.e.lh a1, 33554431(a0)
86+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0xf5,0xbf,0xff,0x7f]
4987
qc.e.lh x11, 33554431(x10)
5088

5189

5290
# CHECK-INST: qc.e.lhu a1, 3000(a0)
5391
# CHECK-ENC: encoding: [0x9f,0x55,0x85,0xfb,0x02,0x00]
92+
93+
# CHECK-INST-ZCB: qc.e.lhu a1, 3000(a0)
94+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0x85,0xfb,0x02,0x00]
5495
qc.e.lhu x11, 3000(x10)
5596

5697
# CHECK-INST: qc.e.lhu a1, -33554432(a0)
5798
# CHECK-ENC: encoding: [0x9f,0x55,0x05,0xc0,0x00,0x80]
99+
100+
# CHECK-INST-ZCB: qc.e.lhu a1, -33554432(a0)
101+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0x05,0xc0,0x00,0x80]
58102
qc.e.lhu x11, -33554432(x10)
59103

60104
# CHECK-INST: qc.e.lhu a1, 33554431(a0)
61105
# CHECK-ENC: encoding: [0x9f,0x55,0xf5,0xff,0xff,0x7f]
106+
107+
# CHECK-INST-ZCB: qc.e.lhu a1, 33554431(a0)
108+
# CHECK-ENC-ZCB: encoding: [0x9f,0x55,0xf5,0xff,0xff,0x7f]
62109
qc.e.lhu x11, 33554431(x10)
63110

64111

65112
# CHECK-INST: qc.e.lw a1, 3000(a0)
66113
# CHECK-ENC: encoding: [0x9f,0x65,0x85,0x3b,0x02,0x00]
114+
115+
# CHECK-INST-ZCB: qc.e.lw a1, 3000(a0)
116+
# CHECK-ENC-ZCB: encoding: [0x9f,0x65,0x85,0x3b,0x02,0x00]
67117
qc.e.lw x11, 3000(x10)
68118

69119
# CHECK-INST: qc.e.lw a1, -33554432(a0)
70120
# CHECK-ENC: encoding: [0x9f,0x65,0x05,0x00,0x00,0x80]
121+
122+
# CHECK-INST-ZCB: qc.e.lw a1, -33554432(a0)
123+
# CHECK-ENC-ZCB: encoding: [0x9f,0x65,0x05,0x00,0x00,0x80]
71124
qc.e.lw x11, -33554432(x10)
72125

73126
# CHECK-INST: qc.e.lw a1, 33554431(a0)
74127
# CHECK-ENC: encoding: [0x9f,0x65,0xf5,0x3f,0xff,0x7f]
128+
129+
# CHECK-INST-ZCB: qc.e.lw a1, 33554431(a0)
130+
# CHECK-ENC-ZCB: encoding: [0x9f,0x65,0xf5,0x3f,0xff,0x7f]
75131
qc.e.lw x11, 33554431(x10)
76132

77133

78134
# CHECK-INST: qc.e.sb a1, 3000(a0)
79135
# CHECK-ENC: encoding: [0x1f,0x6c,0xb5,0x7a,0x02,0x00]
136+
137+
# CHECK-INST-ZCB: qc.e.sb a1, 3000(a0)
138+
# CHECK-ENC-ZCB: encoding: [0x1f,0x6c,0xb5,0x7a,0x02,0x00]
80139
qc.e.sb x11, 3000(x10)
81140

82141
# CHECK-INST: qc.e.sb a1, -33554432(a0)
83142
# CHECK-ENC: encoding: [0x1f,0x60,0xb5,0x40,0x00,0x80]
143+
144+
# CHECK-INST-ZCB: qc.e.sb a1, -33554432(a0)
145+
# CHECK-ENC-ZCB: encoding: [0x1f,0x60,0xb5,0x40,0x00,0x80]
84146
qc.e.sb x11, -33554432(x10)
85147

86148
# CHECK-INST: qc.e.sb a1, 33554431(a0)
87149
# CHECK-ENC: encoding: [0x9f,0x6f,0xb5,0x7e,0xff,0x7f]
150+
151+
# CHECK-INST-ZCB: qc.e.sb a1, 33554431(a0)
152+
# CHECK-ENC-ZCB: encoding: [0x9f,0x6f,0xb5,0x7e,0xff,0x7f]
88153
qc.e.sb x11, 33554431(x10)
89154

90155

91156
# CHECK-INST: qc.e.sh a1, 3000(a0)
92157
# CHECK-ENC: encoding: [0x1f,0x6c,0xb5,0xba,0x02,0x00]
158+
159+
# CHECK-INST-ZCB: qc.e.sh a1, 3000(a0)
160+
# CHECK-ENC-ZCB: encoding: [0x1f,0x6c,0xb5,0xba,0x02,0x00]
93161
qc.e.sh x11, 3000(x10)
94162

95163
# CHECK-INST: qc.e.sh a1, -33554432(a0)
96164
# CHECK-ENC: encoding: [0x1f,0x60,0xb5,0x80,0x00,0x80]
165+
166+
# CHECK-INST-ZCB: qc.e.sh a1, -33554432(a0)
167+
# CHECK-ENC-ZCB: encoding: [0x1f,0x60,0xb5,0x80,0x00,0x80]
97168
qc.e.sh x11, -33554432(x10)
98169

99170
# CHECK-INST: qc.e.sh a1, 33554431(a0)
100171
# CHECK-ENC: encoding: [0x9f,0x6f,0xb5,0xbe,0xff,0x7f]
172+
173+
# CHECK-INST-ZCB: qc.e.sh a1, 33554431(a0)
174+
# CHECK-ENC-ZCB: encoding: [0x9f,0x6f,0xb5,0xbe,0xff,0x7f]
101175
qc.e.sh x11, 33554431(x10)
102176

103177

104178
# CHECK-INST: qc.e.sw a1, 3000(a0)
105179
# CHECK-ENC: encoding: [0x1f,0x6c,0xb5,0xfa,0x02,0x00]
180+
181+
# CHECK-INST-ZCB: qc.e.sw a1, 3000(a0)
182+
# CHECK-ENC-ZCB: encoding: [0x1f,0x6c,0xb5,0xfa,0x02,0x00]
106183
qc.e.sw x11, 3000(x10)
107184

108185
# CHECK-INST: qc.e.sw a1, -33554432(a0)
109186
# CHECK-ENC: encoding: [0x1f,0x60,0xb5,0xc0,0x00,0x80]
187+
188+
# CHECK-INST-ZCB: qc.e.sw a1, -33554432(a0)
189+
# CHECK-ENC-ZCB: encoding: [0x1f,0x60,0xb5,0xc0,0x00,0x80]
110190
qc.e.sw x11, -33554432(x10)
111191

112192
# CHECK-INST: qc.e.sw a1, 33554431(a0)
113193
# CHECK-ENC: encoding: [0x9f,0x6f,0xb5,0xfe,0xff,0x7f]
194+
195+
# CHECK-INST-ZCB: qc.e.sw a1, 33554431(a0)
196+
# CHECK-ENC-ZCB: encoding: [0x9f,0x6f,0xb5,0xfe,0xff,0x7f]
114197
qc.e.sw x11, 33554431(x10)
115198

116199
# Check that compressed patterns work
117200

118201
# CHECK-INST: lb a1, 100(a0)
119202
# CHECK-ENC: encoding: [0x83,0x05,0x45,0x06]
203+
204+
# CHECK-INST-ZCB: lb a1, 100(a0)
205+
# CHECK-ENC-ZCB: encoding: [0x83,0x05,0x45,0x06]
120206
qc.e.lb x11, 100(x10)
121207

122208
# CHECK-INST: lbu a1, 200(a0)
123209
# CHECK-ENC: encoding: [0x83,0x45,0x85,0x0c]
210+
211+
# CHECK-INST-ZCB: lbu a1, 200(a0)
212+
# CHECK-ENC-ZCB: encoding: [0x83,0x45,0x85,0x0c]
124213
qc.e.lbu x11, 200(x10)
125214

126215
# CHECK-INST: lh a1, 300(a0)
127216
# CHECK-ENC: encoding: [0x83,0x15,0xc5,0x12]
217+
218+
# CHECK-INST-ZCB: lh a1, 300(a0)
219+
# CHECK-ENC-ZCB: encoding: [0x83,0x15,0xc5,0x12]
128220
qc.e.lh x11, 300(x10)
129221

130222
# CHECK-INST: lhu a1, 400(a0)
131223
# CHECK-ENC: encoding: [0x83,0x55,0x05,0x19]
224+
225+
# CHECK-INST-ZCB: lhu a1, 400(a0)
226+
# CHECK-ENC-ZCB: encoding: [0x83,0x55,0x05,0x19]
132227
qc.e.lhu x11, 400(x10)
133228

134229
# CHECK-INST: lw a1, 500(a0)
135230
# CHECK-ENC: encoding: [0x83,0x25,0x45,0x1f]
231+
232+
# CHECK-INST-ZCB: lw a1, 500(a0)
233+
# CHECK-ENC-ZCB: encoding: [0x83,0x25,0x45,0x1f]
136234
qc.e.lw x11, 500(x10)
137235

138236
# CHECK-INST: sb a1, 600(a0)
139237
# CHECK-ENC: encoding: [0x23,0x0c,0xb5,0x24]
238+
239+
# CHECK-INST-ZCB: sb a1, 600(a0)
240+
# CHECK-ENC-ZCB: encoding: [0x23,0x0c,0xb5,0x24]
140241
qc.e.sb x11, 600(x10)
141242

142243
# CHECK-INST: sh a1, 700(a0)
143244
# CHECK-ENC: encoding: [0x23,0x1e,0xb5,0x2a]
245+
246+
# CHECK-INST-ZCB: sh a1, 700(a0)
247+
# CHECK-ENC-ZCB: encoding: [0x23,0x1e,0xb5,0x2a]
144248
qc.e.sh x11, 700(x10)
145249

146250
# CHECK-INST: sw a1, 800(a0)
147251
# CHECK-ENC: encoding: [0x23,0x20,0xb5,0x32]
252+
253+
# CHECK-INST-ZCB: sw a1, 800(a0)
254+
# CHECK-ENC-ZCB: encoding: [0x23,0x20,0xb5,0x32]
148255
qc.e.sw x11, 800(x10)
149256

150257
# CHECK-ALIAS: lw a1, 32(a0)
151258
# CHECK-NOALIAS: c.lw a1, 32(a0)
152259
# CHECK-ENC: encoding: [0x0c,0x51]
260+
261+
# CHECK-ALIAS-ZCB: lw a1, 32(a0)
262+
# CHECK-NOALIAS-ZCB: c.lw a1, 32(a0)
263+
# CHECK-ENC-ZCB: encoding: [0x0c,0x51]
153264
qc.e.lw x11, 32(x10)
154265

155266
# CHECK-ALIAS: sw a1, 124(a0)
156267
# CHECK-NOALIAS: c.sw a1, 124(a0)
157268
# CHECK-ENC: encoding: [0x6c,0xdd]
269+
270+
# CHECK-ALIAS-ZCB: sw a1, 124(a0)
271+
# CHECK-NOALIAS-ZCB: c.sw a1, 124(a0)
272+
# CHECK-ENC-ZCB: encoding: [0x6c,0xdd]
158273
qc.e.sw x11, 124(x10)
159274

160275
# CHECK-ALIAS: lw ra, 64(sp)
161276
# CHECK-NOALIAS: c.lwsp ra, 64(sp)
162277
# CHECK-ENC: encoding: [0x86,0x40]
278+
279+
# CHECK-ALIAS-ZCB: lw ra, 64(sp)
280+
# CHECK-NOALIAS-ZCB: c.lwsp ra, 64(sp)
281+
# CHECK-ENC-ZCB: encoding: [0x86,0x40]
163282
qc.e.lw x1, 64(x2)
164283

165284
# CHECK-ALIAS: sw a1, 252(sp)
166285
# CHECK-NOALIAS: c.swsp a1, 252(sp)
167286
# CHECK-ENC: encoding: [0xae,0xdf]
287+
288+
# CHECK-ALIAS-ZCB: sw a1, 252(sp)
289+
# CHECK-NOALIAS-ZCB: c.swsp a1, 252(sp)
290+
# CHECK-ENC-ZCB: encoding: [0xae,0xdf]
168291
qc.e.sw x11, 252(x2)
292+
293+
# CHECK-ALIAS: lbu a1, 3(a0)
294+
# CHECK-NOALIAS: lbu a1, 3(a0)
295+
# CHECK-ENC: encoding: [0x83,0x45,0x35,0x00]
296+
297+
# CHECK-ALIAS-ZCB: lbu a1, 3(a0)
298+
# CHECK-NOALIAS-ZCB: c.lbu a1, 3(a0)
299+
# CHECK-ENC-ZCB: encoding: [0x6c,0x81]
300+
qc.e.lbu x11, 3(x10)
301+
302+
# CHECK-ALIAS: lhu a1, 2(a0)
303+
# CHECK-NOALIAS: lhu a1, 2(a0)
304+
# CHECK-ENC: encoding: [0x83,0x55,0x25,0x00]
305+
306+
# CHECK-ALIAS-ZCB: lhu a1, 2(a0)
307+
# CHECK-NOALIAS-ZCB: c.lhu a1, 2(a0)
308+
# CHECK-ENC-ZCB: encoding: [0x2c,0x85]
309+
qc.e.lhu x11, 2(x10)
310+
311+
# CHECK-ALIAS: lh a1, 0(a0)
312+
# CHECK-NOALIAS: lh a1, 0(a0)
313+
# CHECK-ENC: encoding: [0x83,0x15,0x05,0x00]
314+
315+
# CHECK-ALIAS-ZCB: lh a1, 0(a0)
316+
# CHECK-NOALIAS-ZCB: c.lh a1, 0(a0)
317+
# CHECK-ENC-ZCB: encoding: [0x4c,0x85]
318+
qc.e.lh x11, 0(x10)
319+
320+
# CHECK-ALIAS: sb a1, 1(a0)
321+
# CHECK-NOALIAS: sb a1, 1(a0)
322+
# CHECK-ENC: encoding: [0xa3,0x00,0xb5,0x00]
323+
324+
# CHECK-ALIAS-ZCB: sb a1, 1(a0)
325+
# CHECK-NOALIAS-ZCB: c.sb a1, 1(a0)
326+
# CHECK-ENC-ZCB: encoding: [0x4c,0x89]
327+
qc.e.sb x11, 1(x10)
328+
329+
# CHECK-ALIAS: sh a1, 2(a0)
330+
# CHECK-NOALIAS: sh a1, 2(a0)
331+
# CHECK-ENC: encoding: [0x23,0x11,0xb5,0x00]
332+
333+
# CHECK-ALIAS-ZCB: sh a1, 2(a0)
334+
# CHECK-NOALIAS-ZCB: c.sh a1, 2(a0)
335+
# CHECK-ENC-ZCB: encoding: [0x2c,0x8d]
336+
qc.e.sh x11, 2(x10)

0 commit comments

Comments
 (0)