[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64zbs.ll
blob44276620ba637d032a34f26b56cb8af3df1b2b51
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefix=RV64I
4 ; RUN: llc -mtriple=riscv64 -mattr=+experimental-b -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefix=RV64B
6 ; RUN: llc -mtriple=riscv64 -mattr=+experimental-zbs -verify-machineinstrs < %s \
7 ; RUN:   | FileCheck %s -check-prefix=RV64ZBS
9 define signext i32 @sbclr_i32(i32 signext %a, i32 signext %b) nounwind {
10 ; RV64I-LABEL: sbclr_i32:
11 ; RV64I:       # %bb.0:
12 ; RV64I-NEXT:    addi a2, zero, 1
13 ; RV64I-NEXT:    sllw a1, a2, a1
14 ; RV64I-NEXT:    not a1, a1
15 ; RV64I-NEXT:    and a0, a1, a0
16 ; RV64I-NEXT:    ret
18 ; RV64B-LABEL: sbclr_i32:
19 ; RV64B:       # %bb.0:
20 ; RV64B-NEXT:    addi a2, zero, 1
21 ; RV64B-NEXT:    sllw a1, a2, a1
22 ; RV64B-NEXT:    andn a0, a0, a1
23 ; RV64B-NEXT:    ret
25 ; RV64ZBS-LABEL: sbclr_i32:
26 ; RV64ZBS:       # %bb.0:
27 ; RV64ZBS-NEXT:    addi a2, zero, 1
28 ; RV64ZBS-NEXT:    sllw a1, a2, a1
29 ; RV64ZBS-NEXT:    not a1, a1
30 ; RV64ZBS-NEXT:    and a0, a1, a0
31 ; RV64ZBS-NEXT:    ret
32   %and = and i32 %b, 31
33   %shl = shl nuw i32 1, %and
34   %neg = xor i32 %shl, -1
35   %and1 = and i32 %neg, %a
36   ret i32 %and1
39 define signext i32 @sbclr_i32_no_mask(i32 signext %a, i32 signext %b) nounwind {
40 ; RV64I-LABEL: sbclr_i32_no_mask:
41 ; RV64I:       # %bb.0:
42 ; RV64I-NEXT:    addi a2, zero, 1
43 ; RV64I-NEXT:    sllw a1, a2, a1
44 ; RV64I-NEXT:    not a1, a1
45 ; RV64I-NEXT:    and a0, a1, a0
46 ; RV64I-NEXT:    ret
48 ; RV64B-LABEL: sbclr_i32_no_mask:
49 ; RV64B:       # %bb.0:
50 ; RV64B-NEXT:    addi a2, zero, 1
51 ; RV64B-NEXT:    sllw a1, a2, a1
52 ; RV64B-NEXT:    andn a0, a0, a1
53 ; RV64B-NEXT:    ret
55 ; RV64ZBS-LABEL: sbclr_i32_no_mask:
56 ; RV64ZBS:       # %bb.0:
57 ; RV64ZBS-NEXT:    addi a2, zero, 1
58 ; RV64ZBS-NEXT:    sllw a1, a2, a1
59 ; RV64ZBS-NEXT:    not a1, a1
60 ; RV64ZBS-NEXT:    and a0, a1, a0
61 ; RV64ZBS-NEXT:    ret
62   %shl = shl i32 1, %b
63   %neg = xor i32 %shl, -1
64   %and1 = and i32 %neg, %a
65   ret i32 %and1
68 define signext i32 @sbclr_i32_load(i32* %p, i32 signext %b) nounwind {
69 ; RV64I-LABEL: sbclr_i32_load:
70 ; RV64I:       # %bb.0:
71 ; RV64I-NEXT:    lw a0, 0(a0)
72 ; RV64I-NEXT:    addi a2, zero, 1
73 ; RV64I-NEXT:    sllw a1, a2, a1
74 ; RV64I-NEXT:    not a1, a1
75 ; RV64I-NEXT:    and a0, a1, a0
76 ; RV64I-NEXT:    sext.w a0, a0
77 ; RV64I-NEXT:    ret
79 ; RV64B-LABEL: sbclr_i32_load:
80 ; RV64B:       # %bb.0:
81 ; RV64B-NEXT:    lw a0, 0(a0)
82 ; RV64B-NEXT:    addi a2, zero, 1
83 ; RV64B-NEXT:    sllw a1, a2, a1
84 ; RV64B-NEXT:    andn a0, a0, a1
85 ; RV64B-NEXT:    sext.w a0, a0
86 ; RV64B-NEXT:    ret
88 ; RV64ZBS-LABEL: sbclr_i32_load:
89 ; RV64ZBS:       # %bb.0:
90 ; RV64ZBS-NEXT:    lw a0, 0(a0)
91 ; RV64ZBS-NEXT:    addi a2, zero, 1
92 ; RV64ZBS-NEXT:    sllw a1, a2, a1
93 ; RV64ZBS-NEXT:    not a1, a1
94 ; RV64ZBS-NEXT:    and a0, a1, a0
95 ; RV64ZBS-NEXT:    sext.w a0, a0
96 ; RV64ZBS-NEXT:    ret
97   %a = load i32, i32* %p
98   %shl = shl i32 1, %b
99   %neg = xor i32 %shl, -1
100   %and1 = and i32 %neg, %a
101   ret i32 %and1
104 define i64 @sbclr_i64(i64 %a, i64 %b) nounwind {
105 ; RV64I-LABEL: sbclr_i64:
106 ; RV64I:       # %bb.0:
107 ; RV64I-NEXT:    addi a2, zero, 1
108 ; RV64I-NEXT:    sll a1, a2, a1
109 ; RV64I-NEXT:    not a1, a1
110 ; RV64I-NEXT:    and a0, a1, a0
111 ; RV64I-NEXT:    ret
113 ; RV64B-LABEL: sbclr_i64:
114 ; RV64B:       # %bb.0:
115 ; RV64B-NEXT:    bclr a0, a0, a1
116 ; RV64B-NEXT:    ret
118 ; RV64ZBS-LABEL: sbclr_i64:
119 ; RV64ZBS:       # %bb.0:
120 ; RV64ZBS-NEXT:    bclr a0, a0, a1
121 ; RV64ZBS-NEXT:    ret
122   %and = and i64 %b, 63
123   %shl = shl nuw i64 1, %and
124   %neg = xor i64 %shl, -1
125   %and1 = and i64 %neg, %a
126   ret i64 %and1
129 define i64 @sbclr_i64_no_mask(i64 %a, i64 %b) nounwind {
130 ; RV64I-LABEL: sbclr_i64_no_mask:
131 ; RV64I:       # %bb.0:
132 ; RV64I-NEXT:    addi a2, zero, 1
133 ; RV64I-NEXT:    sll a1, a2, a1
134 ; RV64I-NEXT:    not a1, a1
135 ; RV64I-NEXT:    and a0, a1, a0
136 ; RV64I-NEXT:    ret
138 ; RV64B-LABEL: sbclr_i64_no_mask:
139 ; RV64B:       # %bb.0:
140 ; RV64B-NEXT:    bclr a0, a0, a1
141 ; RV64B-NEXT:    ret
143 ; RV64ZBS-LABEL: sbclr_i64_no_mask:
144 ; RV64ZBS:       # %bb.0:
145 ; RV64ZBS-NEXT:    bclr a0, a0, a1
146 ; RV64ZBS-NEXT:    ret
147   %shl = shl i64 1, %b
148   %neg = xor i64 %shl, -1
149   %and1 = and i64 %neg, %a
150   ret i64 %and1
153 define signext i32 @sbset_i32(i32 signext %a, i32 signext %b) nounwind {
154 ; RV64I-LABEL: sbset_i32:
155 ; RV64I:       # %bb.0:
156 ; RV64I-NEXT:    addi a2, zero, 1
157 ; RV64I-NEXT:    sllw a1, a2, a1
158 ; RV64I-NEXT:    or a0, a1, a0
159 ; RV64I-NEXT:    ret
161 ; RV64B-LABEL: sbset_i32:
162 ; RV64B:       # %bb.0:
163 ; RV64B-NEXT:    addi a2, zero, 1
164 ; RV64B-NEXT:    sllw a1, a2, a1
165 ; RV64B-NEXT:    or a0, a1, a0
166 ; RV64B-NEXT:    ret
168 ; RV64ZBS-LABEL: sbset_i32:
169 ; RV64ZBS:       # %bb.0:
170 ; RV64ZBS-NEXT:    addi a2, zero, 1
171 ; RV64ZBS-NEXT:    sllw a1, a2, a1
172 ; RV64ZBS-NEXT:    or a0, a1, a0
173 ; RV64ZBS-NEXT:    ret
174   %and = and i32 %b, 31
175   %shl = shl nuw i32 1, %and
176   %or = or i32 %shl, %a
177   ret i32 %or
180 define signext i32 @sbset_i32_no_mask(i32 signext %a, i32 signext %b) nounwind {
181 ; RV64I-LABEL: sbset_i32_no_mask:
182 ; RV64I:       # %bb.0:
183 ; RV64I-NEXT:    addi a2, zero, 1
184 ; RV64I-NEXT:    sllw a1, a2, a1
185 ; RV64I-NEXT:    or a0, a1, a0
186 ; RV64I-NEXT:    ret
188 ; RV64B-LABEL: sbset_i32_no_mask:
189 ; RV64B:       # %bb.0:
190 ; RV64B-NEXT:    addi a2, zero, 1
191 ; RV64B-NEXT:    sllw a1, a2, a1
192 ; RV64B-NEXT:    or a0, a1, a0
193 ; RV64B-NEXT:    ret
195 ; RV64ZBS-LABEL: sbset_i32_no_mask:
196 ; RV64ZBS:       # %bb.0:
197 ; RV64ZBS-NEXT:    addi a2, zero, 1
198 ; RV64ZBS-NEXT:    sllw a1, a2, a1
199 ; RV64ZBS-NEXT:    or a0, a1, a0
200 ; RV64ZBS-NEXT:    ret
201   %shl = shl i32 1, %b
202   %or = or i32 %shl, %a
203   ret i32 %or
206 define signext i32 @sbset_i32_load(i32* %p, i32 signext %b) nounwind {
207 ; RV64I-LABEL: sbset_i32_load:
208 ; RV64I:       # %bb.0:
209 ; RV64I-NEXT:    lw a0, 0(a0)
210 ; RV64I-NEXT:    addi a2, zero, 1
211 ; RV64I-NEXT:    sllw a1, a2, a1
212 ; RV64I-NEXT:    or a0, a1, a0
213 ; RV64I-NEXT:    sext.w a0, a0
214 ; RV64I-NEXT:    ret
216 ; RV64B-LABEL: sbset_i32_load:
217 ; RV64B:       # %bb.0:
218 ; RV64B-NEXT:    lw a0, 0(a0)
219 ; RV64B-NEXT:    addi a2, zero, 1
220 ; RV64B-NEXT:    sllw a1, a2, a1
221 ; RV64B-NEXT:    or a0, a1, a0
222 ; RV64B-NEXT:    sext.w a0, a0
223 ; RV64B-NEXT:    ret
225 ; RV64ZBS-LABEL: sbset_i32_load:
226 ; RV64ZBS:       # %bb.0:
227 ; RV64ZBS-NEXT:    lw a0, 0(a0)
228 ; RV64ZBS-NEXT:    addi a2, zero, 1
229 ; RV64ZBS-NEXT:    sllw a1, a2, a1
230 ; RV64ZBS-NEXT:    or a0, a1, a0
231 ; RV64ZBS-NEXT:    sext.w a0, a0
232 ; RV64ZBS-NEXT:    ret
233   %a = load i32, i32* %p
234   %shl = shl i32 1, %b
235   %or = or i32 %shl, %a
236   ret i32 %or
239 ; We can use sbsetw for 1 << x by setting the first source to zero.
240 define signext i32 @sbset_i32_zero(i32 signext %a) nounwind {
241 ; RV64I-LABEL: sbset_i32_zero:
242 ; RV64I:       # %bb.0:
243 ; RV64I-NEXT:    addi a1, zero, 1
244 ; RV64I-NEXT:    sllw a0, a1, a0
245 ; RV64I-NEXT:    ret
247 ; RV64B-LABEL: sbset_i32_zero:
248 ; RV64B:       # %bb.0:
249 ; RV64B-NEXT:    addi a1, zero, 1
250 ; RV64B-NEXT:    sllw a0, a1, a0
251 ; RV64B-NEXT:    ret
253 ; RV64ZBS-LABEL: sbset_i32_zero:
254 ; RV64ZBS:       # %bb.0:
255 ; RV64ZBS-NEXT:    addi a1, zero, 1
256 ; RV64ZBS-NEXT:    sllw a0, a1, a0
257 ; RV64ZBS-NEXT:    ret
258   %shl = shl i32 1, %a
259   ret i32 %shl
262 define i64 @sbset_i64(i64 %a, i64 %b) nounwind {
263 ; RV64I-LABEL: sbset_i64:
264 ; RV64I:       # %bb.0:
265 ; RV64I-NEXT:    addi a2, zero, 1
266 ; RV64I-NEXT:    sll a1, a2, a1
267 ; RV64I-NEXT:    or a0, a1, a0
268 ; RV64I-NEXT:    ret
270 ; RV64B-LABEL: sbset_i64:
271 ; RV64B:       # %bb.0:
272 ; RV64B-NEXT:    bset a0, a0, a1
273 ; RV64B-NEXT:    ret
275 ; RV64ZBS-LABEL: sbset_i64:
276 ; RV64ZBS:       # %bb.0:
277 ; RV64ZBS-NEXT:    bset a0, a0, a1
278 ; RV64ZBS-NEXT:    ret
279   %conv = and i64 %b, 63
280   %shl = shl nuw i64 1, %conv
281   %or = or i64 %shl, %a
282   ret i64 %or
285 define i64 @sbset_i64_no_mask(i64 %a, i64 %b) nounwind {
286 ; RV64I-LABEL: sbset_i64_no_mask:
287 ; RV64I:       # %bb.0:
288 ; RV64I-NEXT:    addi a2, zero, 1
289 ; RV64I-NEXT:    sll a1, a2, a1
290 ; RV64I-NEXT:    or a0, a1, a0
291 ; RV64I-NEXT:    ret
293 ; RV64B-LABEL: sbset_i64_no_mask:
294 ; RV64B:       # %bb.0:
295 ; RV64B-NEXT:    bset a0, a0, a1
296 ; RV64B-NEXT:    ret
298 ; RV64ZBS-LABEL: sbset_i64_no_mask:
299 ; RV64ZBS:       # %bb.0:
300 ; RV64ZBS-NEXT:    bset a0, a0, a1
301 ; RV64ZBS-NEXT:    ret
302   %shl = shl i64 1, %b
303   %or = or i64 %shl, %a
304   ret i64 %or
307 ; We can use sbsetw for 1 << x by setting the first source to zero.
308 define signext i64 @sbset_i64_zero(i64 signext %a) nounwind {
309 ; RV64I-LABEL: sbset_i64_zero:
310 ; RV64I:       # %bb.0:
311 ; RV64I-NEXT:    addi a1, zero, 1
312 ; RV64I-NEXT:    sll a0, a1, a0
313 ; RV64I-NEXT:    ret
315 ; RV64B-LABEL: sbset_i64_zero:
316 ; RV64B:       # %bb.0:
317 ; RV64B-NEXT:    bset a0, zero, a0
318 ; RV64B-NEXT:    ret
320 ; RV64ZBS-LABEL: sbset_i64_zero:
321 ; RV64ZBS:       # %bb.0:
322 ; RV64ZBS-NEXT:    bset a0, zero, a0
323 ; RV64ZBS-NEXT:    ret
324   %shl = shl i64 1, %a
325   ret i64 %shl
328 define signext i32 @sbinv_i32(i32 signext %a, i32 signext %b) nounwind {
329 ; RV64I-LABEL: sbinv_i32:
330 ; RV64I:       # %bb.0:
331 ; RV64I-NEXT:    addi a2, zero, 1
332 ; RV64I-NEXT:    sllw a1, a2, a1
333 ; RV64I-NEXT:    xor a0, a1, a0
334 ; RV64I-NEXT:    ret
336 ; RV64B-LABEL: sbinv_i32:
337 ; RV64B:       # %bb.0:
338 ; RV64B-NEXT:    addi a2, zero, 1
339 ; RV64B-NEXT:    sllw a1, a2, a1
340 ; RV64B-NEXT:    xor a0, a1, a0
341 ; RV64B-NEXT:    ret
343 ; RV64ZBS-LABEL: sbinv_i32:
344 ; RV64ZBS:       # %bb.0:
345 ; RV64ZBS-NEXT:    addi a2, zero, 1
346 ; RV64ZBS-NEXT:    sllw a1, a2, a1
347 ; RV64ZBS-NEXT:    xor a0, a1, a0
348 ; RV64ZBS-NEXT:    ret
349   %and = and i32 %b, 31
350   %shl = shl nuw i32 1, %and
351   %xor = xor i32 %shl, %a
352   ret i32 %xor
355 define signext i32 @sbinv_i32_no_mask(i32 signext %a, i32 signext %b) nounwind {
356 ; RV64I-LABEL: sbinv_i32_no_mask:
357 ; RV64I:       # %bb.0:
358 ; RV64I-NEXT:    addi a2, zero, 1
359 ; RV64I-NEXT:    sllw a1, a2, a1
360 ; RV64I-NEXT:    xor a0, a1, a0
361 ; RV64I-NEXT:    ret
363 ; RV64B-LABEL: sbinv_i32_no_mask:
364 ; RV64B:       # %bb.0:
365 ; RV64B-NEXT:    addi a2, zero, 1
366 ; RV64B-NEXT:    sllw a1, a2, a1
367 ; RV64B-NEXT:    xor a0, a1, a0
368 ; RV64B-NEXT:    ret
370 ; RV64ZBS-LABEL: sbinv_i32_no_mask:
371 ; RV64ZBS:       # %bb.0:
372 ; RV64ZBS-NEXT:    addi a2, zero, 1
373 ; RV64ZBS-NEXT:    sllw a1, a2, a1
374 ; RV64ZBS-NEXT:    xor a0, a1, a0
375 ; RV64ZBS-NEXT:    ret
376   %shl = shl i32 1, %b
377   %xor = xor i32 %shl, %a
378   ret i32 %xor
381 define signext i32 @sbinv_i32_load(i32* %p, i32 signext %b) nounwind {
382 ; RV64I-LABEL: sbinv_i32_load:
383 ; RV64I:       # %bb.0:
384 ; RV64I-NEXT:    lw a0, 0(a0)
385 ; RV64I-NEXT:    addi a2, zero, 1
386 ; RV64I-NEXT:    sllw a1, a2, a1
387 ; RV64I-NEXT:    xor a0, a1, a0
388 ; RV64I-NEXT:    sext.w a0, a0
389 ; RV64I-NEXT:    ret
391 ; RV64B-LABEL: sbinv_i32_load:
392 ; RV64B:       # %bb.0:
393 ; RV64B-NEXT:    lw a0, 0(a0)
394 ; RV64B-NEXT:    addi a2, zero, 1
395 ; RV64B-NEXT:    sllw a1, a2, a1
396 ; RV64B-NEXT:    xor a0, a1, a0
397 ; RV64B-NEXT:    sext.w a0, a0
398 ; RV64B-NEXT:    ret
400 ; RV64ZBS-LABEL: sbinv_i32_load:
401 ; RV64ZBS:       # %bb.0:
402 ; RV64ZBS-NEXT:    lw a0, 0(a0)
403 ; RV64ZBS-NEXT:    addi a2, zero, 1
404 ; RV64ZBS-NEXT:    sllw a1, a2, a1
405 ; RV64ZBS-NEXT:    xor a0, a1, a0
406 ; RV64ZBS-NEXT:    sext.w a0, a0
407 ; RV64ZBS-NEXT:    ret
408   %a = load i32, i32* %p
409   %shl = shl i32 1, %b
410   %xor = xor i32 %shl, %a
411   ret i32 %xor
414 define i64 @sbinv_i64(i64 %a, i64 %b) nounwind {
415 ; RV64I-LABEL: sbinv_i64:
416 ; RV64I:       # %bb.0:
417 ; RV64I-NEXT:    addi a2, zero, 1
418 ; RV64I-NEXT:    sll a1, a2, a1
419 ; RV64I-NEXT:    xor a0, a1, a0
420 ; RV64I-NEXT:    ret
422 ; RV64B-LABEL: sbinv_i64:
423 ; RV64B:       # %bb.0:
424 ; RV64B-NEXT:    binv a0, a0, a1
425 ; RV64B-NEXT:    ret
427 ; RV64ZBS-LABEL: sbinv_i64:
428 ; RV64ZBS:       # %bb.0:
429 ; RV64ZBS-NEXT:    binv a0, a0, a1
430 ; RV64ZBS-NEXT:    ret
431   %conv = and i64 %b, 63
432   %shl = shl nuw i64 1, %conv
433   %xor = xor i64 %shl, %a
434   ret i64 %xor
437 define i64 @sbinv_i64_no_mask(i64 %a, i64 %b) nounwind {
438 ; RV64I-LABEL: sbinv_i64_no_mask:
439 ; RV64I:       # %bb.0:
440 ; RV64I-NEXT:    addi a2, zero, 1
441 ; RV64I-NEXT:    sll a1, a2, a1
442 ; RV64I-NEXT:    xor a0, a1, a0
443 ; RV64I-NEXT:    ret
445 ; RV64B-LABEL: sbinv_i64_no_mask:
446 ; RV64B:       # %bb.0:
447 ; RV64B-NEXT:    binv a0, a0, a1
448 ; RV64B-NEXT:    ret
450 ; RV64ZBS-LABEL: sbinv_i64_no_mask:
451 ; RV64ZBS:       # %bb.0:
452 ; RV64ZBS-NEXT:    binv a0, a0, a1
453 ; RV64ZBS-NEXT:    ret
454   %shl = shl nuw i64 1, %b
455   %xor = xor i64 %shl, %a
456   ret i64 %xor
459 define signext i32 @sbext_i32(i32 signext %a, i32 signext %b) nounwind {
460 ; RV64I-LABEL: sbext_i32:
461 ; RV64I:       # %bb.0:
462 ; RV64I-NEXT:    srlw a0, a0, a1
463 ; RV64I-NEXT:    andi a0, a0, 1
464 ; RV64I-NEXT:    ret
466 ; RV64B-LABEL: sbext_i32:
467 ; RV64B:       # %bb.0:
468 ; RV64B-NEXT:    srlw a0, a0, a1
469 ; RV64B-NEXT:    andi a0, a0, 1
470 ; RV64B-NEXT:    ret
472 ; RV64ZBS-LABEL: sbext_i32:
473 ; RV64ZBS:       # %bb.0:
474 ; RV64ZBS-NEXT:    srlw a0, a0, a1
475 ; RV64ZBS-NEXT:    andi a0, a0, 1
476 ; RV64ZBS-NEXT:    ret
477   %and = and i32 %b, 31
478   %shr = lshr i32 %a, %and
479   %and1 = and i32 %shr, 1
480   ret i32 %and1
483 define signext i32 @sbext_i32_no_mask(i32 signext %a, i32 signext %b) nounwind {
484 ; RV64I-LABEL: sbext_i32_no_mask:
485 ; RV64I:       # %bb.0:
486 ; RV64I-NEXT:    srlw a0, a0, a1
487 ; RV64I-NEXT:    andi a0, a0, 1
488 ; RV64I-NEXT:    ret
490 ; RV64B-LABEL: sbext_i32_no_mask:
491 ; RV64B:       # %bb.0:
492 ; RV64B-NEXT:    srlw a0, a0, a1
493 ; RV64B-NEXT:    andi a0, a0, 1
494 ; RV64B-NEXT:    ret
496 ; RV64ZBS-LABEL: sbext_i32_no_mask:
497 ; RV64ZBS:       # %bb.0:
498 ; RV64ZBS-NEXT:    srlw a0, a0, a1
499 ; RV64ZBS-NEXT:    andi a0, a0, 1
500 ; RV64ZBS-NEXT:    ret
501   %shr = lshr i32 %a, %b
502   %and1 = and i32 %shr, 1
503   ret i32 %and1
506 define i64 @sbext_i64(i64 %a, i64 %b) nounwind {
507 ; RV64I-LABEL: sbext_i64:
508 ; RV64I:       # %bb.0:
509 ; RV64I-NEXT:    srl a0, a0, a1
510 ; RV64I-NEXT:    andi a0, a0, 1
511 ; RV64I-NEXT:    ret
513 ; RV64B-LABEL: sbext_i64:
514 ; RV64B:       # %bb.0:
515 ; RV64B-NEXT:    bext a0, a0, a1
516 ; RV64B-NEXT:    ret
518 ; RV64ZBS-LABEL: sbext_i64:
519 ; RV64ZBS:       # %bb.0:
520 ; RV64ZBS-NEXT:    bext a0, a0, a1
521 ; RV64ZBS-NEXT:    ret
522   %conv = and i64 %b, 63
523   %shr = lshr i64 %a, %conv
524   %and1 = and i64 %shr, 1
525   ret i64 %and1
528 define i64 @sbext_i64_no_mask(i64 %a, i64 %b) nounwind {
529 ; RV64I-LABEL: sbext_i64_no_mask:
530 ; RV64I:       # %bb.0:
531 ; RV64I-NEXT:    srl a0, a0, a1
532 ; RV64I-NEXT:    andi a0, a0, 1
533 ; RV64I-NEXT:    ret
535 ; RV64B-LABEL: sbext_i64_no_mask:
536 ; RV64B:       # %bb.0:
537 ; RV64B-NEXT:    bext a0, a0, a1
538 ; RV64B-NEXT:    ret
540 ; RV64ZBS-LABEL: sbext_i64_no_mask:
541 ; RV64ZBS:       # %bb.0:
542 ; RV64ZBS-NEXT:    bext a0, a0, a1
543 ; RV64ZBS-NEXT:    ret
544   %shr = lshr i64 %a, %b
545   %and1 = and i64 %shr, 1
546   ret i64 %and1
549 define signext i32 @sbexti_i32(i32 signext %a) nounwind {
550 ; RV64I-LABEL: sbexti_i32:
551 ; RV64I:       # %bb.0:
552 ; RV64I-NEXT:    srli a0, a0, 5
553 ; RV64I-NEXT:    andi a0, a0, 1
554 ; RV64I-NEXT:    ret
556 ; RV64B-LABEL: sbexti_i32:
557 ; RV64B:       # %bb.0:
558 ; RV64B-NEXT:    bexti a0, a0, 5
559 ; RV64B-NEXT:    ret
561 ; RV64ZBS-LABEL: sbexti_i32:
562 ; RV64ZBS:       # %bb.0:
563 ; RV64ZBS-NEXT:    bexti a0, a0, 5
564 ; RV64ZBS-NEXT:    ret
565   %shr = lshr i32 %a, 5
566   %and = and i32 %shr, 1
567   ret i32 %and
570 define i64 @sbexti_i64(i64 %a) nounwind {
571 ; RV64I-LABEL: sbexti_i64:
572 ; RV64I:       # %bb.0:
573 ; RV64I-NEXT:    srli a0, a0, 5
574 ; RV64I-NEXT:    andi a0, a0, 1
575 ; RV64I-NEXT:    ret
577 ; RV64B-LABEL: sbexti_i64:
578 ; RV64B:       # %bb.0:
579 ; RV64B-NEXT:    bexti a0, a0, 5
580 ; RV64B-NEXT:    ret
582 ; RV64ZBS-LABEL: sbexti_i64:
583 ; RV64ZBS:       # %bb.0:
584 ; RV64ZBS-NEXT:    bexti a0, a0, 5
585 ; RV64ZBS-NEXT:    ret
586   %shr = lshr i64 %a, 5
587   %and = and i64 %shr, 1
588   ret i64 %and
591 define signext i32 @sbclri_i32_10(i32 signext %a) nounwind {
592 ; RV64I-LABEL: sbclri_i32_10:
593 ; RV64I:       # %bb.0:
594 ; RV64I-NEXT:    andi a0, a0, -1025
595 ; RV64I-NEXT:    ret
597 ; RV64B-LABEL: sbclri_i32_10:
598 ; RV64B:       # %bb.0:
599 ; RV64B-NEXT:    andi a0, a0, -1025
600 ; RV64B-NEXT:    ret
602 ; RV64ZBS-LABEL: sbclri_i32_10:
603 ; RV64ZBS:       # %bb.0:
604 ; RV64ZBS-NEXT:    andi a0, a0, -1025
605 ; RV64ZBS-NEXT:    ret
606   %and = and i32 %a, -1025
607   ret i32 %and
610 define signext i32 @sbclri_i32_11(i32 signext %a) nounwind {
611 ; RV64I-LABEL: sbclri_i32_11:
612 ; RV64I:       # %bb.0:
613 ; RV64I-NEXT:    lui a1, 1048575
614 ; RV64I-NEXT:    addiw a1, a1, 2047
615 ; RV64I-NEXT:    and a0, a0, a1
616 ; RV64I-NEXT:    ret
618 ; RV64B-LABEL: sbclri_i32_11:
619 ; RV64B:       # %bb.0:
620 ; RV64B-NEXT:    bclri a0, a0, 11
621 ; RV64B-NEXT:    ret
623 ; RV64ZBS-LABEL: sbclri_i32_11:
624 ; RV64ZBS:       # %bb.0:
625 ; RV64ZBS-NEXT:    bclri a0, a0, 11
626 ; RV64ZBS-NEXT:    ret
627   %and = and i32 %a, -2049
628   ret i32 %and
631 define signext i32 @sbclri_i32_30(i32 signext %a) nounwind {
632 ; RV64I-LABEL: sbclri_i32_30:
633 ; RV64I:       # %bb.0:
634 ; RV64I-NEXT:    lui a1, 786432
635 ; RV64I-NEXT:    addiw a1, a1, -1
636 ; RV64I-NEXT:    and a0, a0, a1
637 ; RV64I-NEXT:    ret
639 ; RV64B-LABEL: sbclri_i32_30:
640 ; RV64B:       # %bb.0:
641 ; RV64B-NEXT:    bclri a0, a0, 30
642 ; RV64B-NEXT:    ret
644 ; RV64ZBS-LABEL: sbclri_i32_30:
645 ; RV64ZBS:       # %bb.0:
646 ; RV64ZBS-NEXT:    bclri a0, a0, 30
647 ; RV64ZBS-NEXT:    ret
648   %and = and i32 %a, -1073741825
649   ret i32 %and
652 define signext i32 @sbclri_i32_31(i32 signext %a) nounwind {
653 ; RV64I-LABEL: sbclri_i32_31:
654 ; RV64I:       # %bb.0:
655 ; RV64I-NEXT:    lui a1, 524288
656 ; RV64I-NEXT:    addiw a1, a1, -1
657 ; RV64I-NEXT:    and a0, a0, a1
658 ; RV64I-NEXT:    ret
660 ; RV64B-LABEL: sbclri_i32_31:
661 ; RV64B:       # %bb.0:
662 ; RV64B-NEXT:    lui a1, 524288
663 ; RV64B-NEXT:    addiw a1, a1, -1
664 ; RV64B-NEXT:    and a0, a0, a1
665 ; RV64B-NEXT:    ret
667 ; RV64ZBS-LABEL: sbclri_i32_31:
668 ; RV64ZBS:       # %bb.0:
669 ; RV64ZBS-NEXT:    lui a1, 524288
670 ; RV64ZBS-NEXT:    addiw a1, a1, -1
671 ; RV64ZBS-NEXT:    and a0, a0, a1
672 ; RV64ZBS-NEXT:    ret
673   %and = and i32 %a, -2147483649
674   ret i32 %and
677 define i64 @sbclri_i64_10(i64 %a) nounwind {
678 ; RV64I-LABEL: sbclri_i64_10:
679 ; RV64I:       # %bb.0:
680 ; RV64I-NEXT:    andi a0, a0, -1025
681 ; RV64I-NEXT:    ret
683 ; RV64B-LABEL: sbclri_i64_10:
684 ; RV64B:       # %bb.0:
685 ; RV64B-NEXT:    andi a0, a0, -1025
686 ; RV64B-NEXT:    ret
688 ; RV64ZBS-LABEL: sbclri_i64_10:
689 ; RV64ZBS:       # %bb.0:
690 ; RV64ZBS-NEXT:    andi a0, a0, -1025
691 ; RV64ZBS-NEXT:    ret
692   %and = and i64 %a, -1025
693   ret i64 %and
696 define i64 @sbclri_i64_11(i64 %a) nounwind {
697 ; RV64I-LABEL: sbclri_i64_11:
698 ; RV64I:       # %bb.0:
699 ; RV64I-NEXT:    lui a1, 1048575
700 ; RV64I-NEXT:    addiw a1, a1, 2047
701 ; RV64I-NEXT:    and a0, a0, a1
702 ; RV64I-NEXT:    ret
704 ; RV64B-LABEL: sbclri_i64_11:
705 ; RV64B:       # %bb.0:
706 ; RV64B-NEXT:    bclri a0, a0, 11
707 ; RV64B-NEXT:    ret
709 ; RV64ZBS-LABEL: sbclri_i64_11:
710 ; RV64ZBS:       # %bb.0:
711 ; RV64ZBS-NEXT:    bclri a0, a0, 11
712 ; RV64ZBS-NEXT:    ret
713   %and = and i64 %a, -2049
714   ret i64 %and
717 define i64 @sbclri_i64_30(i64 %a) nounwind {
718 ; RV64I-LABEL: sbclri_i64_30:
719 ; RV64I:       # %bb.0:
720 ; RV64I-NEXT:    lui a1, 786432
721 ; RV64I-NEXT:    addiw a1, a1, -1
722 ; RV64I-NEXT:    and a0, a0, a1
723 ; RV64I-NEXT:    ret
725 ; RV64B-LABEL: sbclri_i64_30:
726 ; RV64B:       # %bb.0:
727 ; RV64B-NEXT:    bclri a0, a0, 30
728 ; RV64B-NEXT:    ret
730 ; RV64ZBS-LABEL: sbclri_i64_30:
731 ; RV64ZBS:       # %bb.0:
732 ; RV64ZBS-NEXT:    bclri a0, a0, 30
733 ; RV64ZBS-NEXT:    ret
734   %and = and i64 %a, -1073741825
735   ret i64 %and
738 define i64 @sbclri_i64_31(i64 %a) nounwind {
739 ; RV64I-LABEL: sbclri_i64_31:
740 ; RV64I:       # %bb.0:
741 ; RV64I-NEXT:    addi a1, zero, -1
742 ; RV64I-NEXT:    slli a1, a1, 31
743 ; RV64I-NEXT:    addi a1, a1, -1
744 ; RV64I-NEXT:    and a0, a0, a1
745 ; RV64I-NEXT:    ret
747 ; RV64B-LABEL: sbclri_i64_31:
748 ; RV64B:       # %bb.0:
749 ; RV64B-NEXT:    bclri a0, a0, 31
750 ; RV64B-NEXT:    ret
752 ; RV64ZBS-LABEL: sbclri_i64_31:
753 ; RV64ZBS:       # %bb.0:
754 ; RV64ZBS-NEXT:    bclri a0, a0, 31
755 ; RV64ZBS-NEXT:    ret
756   %and = and i64 %a, -2147483649
757   ret i64 %and
760 define i64 @sbclri_i64_62(i64 %a) nounwind {
761 ; RV64I-LABEL: sbclri_i64_62:
762 ; RV64I:       # %bb.0:
763 ; RV64I-NEXT:    addi a1, zero, -1
764 ; RV64I-NEXT:    slli a1, a1, 62
765 ; RV64I-NEXT:    addi a1, a1, -1
766 ; RV64I-NEXT:    and a0, a0, a1
767 ; RV64I-NEXT:    ret
769 ; RV64B-LABEL: sbclri_i64_62:
770 ; RV64B:       # %bb.0:
771 ; RV64B-NEXT:    bclri a0, a0, 62
772 ; RV64B-NEXT:    ret
774 ; RV64ZBS-LABEL: sbclri_i64_62:
775 ; RV64ZBS:       # %bb.0:
776 ; RV64ZBS-NEXT:    bclri a0, a0, 62
777 ; RV64ZBS-NEXT:    ret
778   %and = and i64 %a, -4611686018427387905
779   ret i64 %and
782 define i64 @sbclri_i64_63(i64 %a) nounwind {
783 ; RV64I-LABEL: sbclri_i64_63:
784 ; RV64I:       # %bb.0:
785 ; RV64I-NEXT:    addi a1, zero, -1
786 ; RV64I-NEXT:    srli a1, a1, 1
787 ; RV64I-NEXT:    and a0, a0, a1
788 ; RV64I-NEXT:    ret
790 ; RV64B-LABEL: sbclri_i64_63:
791 ; RV64B:       # %bb.0:
792 ; RV64B-NEXT:    bclri a0, a0, 63
793 ; RV64B-NEXT:    ret
795 ; RV64ZBS-LABEL: sbclri_i64_63:
796 ; RV64ZBS:       # %bb.0:
797 ; RV64ZBS-NEXT:    bclri a0, a0, 63
798 ; RV64ZBS-NEXT:    ret
799   %and = and i64 %a, -9223372036854775809
800   ret i64 %and
803 define i64 @sbclri_i64_large0(i64 %a) nounwind {
804 ; RV64I-LABEL: sbclri_i64_large0:
805 ; RV64I:       # %bb.0:
806 ; RV64I-NEXT:    lui a1, 1044480
807 ; RV64I-NEXT:    addiw a1, a1, -256
808 ; RV64I-NEXT:    and a0, a0, a1
809 ; RV64I-NEXT:    ret
811 ; RV64B-LABEL: sbclri_i64_large0:
812 ; RV64B:       # %bb.0:
813 ; RV64B-NEXT:    andi a0, a0, -256
814 ; RV64B-NEXT:    bclri a0, a0, 24
815 ; RV64B-NEXT:    ret
817 ; RV64ZBS-LABEL: sbclri_i64_large0:
818 ; RV64ZBS:       # %bb.0:
819 ; RV64ZBS-NEXT:    andi a0, a0, -256
820 ; RV64ZBS-NEXT:    bclri a0, a0, 24
821 ; RV64ZBS-NEXT:    ret
822   %and = and i64 %a, -16777472
823   ret i64 %and
826 define i64 @sbclri_i64_large1(i64 %a) nounwind {
827 ; RV64I-LABEL: sbclri_i64_large1:
828 ; RV64I:       # %bb.0:
829 ; RV64I-NEXT:    lui a1, 1044464
830 ; RV64I-NEXT:    addiw a1, a1, -1
831 ; RV64I-NEXT:    and a0, a0, a1
832 ; RV64I-NEXT:    ret
834 ; RV64B-LABEL: sbclri_i64_large1:
835 ; RV64B:       # %bb.0:
836 ; RV64B-NEXT:    bclri a0, a0, 16
837 ; RV64B-NEXT:    bclri a0, a0, 24
838 ; RV64B-NEXT:    ret
840 ; RV64ZBS-LABEL: sbclri_i64_large1:
841 ; RV64ZBS:       # %bb.0:
842 ; RV64ZBS-NEXT:    bclri a0, a0, 16
843 ; RV64ZBS-NEXT:    bclri a0, a0, 24
844 ; RV64ZBS-NEXT:    ret
845   %and = and i64 %a, -16842753
846   ret i64 %and
849 define signext i32 @sbseti_i32_10(i32 signext %a) nounwind {
850 ; RV64I-LABEL: sbseti_i32_10:
851 ; RV64I:       # %bb.0:
852 ; RV64I-NEXT:    ori a0, a0, 1024
853 ; RV64I-NEXT:    ret
855 ; RV64B-LABEL: sbseti_i32_10:
856 ; RV64B:       # %bb.0:
857 ; RV64B-NEXT:    ori a0, a0, 1024
858 ; RV64B-NEXT:    ret
860 ; RV64ZBS-LABEL: sbseti_i32_10:
861 ; RV64ZBS:       # %bb.0:
862 ; RV64ZBS-NEXT:    ori a0, a0, 1024
863 ; RV64ZBS-NEXT:    ret
864   %or = or i32 %a, 1024
865   ret i32 %or
868 define signext i32 @sbseti_i32_11(i32 signext %a) nounwind {
869 ; RV64I-LABEL: sbseti_i32_11:
870 ; RV64I:       # %bb.0:
871 ; RV64I-NEXT:    lui a1, 1
872 ; RV64I-NEXT:    addiw a1, a1, -2048
873 ; RV64I-NEXT:    or a0, a0, a1
874 ; RV64I-NEXT:    ret
876 ; RV64B-LABEL: sbseti_i32_11:
877 ; RV64B:       # %bb.0:
878 ; RV64B-NEXT:    bseti a0, a0, 11
879 ; RV64B-NEXT:    ret
881 ; RV64ZBS-LABEL: sbseti_i32_11:
882 ; RV64ZBS:       # %bb.0:
883 ; RV64ZBS-NEXT:    bseti a0, a0, 11
884 ; RV64ZBS-NEXT:    ret
885   %or = or i32 %a, 2048
886   ret i32 %or
889 define signext i32 @sbseti_i32_30(i32 signext %a) nounwind {
890 ; RV64I-LABEL: sbseti_i32_30:
891 ; RV64I:       # %bb.0:
892 ; RV64I-NEXT:    lui a1, 262144
893 ; RV64I-NEXT:    or a0, a0, a1
894 ; RV64I-NEXT:    ret
896 ; RV64B-LABEL: sbseti_i32_30:
897 ; RV64B:       # %bb.0:
898 ; RV64B-NEXT:    bseti a0, a0, 30
899 ; RV64B-NEXT:    ret
901 ; RV64ZBS-LABEL: sbseti_i32_30:
902 ; RV64ZBS:       # %bb.0:
903 ; RV64ZBS-NEXT:    bseti a0, a0, 30
904 ; RV64ZBS-NEXT:    ret
905   %or = or i32 %a, 1073741824
906   ret i32 %or
909 define signext i32 @sbseti_i32_31(i32 signext %a) nounwind {
910 ; RV64I-LABEL: sbseti_i32_31:
911 ; RV64I:       # %bb.0:
912 ; RV64I-NEXT:    lui a1, 524288
913 ; RV64I-NEXT:    or a0, a0, a1
914 ; RV64I-NEXT:    ret
916 ; RV64B-LABEL: sbseti_i32_31:
917 ; RV64B:       # %bb.0:
918 ; RV64B-NEXT:    lui a1, 524288
919 ; RV64B-NEXT:    or a0, a0, a1
920 ; RV64B-NEXT:    ret
922 ; RV64ZBS-LABEL: sbseti_i32_31:
923 ; RV64ZBS:       # %bb.0:
924 ; RV64ZBS-NEXT:    lui a1, 524288
925 ; RV64ZBS-NEXT:    or a0, a0, a1
926 ; RV64ZBS-NEXT:    ret
927   %or = or i32 %a, 2147483648
928   ret i32 %or
931 define i64 @sbseti_i64_10(i64 %a) nounwind {
932 ; RV64I-LABEL: sbseti_i64_10:
933 ; RV64I:       # %bb.0:
934 ; RV64I-NEXT:    ori a0, a0, 1024
935 ; RV64I-NEXT:    ret
937 ; RV64B-LABEL: sbseti_i64_10:
938 ; RV64B:       # %bb.0:
939 ; RV64B-NEXT:    ori a0, a0, 1024
940 ; RV64B-NEXT:    ret
942 ; RV64ZBS-LABEL: sbseti_i64_10:
943 ; RV64ZBS:       # %bb.0:
944 ; RV64ZBS-NEXT:    ori a0, a0, 1024
945 ; RV64ZBS-NEXT:    ret
946   %or = or i64 %a, 1024
947   ret i64 %or
950 define i64 @sbseti_i64_11(i64 %a) nounwind {
951 ; RV64I-LABEL: sbseti_i64_11:
952 ; RV64I:       # %bb.0:
953 ; RV64I-NEXT:    lui a1, 1
954 ; RV64I-NEXT:    addiw a1, a1, -2048
955 ; RV64I-NEXT:    or a0, a0, a1
956 ; RV64I-NEXT:    ret
958 ; RV64B-LABEL: sbseti_i64_11:
959 ; RV64B:       # %bb.0:
960 ; RV64B-NEXT:    bseti a0, a0, 11
961 ; RV64B-NEXT:    ret
963 ; RV64ZBS-LABEL: sbseti_i64_11:
964 ; RV64ZBS:       # %bb.0:
965 ; RV64ZBS-NEXT:    bseti a0, a0, 11
966 ; RV64ZBS-NEXT:    ret
967   %or = or i64 %a, 2048
968   ret i64 %or
971 define i64 @sbseti_i64_30(i64 %a) nounwind {
972 ; RV64I-LABEL: sbseti_i64_30:
973 ; RV64I:       # %bb.0:
974 ; RV64I-NEXT:    lui a1, 262144
975 ; RV64I-NEXT:    or a0, a0, a1
976 ; RV64I-NEXT:    ret
978 ; RV64B-LABEL: sbseti_i64_30:
979 ; RV64B:       # %bb.0:
980 ; RV64B-NEXT:    bseti a0, a0, 30
981 ; RV64B-NEXT:    ret
983 ; RV64ZBS-LABEL: sbseti_i64_30:
984 ; RV64ZBS:       # %bb.0:
985 ; RV64ZBS-NEXT:    bseti a0, a0, 30
986 ; RV64ZBS-NEXT:    ret
987   %or = or i64 %a, 1073741824
988   ret i64 %or
991 define i64 @sbseti_i64_31(i64 %a) nounwind {
992 ; RV64I-LABEL: sbseti_i64_31:
993 ; RV64I:       # %bb.0:
994 ; RV64I-NEXT:    addi a1, zero, 1
995 ; RV64I-NEXT:    slli a1, a1, 31
996 ; RV64I-NEXT:    or a0, a0, a1
997 ; RV64I-NEXT:    ret
999 ; RV64B-LABEL: sbseti_i64_31:
1000 ; RV64B:       # %bb.0:
1001 ; RV64B-NEXT:    bseti a0, a0, 31
1002 ; RV64B-NEXT:    ret
1004 ; RV64ZBS-LABEL: sbseti_i64_31:
1005 ; RV64ZBS:       # %bb.0:
1006 ; RV64ZBS-NEXT:    bseti a0, a0, 31
1007 ; RV64ZBS-NEXT:    ret
1008   %or = or i64 %a, 2147483648
1009   ret i64 %or
1012 define i64 @sbseti_i64_62(i64 %a) nounwind {
1013 ; RV64I-LABEL: sbseti_i64_62:
1014 ; RV64I:       # %bb.0:
1015 ; RV64I-NEXT:    addi a1, zero, 1
1016 ; RV64I-NEXT:    slli a1, a1, 62
1017 ; RV64I-NEXT:    or a0, a0, a1
1018 ; RV64I-NEXT:    ret
1020 ; RV64B-LABEL: sbseti_i64_62:
1021 ; RV64B:       # %bb.0:
1022 ; RV64B-NEXT:    bseti a0, a0, 62
1023 ; RV64B-NEXT:    ret
1025 ; RV64ZBS-LABEL: sbseti_i64_62:
1026 ; RV64ZBS:       # %bb.0:
1027 ; RV64ZBS-NEXT:    bseti a0, a0, 62
1028 ; RV64ZBS-NEXT:    ret
1029   %or = or i64 %a, 4611686018427387904
1030   ret i64 %or
1033 define i64 @sbseti_i64_63(i64 %a) nounwind {
1034 ; RV64I-LABEL: sbseti_i64_63:
1035 ; RV64I:       # %bb.0:
1036 ; RV64I-NEXT:    addi a1, zero, -1
1037 ; RV64I-NEXT:    slli a1, a1, 63
1038 ; RV64I-NEXT:    or a0, a0, a1
1039 ; RV64I-NEXT:    ret
1041 ; RV64B-LABEL: sbseti_i64_63:
1042 ; RV64B:       # %bb.0:
1043 ; RV64B-NEXT:    bseti a0, a0, 63
1044 ; RV64B-NEXT:    ret
1046 ; RV64ZBS-LABEL: sbseti_i64_63:
1047 ; RV64ZBS:       # %bb.0:
1048 ; RV64ZBS-NEXT:    bseti a0, a0, 63
1049 ; RV64ZBS-NEXT:    ret
1050   %or = or i64 %a, 9223372036854775808
1051   ret i64 %or
1054 define signext i32 @sbinvi_i32_10(i32 signext %a) nounwind {
1055 ; RV64I-LABEL: sbinvi_i32_10:
1056 ; RV64I:       # %bb.0:
1057 ; RV64I-NEXT:    xori a0, a0, 1024
1058 ; RV64I-NEXT:    ret
1060 ; RV64B-LABEL: sbinvi_i32_10:
1061 ; RV64B:       # %bb.0:
1062 ; RV64B-NEXT:    xori a0, a0, 1024
1063 ; RV64B-NEXT:    ret
1065 ; RV64ZBS-LABEL: sbinvi_i32_10:
1066 ; RV64ZBS:       # %bb.0:
1067 ; RV64ZBS-NEXT:    xori a0, a0, 1024
1068 ; RV64ZBS-NEXT:    ret
1069   %xor = xor i32 %a, 1024
1070   ret i32 %xor
1073 define signext i32 @sbinvi_i32_11(i32 signext %a) nounwind {
1074 ; RV64I-LABEL: sbinvi_i32_11:
1075 ; RV64I:       # %bb.0:
1076 ; RV64I-NEXT:    lui a1, 1
1077 ; RV64I-NEXT:    addiw a1, a1, -2048
1078 ; RV64I-NEXT:    xor a0, a0, a1
1079 ; RV64I-NEXT:    ret
1081 ; RV64B-LABEL: sbinvi_i32_11:
1082 ; RV64B:       # %bb.0:
1083 ; RV64B-NEXT:    binvi a0, a0, 11
1084 ; RV64B-NEXT:    ret
1086 ; RV64ZBS-LABEL: sbinvi_i32_11:
1087 ; RV64ZBS:       # %bb.0:
1088 ; RV64ZBS-NEXT:    binvi a0, a0, 11
1089 ; RV64ZBS-NEXT:    ret
1090   %xor = xor i32 %a, 2048
1091   ret i32 %xor
1094 define signext i32 @sbinvi_i32_30(i32 signext %a) nounwind {
1095 ; RV64I-LABEL: sbinvi_i32_30:
1096 ; RV64I:       # %bb.0:
1097 ; RV64I-NEXT:    lui a1, 262144
1098 ; RV64I-NEXT:    xor a0, a0, a1
1099 ; RV64I-NEXT:    ret
1101 ; RV64B-LABEL: sbinvi_i32_30:
1102 ; RV64B:       # %bb.0:
1103 ; RV64B-NEXT:    binvi a0, a0, 30
1104 ; RV64B-NEXT:    ret
1106 ; RV64ZBS-LABEL: sbinvi_i32_30:
1107 ; RV64ZBS:       # %bb.0:
1108 ; RV64ZBS-NEXT:    binvi a0, a0, 30
1109 ; RV64ZBS-NEXT:    ret
1110   %xor = xor i32 %a, 1073741824
1111   ret i32 %xor
1114 define signext i32 @sbinvi_i32_31(i32 signext %a) nounwind {
1115 ; RV64I-LABEL: sbinvi_i32_31:
1116 ; RV64I:       # %bb.0:
1117 ; RV64I-NEXT:    lui a1, 524288
1118 ; RV64I-NEXT:    xor a0, a0, a1
1119 ; RV64I-NEXT:    ret
1121 ; RV64B-LABEL: sbinvi_i32_31:
1122 ; RV64B:       # %bb.0:
1123 ; RV64B-NEXT:    lui a1, 524288
1124 ; RV64B-NEXT:    xor a0, a0, a1
1125 ; RV64B-NEXT:    ret
1127 ; RV64ZBS-LABEL: sbinvi_i32_31:
1128 ; RV64ZBS:       # %bb.0:
1129 ; RV64ZBS-NEXT:    lui a1, 524288
1130 ; RV64ZBS-NEXT:    xor a0, a0, a1
1131 ; RV64ZBS-NEXT:    ret
1132   %xor = xor i32 %a, 2147483648
1133   ret i32 %xor
1136 define i64 @sbinvi_i64_10(i64 %a) nounwind {
1137 ; RV64I-LABEL: sbinvi_i64_10:
1138 ; RV64I:       # %bb.0:
1139 ; RV64I-NEXT:    xori a0, a0, 1024
1140 ; RV64I-NEXT:    ret
1142 ; RV64B-LABEL: sbinvi_i64_10:
1143 ; RV64B:       # %bb.0:
1144 ; RV64B-NEXT:    xori a0, a0, 1024
1145 ; RV64B-NEXT:    ret
1147 ; RV64ZBS-LABEL: sbinvi_i64_10:
1148 ; RV64ZBS:       # %bb.0:
1149 ; RV64ZBS-NEXT:    xori a0, a0, 1024
1150 ; RV64ZBS-NEXT:    ret
1151   %xor = xor i64 %a, 1024
1152   ret i64 %xor
1155 define i64 @sbinvi_i64_11(i64 %a) nounwind {
1156 ; RV64I-LABEL: sbinvi_i64_11:
1157 ; RV64I:       # %bb.0:
1158 ; RV64I-NEXT:    lui a1, 1
1159 ; RV64I-NEXT:    addiw a1, a1, -2048
1160 ; RV64I-NEXT:    xor a0, a0, a1
1161 ; RV64I-NEXT:    ret
1163 ; RV64B-LABEL: sbinvi_i64_11:
1164 ; RV64B:       # %bb.0:
1165 ; RV64B-NEXT:    binvi a0, a0, 11
1166 ; RV64B-NEXT:    ret
1168 ; RV64ZBS-LABEL: sbinvi_i64_11:
1169 ; RV64ZBS:       # %bb.0:
1170 ; RV64ZBS-NEXT:    binvi a0, a0, 11
1171 ; RV64ZBS-NEXT:    ret
1172   %xor = xor i64 %a, 2048
1173   ret i64 %xor
1176 define i64 @sbinvi_i64_30(i64 %a) nounwind {
1177 ; RV64I-LABEL: sbinvi_i64_30:
1178 ; RV64I:       # %bb.0:
1179 ; RV64I-NEXT:    lui a1, 262144
1180 ; RV64I-NEXT:    xor a0, a0, a1
1181 ; RV64I-NEXT:    ret
1183 ; RV64B-LABEL: sbinvi_i64_30:
1184 ; RV64B:       # %bb.0:
1185 ; RV64B-NEXT:    binvi a0, a0, 30
1186 ; RV64B-NEXT:    ret
1188 ; RV64ZBS-LABEL: sbinvi_i64_30:
1189 ; RV64ZBS:       # %bb.0:
1190 ; RV64ZBS-NEXT:    binvi a0, a0, 30
1191 ; RV64ZBS-NEXT:    ret
1192   %xor = xor i64 %a, 1073741824
1193   ret i64 %xor
1196 define i64 @sbinvi_i64_31(i64 %a) nounwind {
1197 ; RV64I-LABEL: sbinvi_i64_31:
1198 ; RV64I:       # %bb.0:
1199 ; RV64I-NEXT:    addi a1, zero, 1
1200 ; RV64I-NEXT:    slli a1, a1, 31
1201 ; RV64I-NEXT:    xor a0, a0, a1
1202 ; RV64I-NEXT:    ret
1204 ; RV64B-LABEL: sbinvi_i64_31:
1205 ; RV64B:       # %bb.0:
1206 ; RV64B-NEXT:    binvi a0, a0, 31
1207 ; RV64B-NEXT:    ret
1209 ; RV64ZBS-LABEL: sbinvi_i64_31:
1210 ; RV64ZBS:       # %bb.0:
1211 ; RV64ZBS-NEXT:    binvi a0, a0, 31
1212 ; RV64ZBS-NEXT:    ret
1213   %xor = xor i64 %a, 2147483648
1214   ret i64 %xor
1217 define i64 @sbinvi_i64_62(i64 %a) nounwind {
1218 ; RV64I-LABEL: sbinvi_i64_62:
1219 ; RV64I:       # %bb.0:
1220 ; RV64I-NEXT:    addi a1, zero, 1
1221 ; RV64I-NEXT:    slli a1, a1, 62
1222 ; RV64I-NEXT:    xor a0, a0, a1
1223 ; RV64I-NEXT:    ret
1225 ; RV64B-LABEL: sbinvi_i64_62:
1226 ; RV64B:       # %bb.0:
1227 ; RV64B-NEXT:    binvi a0, a0, 62
1228 ; RV64B-NEXT:    ret
1230 ; RV64ZBS-LABEL: sbinvi_i64_62:
1231 ; RV64ZBS:       # %bb.0:
1232 ; RV64ZBS-NEXT:    binvi a0, a0, 62
1233 ; RV64ZBS-NEXT:    ret
1234   %xor = xor i64 %a, 4611686018427387904
1235   ret i64 %xor
1238 define i64 @sbinvi_i64_63(i64 %a) nounwind {
1239 ; RV64I-LABEL: sbinvi_i64_63:
1240 ; RV64I:       # %bb.0:
1241 ; RV64I-NEXT:    addi a1, zero, -1
1242 ; RV64I-NEXT:    slli a1, a1, 63
1243 ; RV64I-NEXT:    xor a0, a0, a1
1244 ; RV64I-NEXT:    ret
1246 ; RV64B-LABEL: sbinvi_i64_63:
1247 ; RV64B:       # %bb.0:
1248 ; RV64B-NEXT:    binvi a0, a0, 63
1249 ; RV64B-NEXT:    ret
1251 ; RV64ZBS-LABEL: sbinvi_i64_63:
1252 ; RV64ZBS:       # %bb.0:
1253 ; RV64ZBS-NEXT:    binvi a0, a0, 63
1254 ; RV64ZBS-NEXT:    ret
1255   %xor = xor i64 %a, 9223372036854775808
1256   ret i64 %xor
1259 define i64 @xor_i64_large(i64 %a) nounwind {
1260 ; RV64I-LABEL: xor_i64_large:
1261 ; RV64I:       # %bb.0:
1262 ; RV64I-NEXT:    addi a1, zero, 1
1263 ; RV64I-NEXT:    slli a1, a1, 32
1264 ; RV64I-NEXT:    addi a1, a1, 1
1265 ; RV64I-NEXT:    xor a0, a0, a1
1266 ; RV64I-NEXT:    ret
1268 ; RV64B-LABEL: xor_i64_large:
1269 ; RV64B:       # %bb.0:
1270 ; RV64B-NEXT:    binvi a0, a0, 0
1271 ; RV64B-NEXT:    binvi a0, a0, 32
1272 ; RV64B-NEXT:    ret
1274 ; RV64ZBS-LABEL: xor_i64_large:
1275 ; RV64ZBS:       # %bb.0:
1276 ; RV64ZBS-NEXT:    binvi a0, a0, 0
1277 ; RV64ZBS-NEXT:    binvi a0, a0, 32
1278 ; RV64ZBS-NEXT:    ret
1279   %xor = xor i64 %a, 4294967297
1280   ret i64 %xor
1283 define i64 @xor_i64_4099(i64 %a) nounwind {
1284 ; RV64I-LABEL: xor_i64_4099:
1285 ; RV64I:       # %bb.0:
1286 ; RV64I-NEXT:    lui a1, 1
1287 ; RV64I-NEXT:    addiw a1, a1, 3
1288 ; RV64I-NEXT:    xor a0, a0, a1
1289 ; RV64I-NEXT:    ret
1291 ; RV64B-LABEL: xor_i64_4099:
1292 ; RV64B:       # %bb.0:
1293 ; RV64B-NEXT:    xori a0, a0, 3
1294 ; RV64B-NEXT:    binvi a0, a0, 12
1295 ; RV64B-NEXT:    ret
1297 ; RV64ZBS-LABEL: xor_i64_4099:
1298 ; RV64ZBS:       # %bb.0:
1299 ; RV64ZBS-NEXT:    xori a0, a0, 3
1300 ; RV64ZBS-NEXT:    binvi a0, a0, 12
1301 ; RV64ZBS-NEXT:    ret
1302   %xor = xor i64 %a, 4099
1303   ret i64 %xor
1306 define i64 @xor_i64_96(i64 %a) nounwind {
1307 ; RV64I-LABEL: xor_i64_96:
1308 ; RV64I:       # %bb.0:
1309 ; RV64I-NEXT:    xori a0, a0, 96
1310 ; RV64I-NEXT:    ret
1312 ; RV64B-LABEL: xor_i64_96:
1313 ; RV64B:       # %bb.0:
1314 ; RV64B-NEXT:    xori a0, a0, 96
1315 ; RV64B-NEXT:    ret
1317 ; RV64ZBS-LABEL: xor_i64_96:
1318 ; RV64ZBS:       # %bb.0:
1319 ; RV64ZBS-NEXT:    xori a0, a0, 96
1320 ; RV64ZBS-NEXT:    ret
1321   %xor = xor i64 %a, 96
1322   ret i64 %xor
1325 define i64 @or_i64_large(i64 %a) nounwind {
1326 ; RV64I-LABEL: or_i64_large:
1327 ; RV64I:       # %bb.0:
1328 ; RV64I-NEXT:    addi a1, zero, 1
1329 ; RV64I-NEXT:    slli a1, a1, 32
1330 ; RV64I-NEXT:    addi a1, a1, 1
1331 ; RV64I-NEXT:    or a0, a0, a1
1332 ; RV64I-NEXT:    ret
1334 ; RV64B-LABEL: or_i64_large:
1335 ; RV64B:       # %bb.0:
1336 ; RV64B-NEXT:    bseti a0, a0, 0
1337 ; RV64B-NEXT:    bseti a0, a0, 32
1338 ; RV64B-NEXT:    ret
1340 ; RV64ZBS-LABEL: or_i64_large:
1341 ; RV64ZBS:       # %bb.0:
1342 ; RV64ZBS-NEXT:    bseti a0, a0, 0
1343 ; RV64ZBS-NEXT:    bseti a0, a0, 32
1344 ; RV64ZBS-NEXT:    ret
1345   %or = or i64 %a, 4294967297
1346   ret i64 %or
1349 define i64 @xor_i64_66901(i64 %a) nounwind {
1350 ; RV64I-LABEL: xor_i64_66901:
1351 ; RV64I:       # %bb.0:
1352 ; RV64I-NEXT:    lui a1, 16
1353 ; RV64I-NEXT:    addiw a1, a1, 1365
1354 ; RV64I-NEXT:    xor a0, a0, a1
1355 ; RV64I-NEXT:    ret
1357 ; RV64B-LABEL: xor_i64_66901:
1358 ; RV64B:       # %bb.0:
1359 ; RV64B-NEXT:    xori a0, a0, 1365
1360 ; RV64B-NEXT:    binvi a0, a0, 16
1361 ; RV64B-NEXT:    ret
1363 ; RV64ZBS-LABEL: xor_i64_66901:
1364 ; RV64ZBS:       # %bb.0:
1365 ; RV64ZBS-NEXT:    xori a0, a0, 1365
1366 ; RV64ZBS-NEXT:    binvi a0, a0, 16
1367 ; RV64ZBS-NEXT:    ret
1368   %xor = xor i64 %a, 66901
1369   ret i64 %xor
1372 define i64 @or_i64_4099(i64 %a) nounwind {
1373 ; RV64I-LABEL: or_i64_4099:
1374 ; RV64I:       # %bb.0:
1375 ; RV64I-NEXT:    lui a1, 1
1376 ; RV64I-NEXT:    addiw a1, a1, 3
1377 ; RV64I-NEXT:    or a0, a0, a1
1378 ; RV64I-NEXT:    ret
1380 ; RV64B-LABEL: or_i64_4099:
1381 ; RV64B:       # %bb.0:
1382 ; RV64B-NEXT:    ori a0, a0, 3
1383 ; RV64B-NEXT:    bseti a0, a0, 12
1384 ; RV64B-NEXT:    ret
1386 ; RV64ZBS-LABEL: or_i64_4099:
1387 ; RV64ZBS:       # %bb.0:
1388 ; RV64ZBS-NEXT:    ori a0, a0, 3
1389 ; RV64ZBS-NEXT:    bseti a0, a0, 12
1390 ; RV64ZBS-NEXT:    ret
1391   %or = or i64 %a, 4099
1392   ret i64 %or
1395 define i64 @or_i64_96(i64 %a) nounwind {
1396 ; RV64I-LABEL: or_i64_96:
1397 ; RV64I:       # %bb.0:
1398 ; RV64I-NEXT:    ori a0, a0, 96
1399 ; RV64I-NEXT:    ret
1401 ; RV64B-LABEL: or_i64_96:
1402 ; RV64B:       # %bb.0:
1403 ; RV64B-NEXT:    ori a0, a0, 96
1404 ; RV64B-NEXT:    ret
1406 ; RV64ZBS-LABEL: or_i64_96:
1407 ; RV64ZBS:       # %bb.0:
1408 ; RV64ZBS-NEXT:    ori a0, a0, 96
1409 ; RV64ZBS-NEXT:    ret
1410   %or = or i64 %a, 96
1411   ret i64 %or
1414 define i64 @or_i64_66901(i64 %a) nounwind {
1415 ; RV64I-LABEL: or_i64_66901:
1416 ; RV64I:       # %bb.0:
1417 ; RV64I-NEXT:    lui a1, 16
1418 ; RV64I-NEXT:    addiw a1, a1, 1365
1419 ; RV64I-NEXT:    or a0, a0, a1
1420 ; RV64I-NEXT:    ret
1422 ; RV64B-LABEL: or_i64_66901:
1423 ; RV64B:       # %bb.0:
1424 ; RV64B-NEXT:    ori a0, a0, 1365
1425 ; RV64B-NEXT:    bseti a0, a0, 16
1426 ; RV64B-NEXT:    ret
1428 ; RV64ZBS-LABEL: or_i64_66901:
1429 ; RV64ZBS:       # %bb.0:
1430 ; RV64ZBS-NEXT:    ori a0, a0, 1365
1431 ; RV64ZBS-NEXT:    bseti a0, a0, 16
1432 ; RV64ZBS-NEXT:    ret
1433   %or = or i64 %a, 66901
1434   ret i64 %or