Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64-legal-i32 / rv64zbs.ll
blob302b1380b9c45c94c58a0d7a4f471fcc1700e7e0
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
3 ; RUN:   -riscv-experimental-rv64-legal-i32 | FileCheck %s -check-prefixes=CHECK,RV64I
4 ; RUN: llc -mtriple=riscv64 -mattr=+zbs -verify-machineinstrs < %s \
5 ; RUN:   -riscv-experimental-rv64-legal-i32 | FileCheck %s -check-prefixes=CHECK,RV64ZBS
7 define signext i32 @bclr_i32(i32 signext %a, i32 signext %b) nounwind {
8 ; CHECK-LABEL: bclr_i32:
9 ; CHECK:       # %bb.0:
10 ; CHECK-NEXT:    li a2, 1
11 ; CHECK-NEXT:    sllw a1, a2, a1
12 ; CHECK-NEXT:    not a1, a1
13 ; CHECK-NEXT:    and a0, a1, a0
14 ; CHECK-NEXT:    ret
15   %and = and i32 %b, 31
16   %shl = shl nuw i32 1, %and
17   %neg = xor i32 %shl, -1
18   %and1 = and i32 %neg, %a
19   ret i32 %and1
22 define signext i32 @bclr_i32_no_mask(i32 signext %a, i32 signext %b) nounwind {
23 ; CHECK-LABEL: bclr_i32_no_mask:
24 ; CHECK:       # %bb.0:
25 ; CHECK-NEXT:    li a2, 1
26 ; CHECK-NEXT:    sllw a1, a2, a1
27 ; CHECK-NEXT:    not a1, a1
28 ; CHECK-NEXT:    and a0, a1, a0
29 ; CHECK-NEXT:    ret
30   %shl = shl i32 1, %b
31   %neg = xor i32 %shl, -1
32   %and1 = and i32 %neg, %a
33   ret i32 %and1
36 define signext i32 @bclr_i32_load(ptr %p, i32 signext %b) nounwind {
37 ; CHECK-LABEL: bclr_i32_load:
38 ; CHECK:       # %bb.0:
39 ; CHECK-NEXT:    lw a0, 0(a0)
40 ; CHECK-NEXT:    li a2, 1
41 ; CHECK-NEXT:    sllw a1, a2, a1
42 ; CHECK-NEXT:    not a1, a1
43 ; CHECK-NEXT:    and a0, a1, a0
44 ; CHECK-NEXT:    ret
45   %a = load i32, ptr %p
46   %shl = shl i32 1, %b
47   %neg = xor i32 %shl, -1
48   %and1 = and i32 %neg, %a
49   ret i32 %and1
52 define i64 @bclr_i64(i64 %a, i64 %b) nounwind {
53 ; RV64I-LABEL: bclr_i64:
54 ; RV64I:       # %bb.0:
55 ; RV64I-NEXT:    li a2, 1
56 ; RV64I-NEXT:    sll a1, a2, a1
57 ; RV64I-NEXT:    not a1, a1
58 ; RV64I-NEXT:    and a0, a1, a0
59 ; RV64I-NEXT:    ret
61 ; RV64ZBS-LABEL: bclr_i64:
62 ; RV64ZBS:       # %bb.0:
63 ; RV64ZBS-NEXT:    bclr a0, a0, a1
64 ; RV64ZBS-NEXT:    ret
65   %and = and i64 %b, 63
66   %shl = shl nuw i64 1, %and
67   %neg = xor i64 %shl, -1
68   %and1 = and i64 %neg, %a
69   ret i64 %and1
72 define i64 @bclr_i64_no_mask(i64 %a, i64 %b) nounwind {
73 ; RV64I-LABEL: bclr_i64_no_mask:
74 ; RV64I:       # %bb.0:
75 ; RV64I-NEXT:    li a2, 1
76 ; RV64I-NEXT:    sll a1, a2, a1
77 ; RV64I-NEXT:    not a1, a1
78 ; RV64I-NEXT:    and a0, a1, a0
79 ; RV64I-NEXT:    ret
81 ; RV64ZBS-LABEL: bclr_i64_no_mask:
82 ; RV64ZBS:       # %bb.0:
83 ; RV64ZBS-NEXT:    bclr a0, a0, a1
84 ; RV64ZBS-NEXT:    ret
85   %shl = shl i64 1, %b
86   %neg = xor i64 %shl, -1
87   %and1 = and i64 %neg, %a
88   ret i64 %and1
91 define signext i32 @bset_i32(i32 signext %a, i32 signext %b) nounwind {
92 ; CHECK-LABEL: bset_i32:
93 ; CHECK:       # %bb.0:
94 ; CHECK-NEXT:    li a2, 1
95 ; CHECK-NEXT:    sllw a1, a2, a1
96 ; CHECK-NEXT:    or a0, a1, a0
97 ; CHECK-NEXT:    ret
98   %and = and i32 %b, 31
99   %shl = shl nuw i32 1, %and
100   %or = or i32 %shl, %a
101   ret i32 %or
104 define signext i32 @bset_i32_no_mask(i32 signext %a, i32 signext %b) nounwind {
105 ; CHECK-LABEL: bset_i32_no_mask:
106 ; CHECK:       # %bb.0:
107 ; CHECK-NEXT:    li a2, 1
108 ; CHECK-NEXT:    sllw a1, a2, a1
109 ; CHECK-NEXT:    or a0, a1, a0
110 ; CHECK-NEXT:    ret
111   %shl = shl i32 1, %b
112   %or = or i32 %shl, %a
113   ret i32 %or
116 define signext i32 @bset_i32_load(ptr %p, i32 signext %b) nounwind {
117 ; CHECK-LABEL: bset_i32_load:
118 ; CHECK:       # %bb.0:
119 ; CHECK-NEXT:    lw a0, 0(a0)
120 ; CHECK-NEXT:    li a2, 1
121 ; CHECK-NEXT:    sllw a1, a2, a1
122 ; CHECK-NEXT:    or a0, a1, a0
123 ; CHECK-NEXT:    ret
124   %a = load i32, ptr %p
125   %shl = shl i32 1, %b
126   %or = or i32 %shl, %a
127   ret i32 %or
130 ; We can use bsetw for 1 << x by setting the first source to zero.
131 define signext i32 @bset_i32_zero(i32 signext %a) nounwind {
132 ; CHECK-LABEL: bset_i32_zero:
133 ; CHECK:       # %bb.0:
134 ; CHECK-NEXT:    li a1, 1
135 ; CHECK-NEXT:    sllw a0, a1, a0
136 ; CHECK-NEXT:    ret
137   %shl = shl i32 1, %a
138   ret i32 %shl
141 define i64 @bset_i64(i64 %a, i64 %b) nounwind {
142 ; RV64I-LABEL: bset_i64:
143 ; RV64I:       # %bb.0:
144 ; RV64I-NEXT:    li a2, 1
145 ; RV64I-NEXT:    sll a1, a2, a1
146 ; RV64I-NEXT:    or a0, a1, a0
147 ; RV64I-NEXT:    ret
149 ; RV64ZBS-LABEL: bset_i64:
150 ; RV64ZBS:       # %bb.0:
151 ; RV64ZBS-NEXT:    bset a0, a0, a1
152 ; RV64ZBS-NEXT:    ret
153   %conv = and i64 %b, 63
154   %shl = shl nuw i64 1, %conv
155   %or = or i64 %shl, %a
156   ret i64 %or
159 define i64 @bset_i64_no_mask(i64 %a, i64 %b) nounwind {
160 ; RV64I-LABEL: bset_i64_no_mask:
161 ; RV64I:       # %bb.0:
162 ; RV64I-NEXT:    li a2, 1
163 ; RV64I-NEXT:    sll a1, a2, a1
164 ; RV64I-NEXT:    or a0, a1, a0
165 ; RV64I-NEXT:    ret
167 ; RV64ZBS-LABEL: bset_i64_no_mask:
168 ; RV64ZBS:       # %bb.0:
169 ; RV64ZBS-NEXT:    bset a0, a0, a1
170 ; RV64ZBS-NEXT:    ret
171   %shl = shl i64 1, %b
172   %or = or i64 %shl, %a
173   ret i64 %or
176 ; We can use bsetw for 1 << x by setting the first source to zero.
177 define signext i64 @bset_i64_zero(i64 signext %a) nounwind {
178 ; RV64I-LABEL: bset_i64_zero:
179 ; RV64I:       # %bb.0:
180 ; RV64I-NEXT:    li a1, 1
181 ; RV64I-NEXT:    sll a0, a1, a0
182 ; RV64I-NEXT:    ret
184 ; RV64ZBS-LABEL: bset_i64_zero:
185 ; RV64ZBS:       # %bb.0:
186 ; RV64ZBS-NEXT:    bset a0, zero, a0
187 ; RV64ZBS-NEXT:    ret
188   %shl = shl i64 1, %a
189   ret i64 %shl
192 define signext i32 @binv_i32(i32 signext %a, i32 signext %b) nounwind {
193 ; CHECK-LABEL: binv_i32:
194 ; CHECK:       # %bb.0:
195 ; CHECK-NEXT:    li a2, 1
196 ; CHECK-NEXT:    sllw a1, a2, a1
197 ; CHECK-NEXT:    xor a0, a1, a0
198 ; CHECK-NEXT:    ret
199   %and = and i32 %b, 31
200   %shl = shl nuw i32 1, %and
201   %xor = xor i32 %shl, %a
202   ret i32 %xor
205 define signext i32 @binv_i32_no_mask(i32 signext %a, i32 signext %b) nounwind {
206 ; CHECK-LABEL: binv_i32_no_mask:
207 ; CHECK:       # %bb.0:
208 ; CHECK-NEXT:    li a2, 1
209 ; CHECK-NEXT:    sllw a1, a2, a1
210 ; CHECK-NEXT:    xor a0, a1, a0
211 ; CHECK-NEXT:    ret
212   %shl = shl i32 1, %b
213   %xor = xor i32 %shl, %a
214   ret i32 %xor
217 define signext i32 @binv_i32_load(ptr %p, i32 signext %b) nounwind {
218 ; CHECK-LABEL: binv_i32_load:
219 ; CHECK:       # %bb.0:
220 ; CHECK-NEXT:    lw a0, 0(a0)
221 ; CHECK-NEXT:    li a2, 1
222 ; CHECK-NEXT:    sllw a1, a2, a1
223 ; CHECK-NEXT:    xor a0, a1, a0
224 ; CHECK-NEXT:    ret
225   %a = load i32, ptr %p
226   %shl = shl i32 1, %b
227   %xor = xor i32 %shl, %a
228   ret i32 %xor
231 define i64 @binv_i64(i64 %a, i64 %b) nounwind {
232 ; RV64I-LABEL: binv_i64:
233 ; RV64I:       # %bb.0:
234 ; RV64I-NEXT:    li a2, 1
235 ; RV64I-NEXT:    sll a1, a2, a1
236 ; RV64I-NEXT:    xor a0, a1, a0
237 ; RV64I-NEXT:    ret
239 ; RV64ZBS-LABEL: binv_i64:
240 ; RV64ZBS:       # %bb.0:
241 ; RV64ZBS-NEXT:    binv a0, a0, a1
242 ; RV64ZBS-NEXT:    ret
243   %conv = and i64 %b, 63
244   %shl = shl nuw i64 1, %conv
245   %xor = xor i64 %shl, %a
246   ret i64 %xor
249 define i64 @binv_i64_no_mask(i64 %a, i64 %b) nounwind {
250 ; RV64I-LABEL: binv_i64_no_mask:
251 ; RV64I:       # %bb.0:
252 ; RV64I-NEXT:    li a2, 1
253 ; RV64I-NEXT:    sll a1, a2, a1
254 ; RV64I-NEXT:    xor a0, a1, a0
255 ; RV64I-NEXT:    ret
257 ; RV64ZBS-LABEL: binv_i64_no_mask:
258 ; RV64ZBS:       # %bb.0:
259 ; RV64ZBS-NEXT:    binv a0, a0, a1
260 ; RV64ZBS-NEXT:    ret
261   %shl = shl nuw i64 1, %b
262   %xor = xor i64 %shl, %a
263   ret i64 %xor
266 define signext i32 @bext_i32(i32 signext %a, i32 signext %b) nounwind {
267 ; RV64I-LABEL: bext_i32:
268 ; RV64I:       # %bb.0:
269 ; RV64I-NEXT:    srlw a0, a0, a1
270 ; RV64I-NEXT:    andi a0, a0, 1
271 ; RV64I-NEXT:    ret
273 ; RV64ZBS-LABEL: bext_i32:
274 ; RV64ZBS:       # %bb.0:
275 ; RV64ZBS-NEXT:    andi a1, a1, 31
276 ; RV64ZBS-NEXT:    srl a0, a0, a1
277 ; RV64ZBS-NEXT:    andi a0, a0, 1
278 ; RV64ZBS-NEXT:    ret
279   %and = and i32 %b, 31
280   %shr = lshr i32 %a, %and
281   %and1 = and i32 %shr, 1
282   ret i32 %and1
285 define signext i32 @bext_i32_no_mask(i32 signext %a, i32 signext %b) nounwind {
286 ; RV64I-LABEL: bext_i32_no_mask:
287 ; RV64I:       # %bb.0:
288 ; RV64I-NEXT:    srlw a0, a0, a1
289 ; RV64I-NEXT:    andi a0, a0, 1
290 ; RV64I-NEXT:    ret
292 ; RV64ZBS-LABEL: bext_i32_no_mask:
293 ; RV64ZBS:       # %bb.0:
294 ; RV64ZBS-NEXT:    srl a0, a0, a1
295 ; RV64ZBS-NEXT:    andi a0, a0, 1
296 ; RV64ZBS-NEXT:    ret
297   %shr = lshr i32 %a, %b
298   %and1 = and i32 %shr, 1
299   ret i32 %and1
302 ; This gets previous converted to (i1 (truncate (srl X, Y)). Make sure we are
303 ; able to use bext.
304 define void @bext_i32_trunc(i32 signext %0, i32 signext %1) {
305 ; RV64I-LABEL: bext_i32_trunc:
306 ; RV64I:       # %bb.0:
307 ; RV64I-NEXT:    srlw a0, a0, a1
308 ; RV64I-NEXT:    andi a0, a0, 1
309 ; RV64I-NEXT:    beqz a0, .LBB19_2
310 ; RV64I-NEXT:  # %bb.1:
311 ; RV64I-NEXT:    ret
312 ; RV64I-NEXT:  .LBB19_2:
313 ; RV64I-NEXT:    tail bar@plt
315 ; RV64ZBS-LABEL: bext_i32_trunc:
316 ; RV64ZBS:       # %bb.0:
317 ; RV64ZBS-NEXT:    bext a0, a0, a1
318 ; RV64ZBS-NEXT:    beqz a0, .LBB19_2
319 ; RV64ZBS-NEXT:  # %bb.1:
320 ; RV64ZBS-NEXT:    ret
321 ; RV64ZBS-NEXT:  .LBB19_2:
322 ; RV64ZBS-NEXT:    tail bar@plt
323   %3 = shl i32 1, %1
324   %4 = and i32 %3, %0
325   %5 = icmp eq i32 %4, 0
326   br i1 %5, label %6, label %7
328 6:                                                ; preds = %2
329   tail call void @bar()
330   br label %7
332 7:                                                ; preds = %6, %2
333   ret void
336 declare void @bar()
338 define i64 @bext_i64(i64 %a, i64 %b) nounwind {
339 ; RV64I-LABEL: bext_i64:
340 ; RV64I:       # %bb.0:
341 ; RV64I-NEXT:    srl a0, a0, a1
342 ; RV64I-NEXT:    andi a0, a0, 1
343 ; RV64I-NEXT:    ret
345 ; RV64ZBS-LABEL: bext_i64:
346 ; RV64ZBS:       # %bb.0:
347 ; RV64ZBS-NEXT:    bext a0, a0, a1
348 ; RV64ZBS-NEXT:    ret
349   %conv = and i64 %b, 63
350   %shr = lshr i64 %a, %conv
351   %and1 = and i64 %shr, 1
352   ret i64 %and1
355 define i64 @bext_i64_no_mask(i64 %a, i64 %b) nounwind {
356 ; RV64I-LABEL: bext_i64_no_mask:
357 ; RV64I:       # %bb.0:
358 ; RV64I-NEXT:    srl a0, a0, a1
359 ; RV64I-NEXT:    andi a0, a0, 1
360 ; RV64I-NEXT:    ret
362 ; RV64ZBS-LABEL: bext_i64_no_mask:
363 ; RV64ZBS:       # %bb.0:
364 ; RV64ZBS-NEXT:    bext a0, a0, a1
365 ; RV64ZBS-NEXT:    ret
366   %shr = lshr i64 %a, %b
367   %and1 = and i64 %shr, 1
368   ret i64 %and1
371 define signext i32 @bexti_i32(i32 signext %a) nounwind {
372 ; RV64I-LABEL: bexti_i32:
373 ; RV64I:       # %bb.0:
374 ; RV64I-NEXT:    slli a0, a0, 58
375 ; RV64I-NEXT:    srli a0, a0, 63
376 ; RV64I-NEXT:    ret
378 ; RV64ZBS-LABEL: bexti_i32:
379 ; RV64ZBS:       # %bb.0:
380 ; RV64ZBS-NEXT:    srliw a0, a0, 5
381 ; RV64ZBS-NEXT:    andi a0, a0, 1
382 ; RV64ZBS-NEXT:    ret
383   %shr = lshr i32 %a, 5
384   %and = and i32 %shr, 1
385   ret i32 %and
388 define i64 @bexti_i64(i64 %a) nounwind {
389 ; RV64I-LABEL: bexti_i64:
390 ; RV64I:       # %bb.0:
391 ; RV64I-NEXT:    slli a0, a0, 58
392 ; RV64I-NEXT:    srli a0, a0, 63
393 ; RV64I-NEXT:    ret
395 ; RV64ZBS-LABEL: bexti_i64:
396 ; RV64ZBS:       # %bb.0:
397 ; RV64ZBS-NEXT:    bexti a0, a0, 5
398 ; RV64ZBS-NEXT:    ret
399   %shr = lshr i64 %a, 5
400   %and = and i64 %shr, 1
401   ret i64 %and
404 define signext i32 @bexti_i32_cmp(i32 signext %a) nounwind {
405 ; CHECK-LABEL: bexti_i32_cmp:
406 ; CHECK:       # %bb.0:
407 ; CHECK-NEXT:    andi a0, a0, 32
408 ; CHECK-NEXT:    snez a0, a0
409 ; CHECK-NEXT:    ret
410   %and = and i32 %a, 32
411   %cmp = icmp ne i32 %and, 0
412   %zext = zext i1 %cmp to i32
413   ret i32 %zext
416 define i64 @bexti_i64_cmp(i64 %a) nounwind {
417 ; RV64I-LABEL: bexti_i64_cmp:
418 ; RV64I:       # %bb.0:
419 ; RV64I-NEXT:    slli a0, a0, 58
420 ; RV64I-NEXT:    srli a0, a0, 63
421 ; RV64I-NEXT:    ret
423 ; RV64ZBS-LABEL: bexti_i64_cmp:
424 ; RV64ZBS:       # %bb.0:
425 ; RV64ZBS-NEXT:    bexti a0, a0, 5
426 ; RV64ZBS-NEXT:    ret
427   %and = and i64 %a, 32
428   %cmp = icmp ne i64 %and, 0
429   %zext = zext i1 %cmp to i64
430   ret i64 %zext
433 define signext i32 @bclri_i32_10(i32 signext %a) nounwind {
434 ; CHECK-LABEL: bclri_i32_10:
435 ; CHECK:       # %bb.0:
436 ; CHECK-NEXT:    andi a0, a0, -1025
437 ; CHECK-NEXT:    ret
438   %and = and i32 %a, -1025
439   ret i32 %and
442 define signext i32 @bclri_i32_11(i32 signext %a) nounwind {
443 ; CHECK-LABEL: bclri_i32_11:
444 ; CHECK:       # %bb.0:
445 ; CHECK-NEXT:    lui a1, 1048575
446 ; CHECK-NEXT:    addiw a1, a1, 2047
447 ; CHECK-NEXT:    and a0, a0, a1
448 ; CHECK-NEXT:    ret
449   %and = and i32 %a, -2049
450   ret i32 %and
453 define signext i32 @bclri_i32_30(i32 signext %a) nounwind {
454 ; CHECK-LABEL: bclri_i32_30:
455 ; CHECK:       # %bb.0:
456 ; CHECK-NEXT:    lui a1, 786432
457 ; CHECK-NEXT:    addiw a1, a1, -1
458 ; CHECK-NEXT:    and a0, a0, a1
459 ; CHECK-NEXT:    ret
460   %and = and i32 %a, -1073741825
461   ret i32 %and
464 define signext i32 @bclri_i32_31(i32 signext %a) nounwind {
465 ; CHECK-LABEL: bclri_i32_31:
466 ; CHECK:       # %bb.0:
467 ; CHECK-NEXT:    lui a1, 524288
468 ; CHECK-NEXT:    addiw a1, a1, -1
469 ; CHECK-NEXT:    and a0, a0, a1
470 ; CHECK-NEXT:    ret
471   %and = and i32 %a, -2147483649
472   ret i32 %and
475 define i64 @bclri_i64_10(i64 %a) nounwind {
476 ; CHECK-LABEL: bclri_i64_10:
477 ; CHECK:       # %bb.0:
478 ; CHECK-NEXT:    andi a0, a0, -1025
479 ; CHECK-NEXT:    ret
480   %and = and i64 %a, -1025
481   ret i64 %and
484 define i64 @bclri_i64_11(i64 %a) nounwind {
485 ; RV64I-LABEL: bclri_i64_11:
486 ; RV64I:       # %bb.0:
487 ; RV64I-NEXT:    lui a1, 1048575
488 ; RV64I-NEXT:    addiw a1, a1, 2047
489 ; RV64I-NEXT:    and a0, a0, a1
490 ; RV64I-NEXT:    ret
492 ; RV64ZBS-LABEL: bclri_i64_11:
493 ; RV64ZBS:       # %bb.0:
494 ; RV64ZBS-NEXT:    bclri a0, a0, 11
495 ; RV64ZBS-NEXT:    ret
496   %and = and i64 %a, -2049
497   ret i64 %and
500 define i64 @bclri_i64_30(i64 %a) nounwind {
501 ; RV64I-LABEL: bclri_i64_30:
502 ; RV64I:       # %bb.0:
503 ; RV64I-NEXT:    lui a1, 786432
504 ; RV64I-NEXT:    addiw a1, a1, -1
505 ; RV64I-NEXT:    and a0, a0, a1
506 ; RV64I-NEXT:    ret
508 ; RV64ZBS-LABEL: bclri_i64_30:
509 ; RV64ZBS:       # %bb.0:
510 ; RV64ZBS-NEXT:    bclri a0, a0, 30
511 ; RV64ZBS-NEXT:    ret
512   %and = and i64 %a, -1073741825
513   ret i64 %and
516 define i64 @bclri_i64_31(i64 %a) nounwind {
517 ; RV64I-LABEL: bclri_i64_31:
518 ; RV64I:       # %bb.0:
519 ; RV64I-NEXT:    lui a1, 524288
520 ; RV64I-NEXT:    addi a1, a1, -1
521 ; RV64I-NEXT:    and a0, a0, a1
522 ; RV64I-NEXT:    ret
524 ; RV64ZBS-LABEL: bclri_i64_31:
525 ; RV64ZBS:       # %bb.0:
526 ; RV64ZBS-NEXT:    bclri a0, a0, 31
527 ; RV64ZBS-NEXT:    ret
528   %and = and i64 %a, -2147483649
529   ret i64 %and
532 define i64 @bclri_i64_62(i64 %a) nounwind {
533 ; RV64I-LABEL: bclri_i64_62:
534 ; RV64I:       # %bb.0:
535 ; RV64I-NEXT:    li a1, -1
536 ; RV64I-NEXT:    slli a1, a1, 62
537 ; RV64I-NEXT:    addi a1, a1, -1
538 ; RV64I-NEXT:    and a0, a0, a1
539 ; RV64I-NEXT:    ret
541 ; RV64ZBS-LABEL: bclri_i64_62:
542 ; RV64ZBS:       # %bb.0:
543 ; RV64ZBS-NEXT:    bclri a0, a0, 62
544 ; RV64ZBS-NEXT:    ret
545   %and = and i64 %a, -4611686018427387905
546   ret i64 %and
549 define i64 @bclri_i64_63(i64 %a) nounwind {
550 ; RV64I-LABEL: bclri_i64_63:
551 ; RV64I:       # %bb.0:
552 ; RV64I-NEXT:    slli a0, a0, 1
553 ; RV64I-NEXT:    srli a0, a0, 1
554 ; RV64I-NEXT:    ret
556 ; RV64ZBS-LABEL: bclri_i64_63:
557 ; RV64ZBS:       # %bb.0:
558 ; RV64ZBS-NEXT:    bclri a0, a0, 63
559 ; RV64ZBS-NEXT:    ret
560   %and = and i64 %a, -9223372036854775809
561   ret i64 %and
564 define i64 @bclri_i64_large0(i64 %a) nounwind {
565 ; RV64I-LABEL: bclri_i64_large0:
566 ; RV64I:       # %bb.0:
567 ; RV64I-NEXT:    lui a1, 1044480
568 ; RV64I-NEXT:    addiw a1, a1, -256
569 ; RV64I-NEXT:    and a0, a0, a1
570 ; RV64I-NEXT:    ret
572 ; RV64ZBS-LABEL: bclri_i64_large0:
573 ; RV64ZBS:       # %bb.0:
574 ; RV64ZBS-NEXT:    andi a0, a0, -256
575 ; RV64ZBS-NEXT:    bclri a0, a0, 24
576 ; RV64ZBS-NEXT:    ret
577   %and = and i64 %a, -16777472
578   ret i64 %and
581 define i64 @bclri_i64_large1(i64 %a) nounwind {
582 ; RV64I-LABEL: bclri_i64_large1:
583 ; RV64I:       # %bb.0:
584 ; RV64I-NEXT:    lui a1, 1044464
585 ; RV64I-NEXT:    addiw a1, a1, -1
586 ; RV64I-NEXT:    and a0, a0, a1
587 ; RV64I-NEXT:    ret
589 ; RV64ZBS-LABEL: bclri_i64_large1:
590 ; RV64ZBS:       # %bb.0:
591 ; RV64ZBS-NEXT:    bclri a0, a0, 16
592 ; RV64ZBS-NEXT:    bclri a0, a0, 24
593 ; RV64ZBS-NEXT:    ret
594   %and = and i64 %a, -16842753
595   ret i64 %and
598 define signext i32 @bseti_i32_10(i32 signext %a) nounwind {
599 ; CHECK-LABEL: bseti_i32_10:
600 ; CHECK:       # %bb.0:
601 ; CHECK-NEXT:    ori a0, a0, 1024
602 ; CHECK-NEXT:    ret
603   %or = or i32 %a, 1024
604   ret i32 %or
607 define signext i32 @bseti_i32_11(i32 signext %a) nounwind {
608 ; RV64I-LABEL: bseti_i32_11:
609 ; RV64I:       # %bb.0:
610 ; RV64I-NEXT:    li a1, 1
611 ; RV64I-NEXT:    slliw a1, a1, 11
612 ; RV64I-NEXT:    or a0, a0, a1
613 ; RV64I-NEXT:    ret
615 ; RV64ZBS-LABEL: bseti_i32_11:
616 ; RV64ZBS:       # %bb.0:
617 ; RV64ZBS-NEXT:    bseti a1, zero, 11
618 ; RV64ZBS-NEXT:    or a0, a0, a1
619 ; RV64ZBS-NEXT:    sext.w a0, a0
620 ; RV64ZBS-NEXT:    ret
621   %or = or i32 %a, 2048
622   ret i32 %or
625 define signext i32 @bseti_i32_30(i32 signext %a) nounwind {
626 ; CHECK-LABEL: bseti_i32_30:
627 ; CHECK:       # %bb.0:
628 ; CHECK-NEXT:    lui a1, 262144
629 ; CHECK-NEXT:    or a0, a0, a1
630 ; CHECK-NEXT:    ret
631   %or = or i32 %a, 1073741824
632   ret i32 %or
635 define signext i32 @bseti_i32_31(i32 signext %a) nounwind {
636 ; CHECK-LABEL: bseti_i32_31:
637 ; CHECK:       # %bb.0:
638 ; CHECK-NEXT:    lui a1, 524288
639 ; CHECK-NEXT:    or a0, a0, a1
640 ; CHECK-NEXT:    ret
641   %or = or i32 %a, 2147483648
642   ret i32 %or
645 define i64 @bseti_i64_10(i64 %a) nounwind {
646 ; CHECK-LABEL: bseti_i64_10:
647 ; CHECK:       # %bb.0:
648 ; CHECK-NEXT:    ori a0, a0, 1024
649 ; CHECK-NEXT:    ret
650   %or = or i64 %a, 1024
651   ret i64 %or
654 define i64 @bseti_i64_11(i64 %a) nounwind {
655 ; RV64I-LABEL: bseti_i64_11:
656 ; RV64I:       # %bb.0:
657 ; RV64I-NEXT:    li a1, 1
658 ; RV64I-NEXT:    slli a1, a1, 11
659 ; RV64I-NEXT:    or a0, a0, a1
660 ; RV64I-NEXT:    ret
662 ; RV64ZBS-LABEL: bseti_i64_11:
663 ; RV64ZBS:       # %bb.0:
664 ; RV64ZBS-NEXT:    bseti a0, a0, 11
665 ; RV64ZBS-NEXT:    ret
666   %or = or i64 %a, 2048
667   ret i64 %or
670 define i64 @bseti_i64_30(i64 %a) nounwind {
671 ; RV64I-LABEL: bseti_i64_30:
672 ; RV64I:       # %bb.0:
673 ; RV64I-NEXT:    lui a1, 262144
674 ; RV64I-NEXT:    or a0, a0, a1
675 ; RV64I-NEXT:    ret
677 ; RV64ZBS-LABEL: bseti_i64_30:
678 ; RV64ZBS:       # %bb.0:
679 ; RV64ZBS-NEXT:    bseti a0, a0, 30
680 ; RV64ZBS-NEXT:    ret
681   %or = or i64 %a, 1073741824
682   ret i64 %or
685 define i64 @bseti_i64_31(i64 %a) nounwind {
686 ; RV64I-LABEL: bseti_i64_31:
687 ; RV64I:       # %bb.0:
688 ; RV64I-NEXT:    li a1, 1
689 ; RV64I-NEXT:    slli a1, a1, 31
690 ; RV64I-NEXT:    or a0, a0, a1
691 ; RV64I-NEXT:    ret
693 ; RV64ZBS-LABEL: bseti_i64_31:
694 ; RV64ZBS:       # %bb.0:
695 ; RV64ZBS-NEXT:    bseti a0, a0, 31
696 ; RV64ZBS-NEXT:    ret
697   %or = or i64 %a, 2147483648
698   ret i64 %or
701 define i64 @bseti_i64_62(i64 %a) nounwind {
702 ; RV64I-LABEL: bseti_i64_62:
703 ; RV64I:       # %bb.0:
704 ; RV64I-NEXT:    li a1, 1
705 ; RV64I-NEXT:    slli a1, a1, 62
706 ; RV64I-NEXT:    or a0, a0, a1
707 ; RV64I-NEXT:    ret
709 ; RV64ZBS-LABEL: bseti_i64_62:
710 ; RV64ZBS:       # %bb.0:
711 ; RV64ZBS-NEXT:    bseti a0, a0, 62
712 ; RV64ZBS-NEXT:    ret
713   %or = or i64 %a, 4611686018427387904
714   ret i64 %or
717 define i64 @bseti_i64_63(i64 %a) nounwind {
718 ; RV64I-LABEL: bseti_i64_63:
719 ; RV64I:       # %bb.0:
720 ; RV64I-NEXT:    li a1, -1
721 ; RV64I-NEXT:    slli a1, a1, 63
722 ; RV64I-NEXT:    or a0, a0, a1
723 ; RV64I-NEXT:    ret
725 ; RV64ZBS-LABEL: bseti_i64_63:
726 ; RV64ZBS:       # %bb.0:
727 ; RV64ZBS-NEXT:    bseti a0, a0, 63
728 ; RV64ZBS-NEXT:    ret
729   %or = or i64 %a, 9223372036854775808
730   ret i64 %or
733 define signext i32 @binvi_i32_10(i32 signext %a) nounwind {
734 ; CHECK-LABEL: binvi_i32_10:
735 ; CHECK:       # %bb.0:
736 ; CHECK-NEXT:    xori a0, a0, 1024
737 ; CHECK-NEXT:    ret
738   %xor = xor i32 %a, 1024
739   ret i32 %xor
742 define signext i32 @binvi_i32_11(i32 signext %a) nounwind {
743 ; RV64I-LABEL: binvi_i32_11:
744 ; RV64I:       # %bb.0:
745 ; RV64I-NEXT:    li a1, 1
746 ; RV64I-NEXT:    slliw a1, a1, 11
747 ; RV64I-NEXT:    xor a0, a0, a1
748 ; RV64I-NEXT:    ret
750 ; RV64ZBS-LABEL: binvi_i32_11:
751 ; RV64ZBS:       # %bb.0:
752 ; RV64ZBS-NEXT:    bseti a1, zero, 11
753 ; RV64ZBS-NEXT:    xor a0, a0, a1
754 ; RV64ZBS-NEXT:    sext.w a0, a0
755 ; RV64ZBS-NEXT:    ret
756   %xor = xor i32 %a, 2048
757   ret i32 %xor
760 define signext i32 @binvi_i32_30(i32 signext %a) nounwind {
761 ; CHECK-LABEL: binvi_i32_30:
762 ; CHECK:       # %bb.0:
763 ; CHECK-NEXT:    lui a1, 262144
764 ; CHECK-NEXT:    xor a0, a0, a1
765 ; CHECK-NEXT:    ret
766   %xor = xor i32 %a, 1073741824
767   ret i32 %xor
770 define signext i32 @binvi_i32_31(i32 signext %a) nounwind {
771 ; CHECK-LABEL: binvi_i32_31:
772 ; CHECK:       # %bb.0:
773 ; CHECK-NEXT:    lui a1, 524288
774 ; CHECK-NEXT:    xor a0, a0, a1
775 ; CHECK-NEXT:    ret
776   %xor = xor i32 %a, 2147483648
777   ret i32 %xor
780 define i64 @binvi_i64_10(i64 %a) nounwind {
781 ; CHECK-LABEL: binvi_i64_10:
782 ; CHECK:       # %bb.0:
783 ; CHECK-NEXT:    xori a0, a0, 1024
784 ; CHECK-NEXT:    ret
785   %xor = xor i64 %a, 1024
786   ret i64 %xor
789 define i64 @binvi_i64_11(i64 %a) nounwind {
790 ; RV64I-LABEL: binvi_i64_11:
791 ; RV64I:       # %bb.0:
792 ; RV64I-NEXT:    li a1, 1
793 ; RV64I-NEXT:    slli a1, a1, 11
794 ; RV64I-NEXT:    xor a0, a0, a1
795 ; RV64I-NEXT:    ret
797 ; RV64ZBS-LABEL: binvi_i64_11:
798 ; RV64ZBS:       # %bb.0:
799 ; RV64ZBS-NEXT:    binvi a0, a0, 11
800 ; RV64ZBS-NEXT:    ret
801   %xor = xor i64 %a, 2048
802   ret i64 %xor
805 define i64 @binvi_i64_30(i64 %a) nounwind {
806 ; RV64I-LABEL: binvi_i64_30:
807 ; RV64I:       # %bb.0:
808 ; RV64I-NEXT:    lui a1, 262144
809 ; RV64I-NEXT:    xor a0, a0, a1
810 ; RV64I-NEXT:    ret
812 ; RV64ZBS-LABEL: binvi_i64_30:
813 ; RV64ZBS:       # %bb.0:
814 ; RV64ZBS-NEXT:    binvi a0, a0, 30
815 ; RV64ZBS-NEXT:    ret
816   %xor = xor i64 %a, 1073741824
817   ret i64 %xor
820 define i64 @binvi_i64_31(i64 %a) nounwind {
821 ; RV64I-LABEL: binvi_i64_31:
822 ; RV64I:       # %bb.0:
823 ; RV64I-NEXT:    li a1, 1
824 ; RV64I-NEXT:    slli a1, a1, 31
825 ; RV64I-NEXT:    xor a0, a0, a1
826 ; RV64I-NEXT:    ret
828 ; RV64ZBS-LABEL: binvi_i64_31:
829 ; RV64ZBS:       # %bb.0:
830 ; RV64ZBS-NEXT:    binvi a0, a0, 31
831 ; RV64ZBS-NEXT:    ret
832   %xor = xor i64 %a, 2147483648
833   ret i64 %xor
836 define i64 @binvi_i64_62(i64 %a) nounwind {
837 ; RV64I-LABEL: binvi_i64_62:
838 ; RV64I:       # %bb.0:
839 ; RV64I-NEXT:    li a1, 1
840 ; RV64I-NEXT:    slli a1, a1, 62
841 ; RV64I-NEXT:    xor a0, a0, a1
842 ; RV64I-NEXT:    ret
844 ; RV64ZBS-LABEL: binvi_i64_62:
845 ; RV64ZBS:       # %bb.0:
846 ; RV64ZBS-NEXT:    binvi a0, a0, 62
847 ; RV64ZBS-NEXT:    ret
848   %xor = xor i64 %a, 4611686018427387904
849   ret i64 %xor
852 define i64 @binvi_i64_63(i64 %a) nounwind {
853 ; RV64I-LABEL: binvi_i64_63:
854 ; RV64I:       # %bb.0:
855 ; RV64I-NEXT:    li a1, -1
856 ; RV64I-NEXT:    slli a1, a1, 63
857 ; RV64I-NEXT:    xor a0, a0, a1
858 ; RV64I-NEXT:    ret
860 ; RV64ZBS-LABEL: binvi_i64_63:
861 ; RV64ZBS:       # %bb.0:
862 ; RV64ZBS-NEXT:    binvi a0, a0, 63
863 ; RV64ZBS-NEXT:    ret
864   %xor = xor i64 %a, 9223372036854775808
865   ret i64 %xor
868 define i64 @xor_i64_large(i64 %a) nounwind {
869 ; RV64I-LABEL: xor_i64_large:
870 ; RV64I:       # %bb.0:
871 ; RV64I-NEXT:    li a1, 1
872 ; RV64I-NEXT:    slli a1, a1, 32
873 ; RV64I-NEXT:    addi a1, a1, 1
874 ; RV64I-NEXT:    xor a0, a0, a1
875 ; RV64I-NEXT:    ret
877 ; RV64ZBS-LABEL: xor_i64_large:
878 ; RV64ZBS:       # %bb.0:
879 ; RV64ZBS-NEXT:    binvi a0, a0, 0
880 ; RV64ZBS-NEXT:    binvi a0, a0, 32
881 ; RV64ZBS-NEXT:    ret
882   %xor = xor i64 %a, 4294967297
883   ret i64 %xor
886 define i64 @xor_i64_4099(i64 %a) nounwind {
887 ; RV64I-LABEL: xor_i64_4099:
888 ; RV64I:       # %bb.0:
889 ; RV64I-NEXT:    lui a1, 1
890 ; RV64I-NEXT:    addiw a1, a1, 3
891 ; RV64I-NEXT:    xor a0, a0, a1
892 ; RV64I-NEXT:    ret
894 ; RV64ZBS-LABEL: xor_i64_4099:
895 ; RV64ZBS:       # %bb.0:
896 ; RV64ZBS-NEXT:    xori a0, a0, 3
897 ; RV64ZBS-NEXT:    binvi a0, a0, 12
898 ; RV64ZBS-NEXT:    ret
899   %xor = xor i64 %a, 4099
900   ret i64 %xor
903 define i64 @xor_i64_96(i64 %a) nounwind {
904 ; CHECK-LABEL: xor_i64_96:
905 ; CHECK:       # %bb.0:
906 ; CHECK-NEXT:    xori a0, a0, 96
907 ; CHECK-NEXT:    ret
908   %xor = xor i64 %a, 96
909   ret i64 %xor
912 define i64 @or_i64_large(i64 %a) nounwind {
913 ; RV64I-LABEL: or_i64_large:
914 ; RV64I:       # %bb.0:
915 ; RV64I-NEXT:    li a1, 1
916 ; RV64I-NEXT:    slli a1, a1, 32
917 ; RV64I-NEXT:    addi a1, a1, 1
918 ; RV64I-NEXT:    or a0, a0, a1
919 ; RV64I-NEXT:    ret
921 ; RV64ZBS-LABEL: or_i64_large:
922 ; RV64ZBS:       # %bb.0:
923 ; RV64ZBS-NEXT:    bseti a0, a0, 0
924 ; RV64ZBS-NEXT:    bseti a0, a0, 32
925 ; RV64ZBS-NEXT:    ret
926   %or = or i64 %a, 4294967297
927   ret i64 %or
930 define i64 @xor_i64_66901(i64 %a) nounwind {
931 ; RV64I-LABEL: xor_i64_66901:
932 ; RV64I:       # %bb.0:
933 ; RV64I-NEXT:    lui a1, 16
934 ; RV64I-NEXT:    addiw a1, a1, 1365
935 ; RV64I-NEXT:    xor a0, a0, a1
936 ; RV64I-NEXT:    ret
938 ; RV64ZBS-LABEL: xor_i64_66901:
939 ; RV64ZBS:       # %bb.0:
940 ; RV64ZBS-NEXT:    xori a0, a0, 1365
941 ; RV64ZBS-NEXT:    binvi a0, a0, 16
942 ; RV64ZBS-NEXT:    ret
943   %xor = xor i64 %a, 66901
944   ret i64 %xor
947 define i64 @or_i64_4099(i64 %a) nounwind {
948 ; RV64I-LABEL: or_i64_4099:
949 ; RV64I:       # %bb.0:
950 ; RV64I-NEXT:    lui a1, 1
951 ; RV64I-NEXT:    addiw a1, a1, 3
952 ; RV64I-NEXT:    or a0, a0, a1
953 ; RV64I-NEXT:    ret
955 ; RV64ZBS-LABEL: or_i64_4099:
956 ; RV64ZBS:       # %bb.0:
957 ; RV64ZBS-NEXT:    ori a0, a0, 3
958 ; RV64ZBS-NEXT:    bseti a0, a0, 12
959 ; RV64ZBS-NEXT:    ret
960   %or = or i64 %a, 4099
961   ret i64 %or
964 define i64 @or_i64_96(i64 %a) nounwind {
965 ; CHECK-LABEL: or_i64_96:
966 ; CHECK:       # %bb.0:
967 ; CHECK-NEXT:    ori a0, a0, 96
968 ; CHECK-NEXT:    ret
969   %or = or i64 %a, 96
970   ret i64 %or
973 define i64 @or_i64_66901(i64 %a) nounwind {
974 ; RV64I-LABEL: or_i64_66901:
975 ; RV64I:       # %bb.0:
976 ; RV64I-NEXT:    lui a1, 16
977 ; RV64I-NEXT:    addiw a1, a1, 1365
978 ; RV64I-NEXT:    or a0, a0, a1
979 ; RV64I-NEXT:    ret
981 ; RV64ZBS-LABEL: or_i64_66901:
982 ; RV64ZBS:       # %bb.0:
983 ; RV64ZBS-NEXT:    ori a0, a0, 1365
984 ; RV64ZBS-NEXT:    bseti a0, a0, 16
985 ; RV64ZBS-NEXT:    ret
986   %or = or i64 %a, 66901
987   ret i64 %or