3
3
; RUN: | FileCheck %s -check-prefixes=RV32I
4
4
; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcibm -verify-machineinstrs < %s \
5
5
; RUN: | FileCheck %s -check-prefixes=RV32XQCIBM
6
+ ; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcibm,+zbb -verify-machineinstrs < %s \
7
+ ; RUN: | FileCheck %s -check-prefixes=RV32XQCIBMZBB
6
8
7
9
define i32 @sexti1_i32 (i1 %a ) nounwind {
8
10
; RV32I-LABEL: sexti1_i32:
@@ -15,6 +17,11 @@ define i32 @sexti1_i32(i1 %a) nounwind {
15
17
; RV32XQCIBM: # %bb.0:
16
18
; RV32XQCIBM-NEXT: qc.ext a0, a0, 1, 0
17
19
; RV32XQCIBM-NEXT: ret
20
+ ;
21
+ ; RV32XQCIBMZBB-LABEL: sexti1_i32:
22
+ ; RV32XQCIBMZBB: # %bb.0:
23
+ ; RV32XQCIBMZBB-NEXT: qc.ext a0, a0, 1, 0
24
+ ; RV32XQCIBMZBB-NEXT: ret
18
25
%sext = sext i1 %a to i32
19
26
ret i32 %sext
20
27
}
@@ -30,6 +37,11 @@ define i32 @sexti1_i32_2(i32 %a) {
30
37
; RV32XQCIBM: # %bb.0:
31
38
; RV32XQCIBM-NEXT: qc.ext a0, a0, 1, 0
32
39
; RV32XQCIBM-NEXT: ret
40
+ ;
41
+ ; RV32XQCIBMZBB-LABEL: sexti1_i32_2:
42
+ ; RV32XQCIBMZBB: # %bb.0:
43
+ ; RV32XQCIBMZBB-NEXT: qc.ext a0, a0, 1, 0
44
+ ; RV32XQCIBMZBB-NEXT: ret
33
45
%shl = shl i32 %a , 31
34
46
%shr = ashr exact i32 %shl , 31
35
47
ret i32 %shr
@@ -47,6 +59,11 @@ define i32 @sexti8_i32(i8 %a) nounwind {
47
59
; RV32XQCIBM: # %bb.0:
48
60
; RV32XQCIBM-NEXT: qc.ext a0, a0, 8, 0
49
61
; RV32XQCIBM-NEXT: ret
62
+ ;
63
+ ; RV32XQCIBMZBB-LABEL: sexti8_i32:
64
+ ; RV32XQCIBMZBB: # %bb.0:
65
+ ; RV32XQCIBMZBB-NEXT: sext.b a0, a0
66
+ ; RV32XQCIBMZBB-NEXT: ret
50
67
%sext = sext i8 %a to i32
51
68
ret i32 %sext
52
69
}
@@ -62,6 +79,11 @@ define i32 @sexti8_i32_2(i32 %a) {
62
79
; RV32XQCIBM: # %bb.0:
63
80
; RV32XQCIBM-NEXT: qc.ext a0, a0, 8, 0
64
81
; RV32XQCIBM-NEXT: ret
82
+ ;
83
+ ; RV32XQCIBMZBB-LABEL: sexti8_i32_2:
84
+ ; RV32XQCIBMZBB: # %bb.0:
85
+ ; RV32XQCIBMZBB-NEXT: sext.b a0, a0
86
+ ; RV32XQCIBMZBB-NEXT: ret
65
87
%shl = shl i32 %a , 24
66
88
%shr = ashr exact i32 %shl , 24
67
89
ret i32 %shr
@@ -78,6 +100,11 @@ define i32 @sexti16_i32(i16 %a) nounwind {
78
100
; RV32XQCIBM: # %bb.0:
79
101
; RV32XQCIBM-NEXT: qc.ext a0, a0, 16, 0
80
102
; RV32XQCIBM-NEXT: ret
103
+ ;
104
+ ; RV32XQCIBMZBB-LABEL: sexti16_i32:
105
+ ; RV32XQCIBMZBB: # %bb.0:
106
+ ; RV32XQCIBMZBB-NEXT: sext.h a0, a0
107
+ ; RV32XQCIBMZBB-NEXT: ret
81
108
%sext = sext i16 %a to i32
82
109
ret i32 %sext
83
110
}
@@ -93,6 +120,11 @@ define i32 @sexti16_i32_2(i32 %a) {
93
120
; RV32XQCIBM: # %bb.0:
94
121
; RV32XQCIBM-NEXT: qc.ext a0, a0, 16, 0
95
122
; RV32XQCIBM-NEXT: ret
123
+ ;
124
+ ; RV32XQCIBMZBB-LABEL: sexti16_i32_2:
125
+ ; RV32XQCIBMZBB: # %bb.0:
126
+ ; RV32XQCIBMZBB-NEXT: sext.h a0, a0
127
+ ; RV32XQCIBMZBB-NEXT: ret
96
128
%shl = shl i32 %a , 16
97
129
%shr = ashr exact i32 %shl , 16
98
130
ret i32 %shr
@@ -111,6 +143,12 @@ define i64 @sexti1_i64(i64 %a) {
111
143
; RV32XQCIBM-NEXT: qc.ext a0, a0, 1, 0
112
144
; RV32XQCIBM-NEXT: mv a1, a0
113
145
; RV32XQCIBM-NEXT: ret
146
+ ;
147
+ ; RV32XQCIBMZBB-LABEL: sexti1_i64:
148
+ ; RV32XQCIBMZBB: # %bb.0:
149
+ ; RV32XQCIBMZBB-NEXT: qc.ext a0, a0, 1, 0
150
+ ; RV32XQCIBMZBB-NEXT: mv a1, a0
151
+ ; RV32XQCIBMZBB-NEXT: ret
114
152
%shl = shl i64 %a , 63
115
153
%shr = ashr exact i64 %shl , 63
116
154
ret i64 %shr
@@ -129,6 +167,12 @@ define i64 @sexti1_i64_2(i1 %a) {
129
167
; RV32XQCIBM-NEXT: qc.ext a0, a0, 1, 0
130
168
; RV32XQCIBM-NEXT: mv a1, a0
131
169
; RV32XQCIBM-NEXT: ret
170
+ ;
171
+ ; RV32XQCIBMZBB-LABEL: sexti1_i64_2:
172
+ ; RV32XQCIBMZBB: # %bb.0:
173
+ ; RV32XQCIBMZBB-NEXT: qc.ext a0, a0, 1, 0
174
+ ; RV32XQCIBMZBB-NEXT: mv a1, a0
175
+ ; RV32XQCIBMZBB-NEXT: ret
132
176
%1 = sext i1 %a to i64
133
177
ret i64 %1
134
178
}
@@ -146,6 +190,12 @@ define i64 @sexti8_i64(i64 %a) {
146
190
; RV32XQCIBM-NEXT: qc.ext a0, a0, 8, 0
147
191
; RV32XQCIBM-NEXT: srai a1, a0, 31
148
192
; RV32XQCIBM-NEXT: ret
193
+ ;
194
+ ; RV32XQCIBMZBB-LABEL: sexti8_i64:
195
+ ; RV32XQCIBMZBB: # %bb.0:
196
+ ; RV32XQCIBMZBB-NEXT: sext.b a0, a0
197
+ ; RV32XQCIBMZBB-NEXT: srai a1, a0, 31
198
+ ; RV32XQCIBMZBB-NEXT: ret
149
199
%shl = shl i64 %a , 56
150
200
%shr = ashr exact i64 %shl , 56
151
201
ret i64 %shr
@@ -164,6 +214,12 @@ define i64 @sexti8_i64_2(i8 %a) {
164
214
; RV32XQCIBM-NEXT: qc.ext a0, a0, 8, 0
165
215
; RV32XQCIBM-NEXT: srai a1, a0, 31
166
216
; RV32XQCIBM-NEXT: ret
217
+ ;
218
+ ; RV32XQCIBMZBB-LABEL: sexti8_i64_2:
219
+ ; RV32XQCIBMZBB: # %bb.0:
220
+ ; RV32XQCIBMZBB-NEXT: sext.b a0, a0
221
+ ; RV32XQCIBMZBB-NEXT: srai a1, a0, 31
222
+ ; RV32XQCIBMZBB-NEXT: ret
167
223
%1 = sext i8 %a to i64
168
224
ret i64 %1
169
225
}
@@ -181,6 +237,12 @@ define i64 @sexti16_i64(i64 %a) {
181
237
; RV32XQCIBM-NEXT: qc.ext a0, a0, 16, 0
182
238
; RV32XQCIBM-NEXT: srai a1, a0, 31
183
239
; RV32XQCIBM-NEXT: ret
240
+ ;
241
+ ; RV32XQCIBMZBB-LABEL: sexti16_i64:
242
+ ; RV32XQCIBMZBB: # %bb.0:
243
+ ; RV32XQCIBMZBB-NEXT: sext.h a0, a0
244
+ ; RV32XQCIBMZBB-NEXT: srai a1, a0, 31
245
+ ; RV32XQCIBMZBB-NEXT: ret
184
246
%shl = shl i64 %a , 48
185
247
%shr = ashr exact i64 %shl , 48
186
248
ret i64 %shr
@@ -199,6 +261,12 @@ define i64 @sexti16_i64_2(i16 %a) {
199
261
; RV32XQCIBM-NEXT: qc.ext a0, a0, 16, 0
200
262
; RV32XQCIBM-NEXT: srai a1, a0, 31
201
263
; RV32XQCIBM-NEXT: ret
264
+ ;
265
+ ; RV32XQCIBMZBB-LABEL: sexti16_i64_2:
266
+ ; RV32XQCIBMZBB: # %bb.0:
267
+ ; RV32XQCIBMZBB-NEXT: sext.h a0, a0
268
+ ; RV32XQCIBMZBB-NEXT: srai a1, a0, 31
269
+ ; RV32XQCIBMZBB-NEXT: ret
202
270
%1 = sext i16 %a to i64
203
271
ret i64 %1
204
272
}
@@ -213,6 +281,11 @@ define i64 @sexti32_i64(i64 %a) {
213
281
; RV32XQCIBM: # %bb.0:
214
282
; RV32XQCIBM-NEXT: srai a1, a0, 31
215
283
; RV32XQCIBM-NEXT: ret
284
+ ;
285
+ ; RV32XQCIBMZBB-LABEL: sexti32_i64:
286
+ ; RV32XQCIBMZBB: # %bb.0:
287
+ ; RV32XQCIBMZBB-NEXT: srai a1, a0, 31
288
+ ; RV32XQCIBMZBB-NEXT: ret
216
289
%shl = shl i64 %a , 32
217
290
%shr = ashr exact i64 %shl , 32
218
291
ret i64 %shr
@@ -228,6 +301,11 @@ define i64 @sexti32_i64_2(i32 %a) {
228
301
; RV32XQCIBM: # %bb.0:
229
302
; RV32XQCIBM-NEXT: srai a1, a0, 31
230
303
; RV32XQCIBM-NEXT: ret
304
+ ;
305
+ ; RV32XQCIBMZBB-LABEL: sexti32_i64_2:
306
+ ; RV32XQCIBMZBB: # %bb.0:
307
+ ; RV32XQCIBMZBB-NEXT: srai a1, a0, 31
308
+ ; RV32XQCIBMZBB-NEXT: ret
231
309
%1 = sext i32 %a to i64
232
310
ret i64 %1
233
311
}
@@ -243,6 +321,11 @@ define i32 @extu_from_and_i32(i32 %x) {
243
321
; RV32XQCIBM: # %bb.0:
244
322
; RV32XQCIBM-NEXT: qc.extu a0, a0, 12, 0
245
323
; RV32XQCIBM-NEXT: ret
324
+ ;
325
+ ; RV32XQCIBMZBB-LABEL: extu_from_and_i32:
326
+ ; RV32XQCIBMZBB: # %bb.0:
327
+ ; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 12, 0
328
+ ; RV32XQCIBMZBB-NEXT: ret
246
329
%a = and i32 %x , 4095
247
330
ret i32 %a
248
331
}
@@ -257,6 +340,11 @@ define i32 @no_extu_from_and_i32(i32 %x) {
257
340
; RV32XQCIBM: # %bb.0:
258
341
; RV32XQCIBM-NEXT: andi a0, a0, 31
259
342
; RV32XQCIBM-NEXT: ret
343
+ ;
344
+ ; RV32XQCIBMZBB-LABEL: no_extu_from_and_i32:
345
+ ; RV32XQCIBMZBB: # %bb.0:
346
+ ; RV32XQCIBMZBB-NEXT: andi a0, a0, 31
347
+ ; RV32XQCIBMZBB-NEXT: ret
260
348
%a = and i32 %x , 31
261
349
ret i32 %a
262
350
}
@@ -271,6 +359,11 @@ define i32 @extu_from_and_i32_simm12_lb(i32 %x) {
271
359
; RV32XQCIBM: # %bb.0:
272
360
; RV32XQCIBM-NEXT: qc.extu a0, a0, 6, 0
273
361
; RV32XQCIBM-NEXT: ret
362
+ ;
363
+ ; RV32XQCIBMZBB-LABEL: extu_from_and_i32_simm12_lb:
364
+ ; RV32XQCIBMZBB: # %bb.0:
365
+ ; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 6, 0
366
+ ; RV32XQCIBMZBB-NEXT: ret
274
367
%a = and i32 %x , 63
275
368
ret i32 %a
276
369
}
@@ -285,6 +378,11 @@ define i32 @extu_from_and_i32_simm12_ub(i32 %x) {
285
378
; RV32XQCIBM: # %bb.0:
286
379
; RV32XQCIBM-NEXT: qc.extu a0, a0, 11, 0
287
380
; RV32XQCIBM-NEXT: ret
381
+ ;
382
+ ; RV32XQCIBMZBB-LABEL: extu_from_and_i32_simm12_ub:
383
+ ; RV32XQCIBMZBB: # %bb.0:
384
+ ; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 11, 0
385
+ ; RV32XQCIBMZBB-NEXT: ret
288
386
%a = and i32 %x , 2047
289
387
ret i32 %a
290
388
}
@@ -302,6 +400,12 @@ define i64 @extu_from_and_i64(i64 %x) {
302
400
; RV32XQCIBM-NEXT: qc.extu a0, a0, 12, 0
303
401
; RV32XQCIBM-NEXT: li a1, 0
304
402
; RV32XQCIBM-NEXT: ret
403
+ ;
404
+ ; RV32XQCIBMZBB-LABEL: extu_from_and_i64:
405
+ ; RV32XQCIBMZBB: # %bb.0:
406
+ ; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 12, 0
407
+ ; RV32XQCIBMZBB-NEXT: li a1, 0
408
+ ; RV32XQCIBMZBB-NEXT: ret
305
409
%a = and i64 %x , 4095
306
410
ret i64 %a
307
411
}
@@ -317,6 +421,11 @@ define i32 @extu_from_and_lshr_i32(i32 %x) {
317
421
; RV32XQCIBM: # %bb.0:
318
422
; RV32XQCIBM-NEXT: qc.extu a0, a0, 3, 23
319
423
; RV32XQCIBM-NEXT: ret
424
+ ;
425
+ ; RV32XQCIBMZBB-LABEL: extu_from_and_lshr_i32:
426
+ ; RV32XQCIBMZBB: # %bb.0:
427
+ ; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 3, 23
428
+ ; RV32XQCIBMZBB-NEXT: ret
320
429
%shifted = lshr i32 %x , 23
321
430
%masked = and i32 %shifted , 7
322
431
ret i32 %masked
@@ -335,6 +444,12 @@ define i64 @extu_from_and_lshr_i64(i64 %x) {
335
444
; RV32XQCIBM-NEXT: qc.extu a0, a1, 12, 14
336
445
; RV32XQCIBM-NEXT: li a1, 0
337
446
; RV32XQCIBM-NEXT: ret
447
+ ;
448
+ ; RV32XQCIBMZBB-LABEL: extu_from_and_lshr_i64:
449
+ ; RV32XQCIBMZBB: # %bb.0:
450
+ ; RV32XQCIBMZBB-NEXT: qc.extu a0, a1, 12, 14
451
+ ; RV32XQCIBMZBB-NEXT: li a1, 0
452
+ ; RV32XQCIBMZBB-NEXT: ret
338
453
%shifted = lshr i64 %x , 46
339
454
%masked = and i64 %shifted , 4095
340
455
ret i64 %masked
@@ -351,6 +466,11 @@ define i32 @extu_from_lshr_and_i32(i32 %x) {
351
466
; RV32XQCIBM: # %bb.0:
352
467
; RV32XQCIBM-NEXT: qc.extu a0, a0, 12, 12
353
468
; RV32XQCIBM-NEXT: ret
469
+ ;
470
+ ; RV32XQCIBMZBB-LABEL: extu_from_lshr_and_i32:
471
+ ; RV32XQCIBMZBB: # %bb.0:
472
+ ; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 12, 12
473
+ ; RV32XQCIBMZBB-NEXT: ret
354
474
%masked = and i32 %x , 16773120
355
475
%shifted = lshr i32 %masked , 12
356
476
ret i32 %shifted
@@ -369,6 +489,12 @@ define i64 @extu_from_lshr_and_i64(i64 %x) {
369
489
; RV32XQCIBM-NEXT: qc.extu a0, a0, 12, 12
370
490
; RV32XQCIBM-NEXT: li a1, 0
371
491
; RV32XQCIBM-NEXT: ret
492
+ ;
493
+ ; RV32XQCIBMZBB-LABEL: extu_from_lshr_and_i64:
494
+ ; RV32XQCIBMZBB: # %bb.0:
495
+ ; RV32XQCIBMZBB-NEXT: qc.extu a0, a0, 12, 12
496
+ ; RV32XQCIBMZBB-NEXT: li a1, 0
497
+ ; RV32XQCIBMZBB-NEXT: ret
372
498
%masked = and i64 %x , 16773120
373
499
%shifted = lshr i64 %masked , 12
374
500
ret i64 %shifted
@@ -385,6 +511,11 @@ define i32 @ext_from_ashr_shl_i32(i32 %x) {
385
511
; RV32XQCIBM: # %bb.0:
386
512
; RV32XQCIBM-NEXT: qc.ext a0, a0, 8, 16
387
513
; RV32XQCIBM-NEXT: ret
514
+ ;
515
+ ; RV32XQCIBMZBB-LABEL: ext_from_ashr_shl_i32:
516
+ ; RV32XQCIBMZBB: # %bb.0:
517
+ ; RV32XQCIBMZBB-NEXT: qc.ext a0, a0, 8, 16
518
+ ; RV32XQCIBMZBB-NEXT: ret
388
519
%shl = shl i32 %x , 8
389
520
%ashr = ashr i32 %shl , 24
390
521
ret i32 %ashr
@@ -401,6 +532,11 @@ define i32 @ext_from_ashr_sexti8_i32(i8 %x) {
401
532
; RV32XQCIBM: # %bb.0:
402
533
; RV32XQCIBM-NEXT: qc.ext a0, a0, 3, 5
403
534
; RV32XQCIBM-NEXT: ret
535
+ ;
536
+ ; RV32XQCIBMZBB-LABEL: ext_from_ashr_sexti8_i32:
537
+ ; RV32XQCIBMZBB: # %bb.0:
538
+ ; RV32XQCIBMZBB-NEXT: qc.ext a0, a0, 3, 5
539
+ ; RV32XQCIBMZBB-NEXT: ret
404
540
%sext = sext i8 %x to i32
405
541
%ashr = ashr i32 %sext , 5
406
542
ret i32 %ashr
@@ -417,6 +553,11 @@ define i32 @ext_from_ashr_sexti16_i32(i16 %x) {
417
553
; RV32XQCIBM: # %bb.0:
418
554
; RV32XQCIBM-NEXT: qc.ext a0, a0, 1, 15
419
555
; RV32XQCIBM-NEXT: ret
556
+ ;
557
+ ; RV32XQCIBMZBB-LABEL: ext_from_ashr_sexti16_i32:
558
+ ; RV32XQCIBMZBB: # %bb.0:
559
+ ; RV32XQCIBMZBB-NEXT: qc.ext a0, a0, 1, 15
560
+ ; RV32XQCIBMZBB-NEXT: ret
420
561
%sext = sext i16 %x to i32
421
562
%ashr = ashr i32 %sext , 24
422
563
ret i32 %ashr
0 commit comments