Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / sext-zext-trunc.ll
blob20d73acddea01b07b022c7258a4c319a91833695
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefix=RV32I
4 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefixes=RV64,RV64I
6 ; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \
7 ; RUN:   | FileCheck %s -check-prefixes=RV64,RV64ZBB
9 define i8 @sext_i1_to_i8(i1 %a) nounwind {
10 ; RV32I-LABEL: sext_i1_to_i8:
11 ; RV32I:       # %bb.0:
12 ; RV32I-NEXT:    slli a0, a0, 31
13 ; RV32I-NEXT:    srai a0, a0, 31
14 ; RV32I-NEXT:    ret
16 ; RV64-LABEL: sext_i1_to_i8:
17 ; RV64:       # %bb.0:
18 ; RV64-NEXT:    slli a0, a0, 63
19 ; RV64-NEXT:    srai a0, a0, 63
20 ; RV64-NEXT:    ret
21   %1 = sext i1 %a to i8
22   ret i8 %1
25 define i16 @sext_i1_to_i16(i1 %a) nounwind {
26 ; RV32I-LABEL: sext_i1_to_i16:
27 ; RV32I:       # %bb.0:
28 ; RV32I-NEXT:    slli a0, a0, 31
29 ; RV32I-NEXT:    srai a0, a0, 31
30 ; RV32I-NEXT:    ret
32 ; RV64-LABEL: sext_i1_to_i16:
33 ; RV64:       # %bb.0:
34 ; RV64-NEXT:    slli a0, a0, 63
35 ; RV64-NEXT:    srai a0, a0, 63
36 ; RV64-NEXT:    ret
37   %1 = sext i1 %a to i16
38   ret i16 %1
41 define i32 @sext_i1_to_i32(i1 %a) nounwind {
42 ; RV32I-LABEL: sext_i1_to_i32:
43 ; RV32I:       # %bb.0:
44 ; RV32I-NEXT:    slli a0, a0, 31
45 ; RV32I-NEXT:    srai a0, a0, 31
46 ; RV32I-NEXT:    ret
48 ; RV64-LABEL: sext_i1_to_i32:
49 ; RV64:       # %bb.0:
50 ; RV64-NEXT:    slli a0, a0, 63
51 ; RV64-NEXT:    srai a0, a0, 63
52 ; RV64-NEXT:    ret
53   %1 = sext i1 %a to i32
54   ret i32 %1
57 define i64 @sext_i1_to_i64(i1 %a) nounwind {
58 ; RV32I-LABEL: sext_i1_to_i64:
59 ; RV32I:       # %bb.0:
60 ; RV32I-NEXT:    slli a0, a0, 31
61 ; RV32I-NEXT:    srai a0, a0, 31
62 ; RV32I-NEXT:    mv a1, a0
63 ; RV32I-NEXT:    ret
65 ; RV64-LABEL: sext_i1_to_i64:
66 ; RV64:       # %bb.0:
67 ; RV64-NEXT:    slli a0, a0, 63
68 ; RV64-NEXT:    srai a0, a0, 63
69 ; RV64-NEXT:    ret
70   %1 = sext i1 %a to i64
71   ret i64 %1
74 define i16 @sext_i8_to_i16(i8 %a) nounwind {
75 ; RV32I-LABEL: sext_i8_to_i16:
76 ; RV32I:       # %bb.0:
77 ; RV32I-NEXT:    slli a0, a0, 24
78 ; RV32I-NEXT:    srai a0, a0, 24
79 ; RV32I-NEXT:    ret
81 ; RV64I-LABEL: sext_i8_to_i16:
82 ; RV64I:       # %bb.0:
83 ; RV64I-NEXT:    slli a0, a0, 56
84 ; RV64I-NEXT:    srai a0, a0, 56
85 ; RV64I-NEXT:    ret
87 ; RV64ZBB-LABEL: sext_i8_to_i16:
88 ; RV64ZBB:       # %bb.0:
89 ; RV64ZBB-NEXT:    sext.b a0, a0
90 ; RV64ZBB-NEXT:    ret
91   %1 = sext i8 %a to i16
92   ret i16 %1
95 define i32 @sext_i8_to_i32(i8 %a) nounwind {
96 ; RV32I-LABEL: sext_i8_to_i32:
97 ; RV32I:       # %bb.0:
98 ; RV32I-NEXT:    slli a0, a0, 24
99 ; RV32I-NEXT:    srai a0, a0, 24
100 ; RV32I-NEXT:    ret
102 ; RV64I-LABEL: sext_i8_to_i32:
103 ; RV64I:       # %bb.0:
104 ; RV64I-NEXT:    slli a0, a0, 56
105 ; RV64I-NEXT:    srai a0, a0, 56
106 ; RV64I-NEXT:    ret
108 ; RV64ZBB-LABEL: sext_i8_to_i32:
109 ; RV64ZBB:       # %bb.0:
110 ; RV64ZBB-NEXT:    sext.b a0, a0
111 ; RV64ZBB-NEXT:    ret
112   %1 = sext i8 %a to i32
113   ret i32 %1
116 define i64 @sext_i8_to_i64(i8 %a) nounwind {
117 ; RV32I-LABEL: sext_i8_to_i64:
118 ; RV32I:       # %bb.0:
119 ; RV32I-NEXT:    slli a1, a0, 24
120 ; RV32I-NEXT:    srai a0, a1, 24
121 ; RV32I-NEXT:    srai a1, a1, 31
122 ; RV32I-NEXT:    ret
124 ; RV64I-LABEL: sext_i8_to_i64:
125 ; RV64I:       # %bb.0:
126 ; RV64I-NEXT:    slli a0, a0, 56
127 ; RV64I-NEXT:    srai a0, a0, 56
128 ; RV64I-NEXT:    ret
130 ; RV64ZBB-LABEL: sext_i8_to_i64:
131 ; RV64ZBB:       # %bb.0:
132 ; RV64ZBB-NEXT:    sext.b a0, a0
133 ; RV64ZBB-NEXT:    ret
134   %1 = sext i8 %a to i64
135   ret i64 %1
138 define i32 @sext_i16_to_i32(i16 %a) nounwind {
139 ; RV32I-LABEL: sext_i16_to_i32:
140 ; RV32I:       # %bb.0:
141 ; RV32I-NEXT:    slli a0, a0, 16
142 ; RV32I-NEXT:    srai a0, a0, 16
143 ; RV32I-NEXT:    ret
145 ; RV64I-LABEL: sext_i16_to_i32:
146 ; RV64I:       # %bb.0:
147 ; RV64I-NEXT:    slli a0, a0, 48
148 ; RV64I-NEXT:    srai a0, a0, 48
149 ; RV64I-NEXT:    ret
151 ; RV64ZBB-LABEL: sext_i16_to_i32:
152 ; RV64ZBB:       # %bb.0:
153 ; RV64ZBB-NEXT:    sext.h a0, a0
154 ; RV64ZBB-NEXT:    ret
155   %1 = sext i16 %a to i32
156   ret i32 %1
159 define i64 @sext_i16_to_i64(i16 %a) nounwind {
160 ; RV32I-LABEL: sext_i16_to_i64:
161 ; RV32I:       # %bb.0:
162 ; RV32I-NEXT:    slli a1, a0, 16
163 ; RV32I-NEXT:    srai a0, a1, 16
164 ; RV32I-NEXT:    srai a1, a1, 31
165 ; RV32I-NEXT:    ret
167 ; RV64I-LABEL: sext_i16_to_i64:
168 ; RV64I:       # %bb.0:
169 ; RV64I-NEXT:    slli a0, a0, 48
170 ; RV64I-NEXT:    srai a0, a0, 48
171 ; RV64I-NEXT:    ret
173 ; RV64ZBB-LABEL: sext_i16_to_i64:
174 ; RV64ZBB:       # %bb.0:
175 ; RV64ZBB-NEXT:    sext.h a0, a0
176 ; RV64ZBB-NEXT:    ret
177   %1 = sext i16 %a to i64
178   ret i64 %1
181 define i64 @sext_i32_to_i64(i32 %a) nounwind {
182 ; RV32I-LABEL: sext_i32_to_i64:
183 ; RV32I:       # %bb.0:
184 ; RV32I-NEXT:    srai a1, a0, 31
185 ; RV32I-NEXT:    ret
187 ; RV64-LABEL: sext_i32_to_i64:
188 ; RV64:       # %bb.0:
189 ; RV64-NEXT:    sext.w a0, a0
190 ; RV64-NEXT:    ret
191   %1 = sext i32 %a to i64
192   ret i64 %1
195 define i8 @zext_i1_to_i8(i1 %a) nounwind {
196 ; RV32I-LABEL: zext_i1_to_i8:
197 ; RV32I:       # %bb.0:
198 ; RV32I-NEXT:    andi a0, a0, 1
199 ; RV32I-NEXT:    ret
201 ; RV64-LABEL: zext_i1_to_i8:
202 ; RV64:       # %bb.0:
203 ; RV64-NEXT:    andi a0, a0, 1
204 ; RV64-NEXT:    ret
205   %1 = zext i1 %a to i8
206   ret i8 %1
209 define i16 @zext_i1_to_i16(i1 %a) nounwind {
210 ; RV32I-LABEL: zext_i1_to_i16:
211 ; RV32I:       # %bb.0:
212 ; RV32I-NEXT:    andi a0, a0, 1
213 ; RV32I-NEXT:    ret
215 ; RV64-LABEL: zext_i1_to_i16:
216 ; RV64:       # %bb.0:
217 ; RV64-NEXT:    andi a0, a0, 1
218 ; RV64-NEXT:    ret
219   %1 = zext i1 %a to i16
220   ret i16 %1
223 define i32 @zext_i1_to_i32(i1 %a) nounwind {
224 ; RV32I-LABEL: zext_i1_to_i32:
225 ; RV32I:       # %bb.0:
226 ; RV32I-NEXT:    andi a0, a0, 1
227 ; RV32I-NEXT:    ret
229 ; RV64-LABEL: zext_i1_to_i32:
230 ; RV64:       # %bb.0:
231 ; RV64-NEXT:    andi a0, a0, 1
232 ; RV64-NEXT:    ret
233   %1 = zext i1 %a to i32
234   ret i32 %1
237 define i64 @zext_i1_to_i64(i1 %a) nounwind {
238 ; RV32I-LABEL: zext_i1_to_i64:
239 ; RV32I:       # %bb.0:
240 ; RV32I-NEXT:    andi a0, a0, 1
241 ; RV32I-NEXT:    li a1, 0
242 ; RV32I-NEXT:    ret
244 ; RV64-LABEL: zext_i1_to_i64:
245 ; RV64:       # %bb.0:
246 ; RV64-NEXT:    andi a0, a0, 1
247 ; RV64-NEXT:    ret
248   %1 = zext i1 %a to i64
249   ret i64 %1
252 define i16 @zext_i8_to_i16(i8 %a) nounwind {
253 ; RV32I-LABEL: zext_i8_to_i16:
254 ; RV32I:       # %bb.0:
255 ; RV32I-NEXT:    andi a0, a0, 255
256 ; RV32I-NEXT:    ret
258 ; RV64-LABEL: zext_i8_to_i16:
259 ; RV64:       # %bb.0:
260 ; RV64-NEXT:    andi a0, a0, 255
261 ; RV64-NEXT:    ret
262   %1 = zext i8 %a to i16
263   ret i16 %1
266 define i32 @zext_i8_to_i32(i8 %a) nounwind {
267 ; RV32I-LABEL: zext_i8_to_i32:
268 ; RV32I:       # %bb.0:
269 ; RV32I-NEXT:    andi a0, a0, 255
270 ; RV32I-NEXT:    ret
272 ; RV64-LABEL: zext_i8_to_i32:
273 ; RV64:       # %bb.0:
274 ; RV64-NEXT:    andi a0, a0, 255
275 ; RV64-NEXT:    ret
276   %1 = zext i8 %a to i32
277   ret i32 %1
280 define i64 @zext_i8_to_i64(i8 %a) nounwind {
281 ; RV32I-LABEL: zext_i8_to_i64:
282 ; RV32I:       # %bb.0:
283 ; RV32I-NEXT:    andi a0, a0, 255
284 ; RV32I-NEXT:    li a1, 0
285 ; RV32I-NEXT:    ret
287 ; RV64-LABEL: zext_i8_to_i64:
288 ; RV64:       # %bb.0:
289 ; RV64-NEXT:    andi a0, a0, 255
290 ; RV64-NEXT:    ret
291   %1 = zext i8 %a to i64
292   ret i64 %1
295 define i32 @zext_i16_to_i32(i16 %a) nounwind {
296 ; RV32I-LABEL: zext_i16_to_i32:
297 ; RV32I:       # %bb.0:
298 ; RV32I-NEXT:    slli a0, a0, 16
299 ; RV32I-NEXT:    srli a0, a0, 16
300 ; RV32I-NEXT:    ret
302 ; RV64I-LABEL: zext_i16_to_i32:
303 ; RV64I:       # %bb.0:
304 ; RV64I-NEXT:    slli a0, a0, 48
305 ; RV64I-NEXT:    srli a0, a0, 48
306 ; RV64I-NEXT:    ret
308 ; RV64ZBB-LABEL: zext_i16_to_i32:
309 ; RV64ZBB:       # %bb.0:
310 ; RV64ZBB-NEXT:    zext.h a0, a0
311 ; RV64ZBB-NEXT:    ret
312   %1 = zext i16 %a to i32
313   ret i32 %1
316 define i64 @zext_i16_to_i64(i16 %a) nounwind {
317 ; RV32I-LABEL: zext_i16_to_i64:
318 ; RV32I:       # %bb.0:
319 ; RV32I-NEXT:    slli a0, a0, 16
320 ; RV32I-NEXT:    srli a0, a0, 16
321 ; RV32I-NEXT:    li a1, 0
322 ; RV32I-NEXT:    ret
324 ; RV64I-LABEL: zext_i16_to_i64:
325 ; RV64I:       # %bb.0:
326 ; RV64I-NEXT:    slli a0, a0, 48
327 ; RV64I-NEXT:    srli a0, a0, 48
328 ; RV64I-NEXT:    ret
330 ; RV64ZBB-LABEL: zext_i16_to_i64:
331 ; RV64ZBB:       # %bb.0:
332 ; RV64ZBB-NEXT:    zext.h a0, a0
333 ; RV64ZBB-NEXT:    ret
334   %1 = zext i16 %a to i64
335   ret i64 %1
338 define i64 @zext_i32_to_i64(i32 %a) nounwind {
339 ; RV32I-LABEL: zext_i32_to_i64:
340 ; RV32I:       # %bb.0:
341 ; RV32I-NEXT:    li a1, 0
342 ; RV32I-NEXT:    ret
344 ; RV64-LABEL: zext_i32_to_i64:
345 ; RV64:       # %bb.0:
346 ; RV64-NEXT:    slli a0, a0, 32
347 ; RV64-NEXT:    srli a0, a0, 32
348 ; RV64-NEXT:    ret
349   %1 = zext i32 %a to i64
350   ret i64 %1
353 define i8 @zext_nneg_i1_to_i8(i1 %a) nounwind {
354 ; RV32I-LABEL: zext_nneg_i1_to_i8:
355 ; RV32I:       # %bb.0:
356 ; RV32I-NEXT:    andi a0, a0, 1
357 ; RV32I-NEXT:    ret
359 ; RV64-LABEL: zext_nneg_i1_to_i8:
360 ; RV64:       # %bb.0:
361 ; RV64-NEXT:    andi a0, a0, 1
362 ; RV64-NEXT:    ret
363   %1 = zext nneg i1 %a to i8
364   ret i8 %1
367 define i16 @zext_nneg_i1_to_i16(i1 %a) nounwind {
368 ; RV32I-LABEL: zext_nneg_i1_to_i16:
369 ; RV32I:       # %bb.0:
370 ; RV32I-NEXT:    andi a0, a0, 1
371 ; RV32I-NEXT:    ret
373 ; RV64-LABEL: zext_nneg_i1_to_i16:
374 ; RV64:       # %bb.0:
375 ; RV64-NEXT:    andi a0, a0, 1
376 ; RV64-NEXT:    ret
377   %1 = zext nneg i1 %a to i16
378   ret i16 %1
381 define i32 @zext_nneg_i1_to_i32(i1 %a) nounwind {
382 ; RV32I-LABEL: zext_nneg_i1_to_i32:
383 ; RV32I:       # %bb.0:
384 ; RV32I-NEXT:    andi a0, a0, 1
385 ; RV32I-NEXT:    ret
387 ; RV64-LABEL: zext_nneg_i1_to_i32:
388 ; RV64:       # %bb.0:
389 ; RV64-NEXT:    andi a0, a0, 1
390 ; RV64-NEXT:    ret
391   %1 = zext nneg i1 %a to i32
392   ret i32 %1
395 define i64 @zext_nneg_i1_to_i64(i1 %a) nounwind {
396 ; RV32I-LABEL: zext_nneg_i1_to_i64:
397 ; RV32I:       # %bb.0:
398 ; RV32I-NEXT:    andi a0, a0, 1
399 ; RV32I-NEXT:    li a1, 0
400 ; RV32I-NEXT:    ret
402 ; RV64-LABEL: zext_nneg_i1_to_i64:
403 ; RV64:       # %bb.0:
404 ; RV64-NEXT:    andi a0, a0, 1
405 ; RV64-NEXT:    ret
406   %1 = zext nneg i1 %a to i64
407   ret i64 %1
410 define i16 @zext_nneg_i8_to_i16(i8 %a) nounwind {
411 ; RV32I-LABEL: zext_nneg_i8_to_i16:
412 ; RV32I:       # %bb.0:
413 ; RV32I-NEXT:    andi a0, a0, 255
414 ; RV32I-NEXT:    ret
416 ; RV64-LABEL: zext_nneg_i8_to_i16:
417 ; RV64:       # %bb.0:
418 ; RV64-NEXT:    andi a0, a0, 255
419 ; RV64-NEXT:    ret
420   %1 = zext nneg i8 %a to i16
421   ret i16 %1
424 define i32 @zext_nneg_i8_to_i32(i8 %a) nounwind {
425 ; RV32I-LABEL: zext_nneg_i8_to_i32:
426 ; RV32I:       # %bb.0:
427 ; RV32I-NEXT:    andi a0, a0, 255
428 ; RV32I-NEXT:    ret
430 ; RV64-LABEL: zext_nneg_i8_to_i32:
431 ; RV64:       # %bb.0:
432 ; RV64-NEXT:    andi a0, a0, 255
433 ; RV64-NEXT:    ret
434   %1 = zext nneg i8 %a to i32
435   ret i32 %1
438 define i64 @zext_nneg_i8_to_i64(i8 %a) nounwind {
439 ; RV32I-LABEL: zext_nneg_i8_to_i64:
440 ; RV32I:       # %bb.0:
441 ; RV32I-NEXT:    andi a0, a0, 255
442 ; RV32I-NEXT:    li a1, 0
443 ; RV32I-NEXT:    ret
445 ; RV64-LABEL: zext_nneg_i8_to_i64:
446 ; RV64:       # %bb.0:
447 ; RV64-NEXT:    andi a0, a0, 255
448 ; RV64-NEXT:    ret
449   %1 = zext nneg i8 %a to i64
450   ret i64 %1
453 define i32 @zext_nneg_i16_to_i32(i16 %a) nounwind {
454 ; RV32I-LABEL: zext_nneg_i16_to_i32:
455 ; RV32I:       # %bb.0:
456 ; RV32I-NEXT:    slli a0, a0, 16
457 ; RV32I-NEXT:    srli a0, a0, 16
458 ; RV32I-NEXT:    ret
460 ; RV64I-LABEL: zext_nneg_i16_to_i32:
461 ; RV64I:       # %bb.0:
462 ; RV64I-NEXT:    slli a0, a0, 48
463 ; RV64I-NEXT:    srli a0, a0, 48
464 ; RV64I-NEXT:    ret
466 ; RV64ZBB-LABEL: zext_nneg_i16_to_i32:
467 ; RV64ZBB:       # %bb.0:
468 ; RV64ZBB-NEXT:    zext.h a0, a0
469 ; RV64ZBB-NEXT:    ret
470   %1 = zext nneg i16 %a to i32
471   ret i32 %1
474 define i64 @zext_nneg_i16_to_i64(i16 %a) nounwind {
475 ; RV32I-LABEL: zext_nneg_i16_to_i64:
476 ; RV32I:       # %bb.0:
477 ; RV32I-NEXT:    slli a0, a0, 16
478 ; RV32I-NEXT:    srli a0, a0, 16
479 ; RV32I-NEXT:    li a1, 0
480 ; RV32I-NEXT:    ret
482 ; RV64I-LABEL: zext_nneg_i16_to_i64:
483 ; RV64I:       # %bb.0:
484 ; RV64I-NEXT:    slli a0, a0, 48
485 ; RV64I-NEXT:    srli a0, a0, 48
486 ; RV64I-NEXT:    ret
488 ; RV64ZBB-LABEL: zext_nneg_i16_to_i64:
489 ; RV64ZBB:       # %bb.0:
490 ; RV64ZBB-NEXT:    zext.h a0, a0
491 ; RV64ZBB-NEXT:    ret
492   %1 = zext nneg i16 %a to i64
493   ret i64 %1
496 define i64 @zext_nneg_i32_to_i64(i32 %a) nounwind {
497 ; RV32I-LABEL: zext_nneg_i32_to_i64:
498 ; RV32I:       # %bb.0:
499 ; RV32I-NEXT:    li a1, 0
500 ; RV32I-NEXT:    ret
502 ; RV64-LABEL: zext_nneg_i32_to_i64:
503 ; RV64:       # %bb.0:
504 ; RV64-NEXT:    sext.w a0, a0
505 ; RV64-NEXT:    ret
506   %1 = zext nneg i32 %a to i64
507   ret i64 %1
510 define i1 @trunc_i8_to_i1(i8 %a) nounwind {
511 ; RV32I-LABEL: trunc_i8_to_i1:
512 ; RV32I:       # %bb.0:
513 ; RV32I-NEXT:    ret
515 ; RV64-LABEL: trunc_i8_to_i1:
516 ; RV64:       # %bb.0:
517 ; RV64-NEXT:    ret
518   %1 = trunc i8 %a to i1
519   ret i1 %1
522 define i1 @trunc_i16_to_i1(i16 %a) nounwind {
523 ; RV32I-LABEL: trunc_i16_to_i1:
524 ; RV32I:       # %bb.0:
525 ; RV32I-NEXT:    ret
527 ; RV64-LABEL: trunc_i16_to_i1:
528 ; RV64:       # %bb.0:
529 ; RV64-NEXT:    ret
530   %1 = trunc i16 %a to i1
531   ret i1 %1
534 define i1 @trunc_i32_to_i1(i32 %a) nounwind {
535 ; RV32I-LABEL: trunc_i32_to_i1:
536 ; RV32I:       # %bb.0:
537 ; RV32I-NEXT:    ret
539 ; RV64-LABEL: trunc_i32_to_i1:
540 ; RV64:       # %bb.0:
541 ; RV64-NEXT:    ret
542   %1 = trunc i32 %a to i1
543   ret i1 %1
546 define i1 @trunc_i64_to_i1(i64 %a) nounwind {
547 ; RV32I-LABEL: trunc_i64_to_i1:
548 ; RV32I:       # %bb.0:
549 ; RV32I-NEXT:    ret
551 ; RV64-LABEL: trunc_i64_to_i1:
552 ; RV64:       # %bb.0:
553 ; RV64-NEXT:    ret
554   %1 = trunc i64 %a to i1
555   ret i1 %1
558 define i8 @trunc_i16_to_i8(i16 %a) nounwind {
559 ; RV32I-LABEL: trunc_i16_to_i8:
560 ; RV32I:       # %bb.0:
561 ; RV32I-NEXT:    ret
563 ; RV64-LABEL: trunc_i16_to_i8:
564 ; RV64:       # %bb.0:
565 ; RV64-NEXT:    ret
566   %1 = trunc i16 %a to i8
567   ret i8 %1
570 define i8 @trunc_i32_to_i8(i32 %a) nounwind {
571 ; RV32I-LABEL: trunc_i32_to_i8:
572 ; RV32I:       # %bb.0:
573 ; RV32I-NEXT:    ret
575 ; RV64-LABEL: trunc_i32_to_i8:
576 ; RV64:       # %bb.0:
577 ; RV64-NEXT:    ret
578   %1 = trunc i32 %a to i8
579   ret i8 %1
582 define i8 @trunc_i64_to_i8(i64 %a) nounwind {
583 ; RV32I-LABEL: trunc_i64_to_i8:
584 ; RV32I:       # %bb.0:
585 ; RV32I-NEXT:    ret
587 ; RV64-LABEL: trunc_i64_to_i8:
588 ; RV64:       # %bb.0:
589 ; RV64-NEXT:    ret
590   %1 = trunc i64 %a to i8
591   ret i8 %1
594 define i16 @trunc_i32_to_i16(i32 %a) nounwind {
595 ; RV32I-LABEL: trunc_i32_to_i16:
596 ; RV32I:       # %bb.0:
597 ; RV32I-NEXT:    ret
599 ; RV64-LABEL: trunc_i32_to_i16:
600 ; RV64:       # %bb.0:
601 ; RV64-NEXT:    ret
602   %1 = trunc i32 %a to i16
603   ret i16 %1
606 define i16 @trunc_i64_to_i16(i64 %a) nounwind {
607 ; RV32I-LABEL: trunc_i64_to_i16:
608 ; RV32I:       # %bb.0:
609 ; RV32I-NEXT:    ret
611 ; RV64-LABEL: trunc_i64_to_i16:
612 ; RV64:       # %bb.0:
613 ; RV64-NEXT:    ret
614   %1 = trunc i64 %a to i16
615   ret i16 %1
618 define i32 @trunc_i64_to_i32(i64 %a) nounwind {
619 ; RV32I-LABEL: trunc_i64_to_i32:
620 ; RV32I:       # %bb.0:
621 ; RV32I-NEXT:    ret
623 ; RV64-LABEL: trunc_i64_to_i32:
624 ; RV64:       # %bb.0:
625 ; RV64-NEXT:    ret
626   %1 = trunc i64 %a to i32
627   ret i32 %1
630 ;; fold (sext (not x)) -> (add (zext x) -1)
631 define i32 @sext_of_not_i32(i1 %x) {
632 ; RV32I-LABEL: sext_of_not_i32:
633 ; RV32I:       # %bb.0:
634 ; RV32I-NEXT:    andi a0, a0, 1
635 ; RV32I-NEXT:    addi a0, a0, -1
636 ; RV32I-NEXT:    ret
638 ; RV64-LABEL: sext_of_not_i32:
639 ; RV64:       # %bb.0:
640 ; RV64-NEXT:    andi a0, a0, 1
641 ; RV64-NEXT:    addi a0, a0, -1
642 ; RV64-NEXT:    ret
643   %xor = xor i1 %x, 1
644   %sext = sext i1 %xor to i32
645   ret i32 %sext
648 define i64 @sext_of_not_i64(i1 %x) {
649 ; RV32I-LABEL: sext_of_not_i64:
650 ; RV32I:       # %bb.0:
651 ; RV32I-NEXT:    andi a0, a0, 1
652 ; RV32I-NEXT:    addi a0, a0, -1
653 ; RV32I-NEXT:    mv a1, a0
654 ; RV32I-NEXT:    ret
656 ; RV64-LABEL: sext_of_not_i64:
657 ; RV64:       # %bb.0:
658 ; RV64-NEXT:    andi a0, a0, 1
659 ; RV64-NEXT:    addi a0, a0, -1
660 ; RV64-NEXT:    ret
661   %xor = xor i1 %x, 1
662   %sext = sext i1 %xor to i64
663   ret i64 %sext
666 ;; fold (sext (not (setcc a, b, cc))) -> (sext (setcc a, b, !cc))
667 define i32 @sext_of_not_cmp_i32(i32 %x) {
668 ; RV32I-LABEL: sext_of_not_cmp_i32:
669 ; RV32I:       # %bb.0:
670 ; RV32I-NEXT:    addi a0, a0, -7
671 ; RV32I-NEXT:    seqz a0, a0
672 ; RV32I-NEXT:    addi a0, a0, -1
673 ; RV32I-NEXT:    ret
675 ; RV64-LABEL: sext_of_not_cmp_i32:
676 ; RV64:       # %bb.0:
677 ; RV64-NEXT:    sext.w a0, a0
678 ; RV64-NEXT:    addi a0, a0, -7
679 ; RV64-NEXT:    seqz a0, a0
680 ; RV64-NEXT:    addi a0, a0, -1
681 ; RV64-NEXT:    ret
682   %cmp = icmp eq i32 %x, 7
683   %xor = xor i1 %cmp, 1
684   %sext = sext i1 %xor to i32
685   ret i32 %sext
688 define i64 @sext_of_not_cmp_i64(i64 %x) {
689 ; RV32I-LABEL: sext_of_not_cmp_i64:
690 ; RV32I:       # %bb.0:
691 ; RV32I-NEXT:    xori a0, a0, 7
692 ; RV32I-NEXT:    or a0, a0, a1
693 ; RV32I-NEXT:    seqz a0, a0
694 ; RV32I-NEXT:    addi a0, a0, -1
695 ; RV32I-NEXT:    mv a1, a0
696 ; RV32I-NEXT:    ret
698 ; RV64-LABEL: sext_of_not_cmp_i64:
699 ; RV64:       # %bb.0:
700 ; RV64-NEXT:    addi a0, a0, -7
701 ; RV64-NEXT:    seqz a0, a0
702 ; RV64-NEXT:    addi a0, a0, -1
703 ; RV64-NEXT:    ret
704   %cmp = icmp eq i64 %x, 7
705   %xor = xor i1 %cmp, 1
706   %sext = sext i1 %xor to i64
707   ret i64 %sext
710 ;; TODO: fold (add (zext (setcc a, b, cc)), -1) -> (sext (setcc a, b, !cc))
711 define i32 @dec_of_zexted_cmp_i32(i32 %x) {
712 ; RV32I-LABEL: dec_of_zexted_cmp_i32:
713 ; RV32I:       # %bb.0:
714 ; RV32I-NEXT:    addi a0, a0, -7
715 ; RV32I-NEXT:    seqz a0, a0
716 ; RV32I-NEXT:    addi a0, a0, -1
717 ; RV32I-NEXT:    ret
719 ; RV64-LABEL: dec_of_zexted_cmp_i32:
720 ; RV64:       # %bb.0:
721 ; RV64-NEXT:    sext.w a0, a0
722 ; RV64-NEXT:    addi a0, a0, -7
723 ; RV64-NEXT:    seqz a0, a0
724 ; RV64-NEXT:    addi a0, a0, -1
725 ; RV64-NEXT:    ret
726   %cmp = icmp eq i32 %x, 7
727   %zext = zext i1 %cmp to i32
728   %dec = sub i32 %zext, 1
729   ret i32 %dec
732 define i64 @dec_of_zexted_cmp_i64(i64 %x) {
733 ; RV32I-LABEL: dec_of_zexted_cmp_i64:
734 ; RV32I:       # %bb.0:
735 ; RV32I-NEXT:    xori a0, a0, 7
736 ; RV32I-NEXT:    or a0, a0, a1
737 ; RV32I-NEXT:    seqz a0, a0
738 ; RV32I-NEXT:    addi a0, a0, -1
739 ; RV32I-NEXT:    mv a1, a0
740 ; RV32I-NEXT:    ret
742 ; RV64-LABEL: dec_of_zexted_cmp_i64:
743 ; RV64:       # %bb.0:
744 ; RV64-NEXT:    addi a0, a0, -7
745 ; RV64-NEXT:    seqz a0, a0
746 ; RV64-NEXT:    addi a0, a0, -1
747 ; RV64-NEXT:    ret
748   %cmp = icmp eq i64 %x, 7
749   %zext = zext i1 %cmp to i64
750   %dec = sub i64 %zext, 1
751   ret i64 %dec