2
2
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3
3
; RUN: | FileCheck %s -check-prefixes=RV32I
4
4
; RUN: llc -mtriple=riscv32 -mattr=+xtheadbb -verify-machineinstrs < %s \
5
- ; RUN: | FileCheck %s -check-prefixes=RV32XTHEADBB
5
+ ; RUN: | FileCheck %s -check-prefixes=RV32XTHEADBB,RV32XTHEADBB-NOB
6
+ ; RUN: llc -mtriple=riscv32 -mattr=+xtheadbb,+b -verify-machineinstrs < %s \
7
+ ; RUN: | FileCheck %s -check-prefixes=RV32XTHEADBB,RV32XTHEADBB-B
6
8
7
9
declare i32 @llvm.ctlz.i32 (i32 , i1 )
8
10
@@ -48,10 +50,15 @@ define i32 @ctlz_i32(i32 %a) nounwind {
48
50
; RV32I-NEXT: li a0, 32
49
51
; RV32I-NEXT: ret
50
52
;
51
- ; RV32XTHEADBB-LABEL: ctlz_i32:
52
- ; RV32XTHEADBB: # %bb.0:
53
- ; RV32XTHEADBB-NEXT: th.ff1 a0, a0
54
- ; RV32XTHEADBB-NEXT: ret
53
+ ; RV32XTHEADBB-NOB-LABEL: ctlz_i32:
54
+ ; RV32XTHEADBB-NOB: # %bb.0:
55
+ ; RV32XTHEADBB-NOB-NEXT: th.ff1 a0, a0
56
+ ; RV32XTHEADBB-NOB-NEXT: ret
57
+ ;
58
+ ; RV32XTHEADBB-B-LABEL: ctlz_i32:
59
+ ; RV32XTHEADBB-B: # %bb.0:
60
+ ; RV32XTHEADBB-B-NEXT: clz a0, a0
61
+ ; RV32XTHEADBB-B-NEXT: ret
55
62
%1 = call i32 @llvm.ctlz.i32 (i32 %a , i1 false )
56
63
ret i32 %1
57
64
}
@@ -135,18 +142,31 @@ define i64 @ctlz_i64(i64 %a) nounwind {
135
142
; RV32I-NEXT: li a1, 0
136
143
; RV32I-NEXT: ret
137
144
;
138
- ; RV32XTHEADBB-LABEL: ctlz_i64:
139
- ; RV32XTHEADBB: # %bb.0:
140
- ; RV32XTHEADBB-NEXT: bnez a1, .LBB1_2
141
- ; RV32XTHEADBB-NEXT: # %bb.1:
142
- ; RV32XTHEADBB-NEXT: th.ff1 a0, a0
143
- ; RV32XTHEADBB-NEXT: addi a0, a0, 32
144
- ; RV32XTHEADBB-NEXT: li a1, 0
145
- ; RV32XTHEADBB-NEXT: ret
146
- ; RV32XTHEADBB-NEXT: .LBB1_2:
147
- ; RV32XTHEADBB-NEXT: th.ff1 a0, a1
148
- ; RV32XTHEADBB-NEXT: li a1, 0
149
- ; RV32XTHEADBB-NEXT: ret
145
+ ; RV32XTHEADBB-NOB-LABEL: ctlz_i64:
146
+ ; RV32XTHEADBB-NOB: # %bb.0:
147
+ ; RV32XTHEADBB-NOB-NEXT: bnez a1, .LBB1_2
148
+ ; RV32XTHEADBB-NOB-NEXT: # %bb.1:
149
+ ; RV32XTHEADBB-NOB-NEXT: th.ff1 a0, a0
150
+ ; RV32XTHEADBB-NOB-NEXT: addi a0, a0, 32
151
+ ; RV32XTHEADBB-NOB-NEXT: li a1, 0
152
+ ; RV32XTHEADBB-NOB-NEXT: ret
153
+ ; RV32XTHEADBB-NOB-NEXT: .LBB1_2:
154
+ ; RV32XTHEADBB-NOB-NEXT: th.ff1 a0, a1
155
+ ; RV32XTHEADBB-NOB-NEXT: li a1, 0
156
+ ; RV32XTHEADBB-NOB-NEXT: ret
157
+ ;
158
+ ; RV32XTHEADBB-B-LABEL: ctlz_i64:
159
+ ; RV32XTHEADBB-B: # %bb.0:
160
+ ; RV32XTHEADBB-B-NEXT: bnez a1, .LBB1_2
161
+ ; RV32XTHEADBB-B-NEXT: # %bb.1:
162
+ ; RV32XTHEADBB-B-NEXT: clz a0, a0
163
+ ; RV32XTHEADBB-B-NEXT: addi a0, a0, 32
164
+ ; RV32XTHEADBB-B-NEXT: li a1, 0
165
+ ; RV32XTHEADBB-B-NEXT: ret
166
+ ; RV32XTHEADBB-B-NEXT: .LBB1_2:
167
+ ; RV32XTHEADBB-B-NEXT: clz a0, a1
168
+ ; RV32XTHEADBB-B-NEXT: li a1, 0
169
+ ; RV32XTHEADBB-B-NEXT: ret
150
170
%1 = call i64 @llvm.ctlz.i64 (i64 %a , i1 false )
151
171
ret i64 %1
152
172
}
@@ -177,20 +197,25 @@ define i32 @cttz_i32(i32 %a) nounwind {
177
197
; RV32I-NEXT: li a0, 32
178
198
; RV32I-NEXT: ret
179
199
;
180
- ; RV32XTHEADBB-LABEL: cttz_i32:
181
- ; RV32XTHEADBB: # %bb.0:
182
- ; RV32XTHEADBB-NEXT: beqz a0, .LBB2_2
183
- ; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false
184
- ; RV32XTHEADBB-NEXT: addi a1, a0, -1
185
- ; RV32XTHEADBB-NEXT: not a0, a0
186
- ; RV32XTHEADBB-NEXT: and a0, a0, a1
187
- ; RV32XTHEADBB-NEXT: th.ff1 a0, a0
188
- ; RV32XTHEADBB-NEXT: li a1, 32
189
- ; RV32XTHEADBB-NEXT: sub a0, a1, a0
190
- ; RV32XTHEADBB-NEXT: ret
191
- ; RV32XTHEADBB-NEXT: .LBB2_2:
192
- ; RV32XTHEADBB-NEXT: li a0, 32
193
- ; RV32XTHEADBB-NEXT: ret
200
+ ; RV32XTHEADBB-NOB-LABEL: cttz_i32:
201
+ ; RV32XTHEADBB-NOB: # %bb.0:
202
+ ; RV32XTHEADBB-NOB-NEXT: beqz a0, .LBB2_2
203
+ ; RV32XTHEADBB-NOB-NEXT: # %bb.1: # %cond.false
204
+ ; RV32XTHEADBB-NOB-NEXT: addi a1, a0, -1
205
+ ; RV32XTHEADBB-NOB-NEXT: not a0, a0
206
+ ; RV32XTHEADBB-NOB-NEXT: and a0, a0, a1
207
+ ; RV32XTHEADBB-NOB-NEXT: th.ff1 a0, a0
208
+ ; RV32XTHEADBB-NOB-NEXT: li a1, 32
209
+ ; RV32XTHEADBB-NOB-NEXT: sub a0, a1, a0
210
+ ; RV32XTHEADBB-NOB-NEXT: ret
211
+ ; RV32XTHEADBB-NOB-NEXT: .LBB2_2:
212
+ ; RV32XTHEADBB-NOB-NEXT: li a0, 32
213
+ ; RV32XTHEADBB-NOB-NEXT: ret
214
+ ;
215
+ ; RV32XTHEADBB-B-LABEL: cttz_i32:
216
+ ; RV32XTHEADBB-B: # %bb.0:
217
+ ; RV32XTHEADBB-B-NEXT: ctz a0, a0
218
+ ; RV32XTHEADBB-B-NEXT: ret
194
219
%1 = call i32 @llvm.cttz.i32 (i32 %a , i1 false )
195
220
ret i32 %1
196
221
}
@@ -252,33 +277,46 @@ define i64 @cttz_i64(i64 %a) nounwind {
252
277
; RV32I-NEXT: addi sp, sp, 32
253
278
; RV32I-NEXT: ret
254
279
;
255
- ; RV32XTHEADBB-LABEL: cttz_i64:
256
- ; RV32XTHEADBB: # %bb.0:
257
- ; RV32XTHEADBB-NEXT: or a2, a0, a1
258
- ; RV32XTHEADBB-NEXT: beqz a2, .LBB3_3
259
- ; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false
260
- ; RV32XTHEADBB-NEXT: bnez a0, .LBB3_4
261
- ; RV32XTHEADBB-NEXT: # %bb.2: # %cond.false
262
- ; RV32XTHEADBB-NEXT: addi a0, a1, -1
263
- ; RV32XTHEADBB-NEXT: not a1, a1
264
- ; RV32XTHEADBB-NEXT: and a0, a1, a0
265
- ; RV32XTHEADBB-NEXT: th.ff1 a0, a0
266
- ; RV32XTHEADBB-NEXT: li a1, 64
267
- ; RV32XTHEADBB-NEXT: j .LBB3_5
268
- ; RV32XTHEADBB-NEXT: .LBB3_3:
269
- ; RV32XTHEADBB-NEXT: li a1, 0
270
- ; RV32XTHEADBB-NEXT: li a0, 64
271
- ; RV32XTHEADBB-NEXT: ret
272
- ; RV32XTHEADBB-NEXT: .LBB3_4:
273
- ; RV32XTHEADBB-NEXT: addi a1, a0, -1
274
- ; RV32XTHEADBB-NEXT: not a0, a0
275
- ; RV32XTHEADBB-NEXT: and a0, a0, a1
276
- ; RV32XTHEADBB-NEXT: th.ff1 a0, a0
277
- ; RV32XTHEADBB-NEXT: li a1, 32
278
- ; RV32XTHEADBB-NEXT: .LBB3_5: # %cond.false
279
- ; RV32XTHEADBB-NEXT: sub a0, a1, a0
280
- ; RV32XTHEADBB-NEXT: li a1, 0
281
- ; RV32XTHEADBB-NEXT: ret
280
+ ; RV32XTHEADBB-NOB-LABEL: cttz_i64:
281
+ ; RV32XTHEADBB-NOB: # %bb.0:
282
+ ; RV32XTHEADBB-NOB-NEXT: or a2, a0, a1
283
+ ; RV32XTHEADBB-NOB-NEXT: beqz a2, .LBB3_3
284
+ ; RV32XTHEADBB-NOB-NEXT: # %bb.1: # %cond.false
285
+ ; RV32XTHEADBB-NOB-NEXT: bnez a0, .LBB3_4
286
+ ; RV32XTHEADBB-NOB-NEXT: # %bb.2: # %cond.false
287
+ ; RV32XTHEADBB-NOB-NEXT: addi a0, a1, -1
288
+ ; RV32XTHEADBB-NOB-NEXT: not a1, a1
289
+ ; RV32XTHEADBB-NOB-NEXT: and a0, a1, a0
290
+ ; RV32XTHEADBB-NOB-NEXT: th.ff1 a0, a0
291
+ ; RV32XTHEADBB-NOB-NEXT: li a1, 64
292
+ ; RV32XTHEADBB-NOB-NEXT: j .LBB3_5
293
+ ; RV32XTHEADBB-NOB-NEXT: .LBB3_3:
294
+ ; RV32XTHEADBB-NOB-NEXT: li a1, 0
295
+ ; RV32XTHEADBB-NOB-NEXT: li a0, 64
296
+ ; RV32XTHEADBB-NOB-NEXT: ret
297
+ ; RV32XTHEADBB-NOB-NEXT: .LBB3_4:
298
+ ; RV32XTHEADBB-NOB-NEXT: addi a1, a0, -1
299
+ ; RV32XTHEADBB-NOB-NEXT: not a0, a0
300
+ ; RV32XTHEADBB-NOB-NEXT: and a0, a0, a1
301
+ ; RV32XTHEADBB-NOB-NEXT: th.ff1 a0, a0
302
+ ; RV32XTHEADBB-NOB-NEXT: li a1, 32
303
+ ; RV32XTHEADBB-NOB-NEXT: .LBB3_5: # %cond.false
304
+ ; RV32XTHEADBB-NOB-NEXT: sub a0, a1, a0
305
+ ; RV32XTHEADBB-NOB-NEXT: li a1, 0
306
+ ; RV32XTHEADBB-NOB-NEXT: ret
307
+ ;
308
+ ; RV32XTHEADBB-B-LABEL: cttz_i64:
309
+ ; RV32XTHEADBB-B: # %bb.0:
310
+ ; RV32XTHEADBB-B-NEXT: bnez a0, .LBB3_2
311
+ ; RV32XTHEADBB-B-NEXT: # %bb.1:
312
+ ; RV32XTHEADBB-B-NEXT: ctz a0, a1
313
+ ; RV32XTHEADBB-B-NEXT: addi a0, a0, 32
314
+ ; RV32XTHEADBB-B-NEXT: li a1, 0
315
+ ; RV32XTHEADBB-B-NEXT: ret
316
+ ; RV32XTHEADBB-B-NEXT: .LBB3_2:
317
+ ; RV32XTHEADBB-B-NEXT: ctz a0, a0
318
+ ; RV32XTHEADBB-B-NEXT: li a1, 0
319
+ ; RV32XTHEADBB-B-NEXT: ret
282
320
%1 = call i64 @llvm.cttz.i64 (i64 %a , i1 false )
283
321
ret i64 %1
284
322
}
@@ -341,10 +379,15 @@ define i32 @sextb_i32(i32 %a) nounwind {
341
379
; RV32I-NEXT: srai a0, a0, 24
342
380
; RV32I-NEXT: ret
343
381
;
344
- ; RV32XTHEADBB-LABEL: sextb_i32:
345
- ; RV32XTHEADBB: # %bb.0:
346
- ; RV32XTHEADBB-NEXT: th.ext a0, a0, 7, 0
347
- ; RV32XTHEADBB-NEXT: ret
382
+ ; RV32XTHEADBB-NOB-LABEL: sextb_i32:
383
+ ; RV32XTHEADBB-NOB: # %bb.0:
384
+ ; RV32XTHEADBB-NOB-NEXT: th.ext a0, a0, 7, 0
385
+ ; RV32XTHEADBB-NOB-NEXT: ret
386
+ ;
387
+ ; RV32XTHEADBB-B-LABEL: sextb_i32:
388
+ ; RV32XTHEADBB-B: # %bb.0:
389
+ ; RV32XTHEADBB-B-NEXT: sext.b a0, a0
390
+ ; RV32XTHEADBB-B-NEXT: ret
348
391
%shl = shl i32 %a , 24
349
392
%shr = ashr exact i32 %shl , 24
350
393
ret i32 %shr
@@ -358,11 +401,17 @@ define i64 @sextb_i64(i64 %a) nounwind {
358
401
; RV32I-NEXT: srai a1, a1, 31
359
402
; RV32I-NEXT: ret
360
403
;
361
- ; RV32XTHEADBB-LABEL: sextb_i64:
362
- ; RV32XTHEADBB: # %bb.0:
363
- ; RV32XTHEADBB-NEXT: th.ext a0, a0, 7, 0
364
- ; RV32XTHEADBB-NEXT: srai a1, a0, 31
365
- ; RV32XTHEADBB-NEXT: ret
404
+ ; RV32XTHEADBB-NOB-LABEL: sextb_i64:
405
+ ; RV32XTHEADBB-NOB: # %bb.0:
406
+ ; RV32XTHEADBB-NOB-NEXT: th.ext a0, a0, 7, 0
407
+ ; RV32XTHEADBB-NOB-NEXT: srai a1, a0, 31
408
+ ; RV32XTHEADBB-NOB-NEXT: ret
409
+ ;
410
+ ; RV32XTHEADBB-B-LABEL: sextb_i64:
411
+ ; RV32XTHEADBB-B: # %bb.0:
412
+ ; RV32XTHEADBB-B-NEXT: sext.b a0, a0
413
+ ; RV32XTHEADBB-B-NEXT: srai a1, a0, 31
414
+ ; RV32XTHEADBB-B-NEXT: ret
366
415
%shl = shl i64 %a , 56
367
416
%shr = ashr exact i64 %shl , 56
368
417
ret i64 %shr
@@ -375,10 +424,15 @@ define i32 @sexth_i32(i32 %a) nounwind {
375
424
; RV32I-NEXT: srai a0, a0, 16
376
425
; RV32I-NEXT: ret
377
426
;
378
- ; RV32XTHEADBB-LABEL: sexth_i32:
379
- ; RV32XTHEADBB: # %bb.0:
380
- ; RV32XTHEADBB-NEXT: th.ext a0, a0, 15, 0
381
- ; RV32XTHEADBB-NEXT: ret
427
+ ; RV32XTHEADBB-NOB-LABEL: sexth_i32:
428
+ ; RV32XTHEADBB-NOB: # %bb.0:
429
+ ; RV32XTHEADBB-NOB-NEXT: th.ext a0, a0, 15, 0
430
+ ; RV32XTHEADBB-NOB-NEXT: ret
431
+ ;
432
+ ; RV32XTHEADBB-B-LABEL: sexth_i32:
433
+ ; RV32XTHEADBB-B: # %bb.0:
434
+ ; RV32XTHEADBB-B-NEXT: sext.h a0, a0
435
+ ; RV32XTHEADBB-B-NEXT: ret
382
436
%shl = shl i32 %a , 16
383
437
%shr = ashr exact i32 %shl , 16
384
438
ret i32 %shr
@@ -409,11 +463,17 @@ define i64 @sexth_i64(i64 %a) nounwind {
409
463
; RV32I-NEXT: srai a1, a1, 31
410
464
; RV32I-NEXT: ret
411
465
;
412
- ; RV32XTHEADBB-LABEL: sexth_i64:
413
- ; RV32XTHEADBB: # %bb.0:
414
- ; RV32XTHEADBB-NEXT: th.ext a0, a0, 15, 0
415
- ; RV32XTHEADBB-NEXT: srai a1, a0, 31
416
- ; RV32XTHEADBB-NEXT: ret
466
+ ; RV32XTHEADBB-NOB-LABEL: sexth_i64:
467
+ ; RV32XTHEADBB-NOB: # %bb.0:
468
+ ; RV32XTHEADBB-NOB-NEXT: th.ext a0, a0, 15, 0
469
+ ; RV32XTHEADBB-NOB-NEXT: srai a1, a0, 31
470
+ ; RV32XTHEADBB-NOB-NEXT: ret
471
+ ;
472
+ ; RV32XTHEADBB-B-LABEL: sexth_i64:
473
+ ; RV32XTHEADBB-B: # %bb.0:
474
+ ; RV32XTHEADBB-B-NEXT: sext.h a0, a0
475
+ ; RV32XTHEADBB-B-NEXT: srai a1, a0, 31
476
+ ; RV32XTHEADBB-B-NEXT: ret
417
477
%shl = shl i64 %a , 48
418
478
%shr = ashr exact i64 %shl , 48
419
479
ret i64 %shr
@@ -477,10 +537,15 @@ define i32 @zexth_i32(i32 %a) nounwind {
477
537
; RV32I-NEXT: srli a0, a0, 16
478
538
; RV32I-NEXT: ret
479
539
;
480
- ; RV32XTHEADBB-LABEL: zexth_i32:
481
- ; RV32XTHEADBB: # %bb.0:
482
- ; RV32XTHEADBB-NEXT: th.extu a0, a0, 15, 0
483
- ; RV32XTHEADBB-NEXT: ret
540
+ ; RV32XTHEADBB-NOB-LABEL: zexth_i32:
541
+ ; RV32XTHEADBB-NOB: # %bb.0:
542
+ ; RV32XTHEADBB-NOB-NEXT: th.extu a0, a0, 15, 0
543
+ ; RV32XTHEADBB-NOB-NEXT: ret
544
+ ;
545
+ ; RV32XTHEADBB-B-LABEL: zexth_i32:
546
+ ; RV32XTHEADBB-B: # %bb.0:
547
+ ; RV32XTHEADBB-B-NEXT: zext.h a0, a0
548
+ ; RV32XTHEADBB-B-NEXT: ret
484
549
%and = and i32 %a , 65535
485
550
ret i32 %and
486
551
}
@@ -493,11 +558,17 @@ define i64 @zexth_i64(i64 %a) nounwind {
493
558
; RV32I-NEXT: li a1, 0
494
559
; RV32I-NEXT: ret
495
560
;
496
- ; RV32XTHEADBB-LABEL: zexth_i64:
497
- ; RV32XTHEADBB: # %bb.0:
498
- ; RV32XTHEADBB-NEXT: th.extu a0, a0, 15, 0
499
- ; RV32XTHEADBB-NEXT: li a1, 0
500
- ; RV32XTHEADBB-NEXT: ret
561
+ ; RV32XTHEADBB-NOB-LABEL: zexth_i64:
562
+ ; RV32XTHEADBB-NOB: # %bb.0:
563
+ ; RV32XTHEADBB-NOB-NEXT: th.extu a0, a0, 15, 0
564
+ ; RV32XTHEADBB-NOB-NEXT: li a1, 0
565
+ ; RV32XTHEADBB-NOB-NEXT: ret
566
+ ;
567
+ ; RV32XTHEADBB-B-LABEL: zexth_i64:
568
+ ; RV32XTHEADBB-B: # %bb.0:
569
+ ; RV32XTHEADBB-B-NEXT: zext.h a0, a0
570
+ ; RV32XTHEADBB-B-NEXT: li a1, 0
571
+ ; RV32XTHEADBB-B-NEXT: ret
501
572
%and = and i64 %a , 65535
502
573
ret i64 %and
503
574
}
@@ -520,10 +591,15 @@ define i32 @bswap_i32(i32 %a) nounwind {
520
591
; RV32I-NEXT: or a0, a0, a1
521
592
; RV32I-NEXT: ret
522
593
;
523
- ; RV32XTHEADBB-LABEL: bswap_i32:
524
- ; RV32XTHEADBB: # %bb.0:
525
- ; RV32XTHEADBB-NEXT: th.rev a0, a0
526
- ; RV32XTHEADBB-NEXT: ret
594
+ ; RV32XTHEADBB-NOB-LABEL: bswap_i32:
595
+ ; RV32XTHEADBB-NOB: # %bb.0:
596
+ ; RV32XTHEADBB-NOB-NEXT: th.rev a0, a0
597
+ ; RV32XTHEADBB-NOB-NEXT: ret
598
+ ;
599
+ ; RV32XTHEADBB-B-LABEL: bswap_i32:
600
+ ; RV32XTHEADBB-B: # %bb.0:
601
+ ; RV32XTHEADBB-B-NEXT: rev8 a0, a0
602
+ ; RV32XTHEADBB-B-NEXT: ret
527
603
%1 = tail call i32 @llvm.bswap.i32 (i32 %a )
528
604
ret i32 %1
529
605
}
@@ -555,12 +631,19 @@ define i64 @bswap_i64(i64 %a) {
555
631
; RV32I-NEXT: or a1, a3, a4
556
632
; RV32I-NEXT: ret
557
633
;
558
- ; RV32XTHEADBB-LABEL: bswap_i64:
559
- ; RV32XTHEADBB: # %bb.0:
560
- ; RV32XTHEADBB-NEXT: th.rev a2, a1
561
- ; RV32XTHEADBB-NEXT: th.rev a1, a0
562
- ; RV32XTHEADBB-NEXT: mv a0, a2
563
- ; RV32XTHEADBB-NEXT: ret
634
+ ; RV32XTHEADBB-NOB-LABEL: bswap_i64:
635
+ ; RV32XTHEADBB-NOB: # %bb.0:
636
+ ; RV32XTHEADBB-NOB-NEXT: th.rev a2, a1
637
+ ; RV32XTHEADBB-NOB-NEXT: th.rev a1, a0
638
+ ; RV32XTHEADBB-NOB-NEXT: mv a0, a2
639
+ ; RV32XTHEADBB-NOB-NEXT: ret
640
+ ;
641
+ ; RV32XTHEADBB-B-LABEL: bswap_i64:
642
+ ; RV32XTHEADBB-B: # %bb.0:
643
+ ; RV32XTHEADBB-B-NEXT: rev8 a2, a1
644
+ ; RV32XTHEADBB-B-NEXT: rev8 a1, a0
645
+ ; RV32XTHEADBB-B-NEXT: mv a0, a2
646
+ ; RV32XTHEADBB-B-NEXT: ret
564
647
%1 = call i64 @llvm.bswap.i64 (i64 %a )
565
648
ret i64 %1
566
649
}
0 commit comments