[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / RISCV / sext-zext-trunc.ll
blob53e68f5e95d737400b825c3cdea771ea5e140fe7
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-prefix=RV64I
7 define i8 @sext_i1_to_i8(i1 %a) nounwind {
8 ; RV32I-LABEL: sext_i1_to_i8:
9 ; RV32I:       # %bb.0:
10 ; RV32I-NEXT:    andi a0, a0, 1
11 ; RV32I-NEXT:    neg a0, a0
12 ; RV32I-NEXT:    ret
14 ; RV64I-LABEL: sext_i1_to_i8:
15 ; RV64I:       # %bb.0:
16 ; RV64I-NEXT:    andi a0, a0, 1
17 ; RV64I-NEXT:    neg a0, a0
18 ; RV64I-NEXT:    ret
19   %1 = sext i1 %a to i8
20   ret i8 %1
23 define i16 @sext_i1_to_i16(i1 %a) nounwind {
24 ; RV32I-LABEL: sext_i1_to_i16:
25 ; RV32I:       # %bb.0:
26 ; RV32I-NEXT:    andi a0, a0, 1
27 ; RV32I-NEXT:    neg a0, a0
28 ; RV32I-NEXT:    ret
30 ; RV64I-LABEL: sext_i1_to_i16:
31 ; RV64I:       # %bb.0:
32 ; RV64I-NEXT:    andi a0, a0, 1
33 ; RV64I-NEXT:    neg a0, a0
34 ; RV64I-NEXT:    ret
35   %1 = sext i1 %a to i16
36   ret i16 %1
39 define i32 @sext_i1_to_i32(i1 %a) nounwind {
40 ; RV32I-LABEL: sext_i1_to_i32:
41 ; RV32I:       # %bb.0:
42 ; RV32I-NEXT:    andi a0, a0, 1
43 ; RV32I-NEXT:    neg a0, a0
44 ; RV32I-NEXT:    ret
46 ; RV64I-LABEL: sext_i1_to_i32:
47 ; RV64I:       # %bb.0:
48 ; RV64I-NEXT:    andi a0, a0, 1
49 ; RV64I-NEXT:    neg a0, a0
50 ; RV64I-NEXT:    ret
51   %1 = sext i1 %a to i32
52   ret i32 %1
55 define i64 @sext_i1_to_i64(i1 %a) nounwind {
56 ; RV32I-LABEL: sext_i1_to_i64:
57 ; RV32I:       # %bb.0:
58 ; RV32I-NEXT:    andi a0, a0, 1
59 ; RV32I-NEXT:    neg a0, a0
60 ; RV32I-NEXT:    mv a1, a0
61 ; RV32I-NEXT:    ret
63 ; RV64I-LABEL: sext_i1_to_i64:
64 ; RV64I:       # %bb.0:
65 ; RV64I-NEXT:    andi a0, a0, 1
66 ; RV64I-NEXT:    neg a0, a0
67 ; RV64I-NEXT:    ret
68   %1 = sext i1 %a to i64
69   ret i64 %1
72 define i16 @sext_i8_to_i16(i8 %a) nounwind {
73 ; RV32I-LABEL: sext_i8_to_i16:
74 ; RV32I:       # %bb.0:
75 ; RV32I-NEXT:    slli a0, a0, 24
76 ; RV32I-NEXT:    srai a0, a0, 24
77 ; RV32I-NEXT:    ret
79 ; RV64I-LABEL: sext_i8_to_i16:
80 ; RV64I:       # %bb.0:
81 ; RV64I-NEXT:    slli a0, a0, 56
82 ; RV64I-NEXT:    srai a0, a0, 56
83 ; RV64I-NEXT:    ret
84   %1 = sext i8 %a to i16
85   ret i16 %1
88 define i32 @sext_i8_to_i32(i8 %a) nounwind {
89 ; RV32I-LABEL: sext_i8_to_i32:
90 ; RV32I:       # %bb.0:
91 ; RV32I-NEXT:    slli a0, a0, 24
92 ; RV32I-NEXT:    srai a0, a0, 24
93 ; RV32I-NEXT:    ret
95 ; RV64I-LABEL: sext_i8_to_i32:
96 ; RV64I:       # %bb.0:
97 ; RV64I-NEXT:    slli a0, a0, 56
98 ; RV64I-NEXT:    srai a0, a0, 56
99 ; RV64I-NEXT:    ret
100   %1 = sext i8 %a to i32
101   ret i32 %1
104 define i64 @sext_i8_to_i64(i8 %a) nounwind {
105 ; RV32I-LABEL: sext_i8_to_i64:
106 ; RV32I:       # %bb.0:
107 ; RV32I-NEXT:    slli a1, a0, 24
108 ; RV32I-NEXT:    srai a0, a1, 24
109 ; RV32I-NEXT:    srai a1, a1, 31
110 ; RV32I-NEXT:    ret
112 ; RV64I-LABEL: sext_i8_to_i64:
113 ; RV64I:       # %bb.0:
114 ; RV64I-NEXT:    slli a0, a0, 56
115 ; RV64I-NEXT:    srai a0, a0, 56
116 ; RV64I-NEXT:    ret
117   %1 = sext i8 %a to i64
118   ret i64 %1
121 define i32 @sext_i16_to_i32(i16 %a) nounwind {
122 ; RV32I-LABEL: sext_i16_to_i32:
123 ; RV32I:       # %bb.0:
124 ; RV32I-NEXT:    slli a0, a0, 16
125 ; RV32I-NEXT:    srai a0, a0, 16
126 ; RV32I-NEXT:    ret
128 ; RV64I-LABEL: sext_i16_to_i32:
129 ; RV64I:       # %bb.0:
130 ; RV64I-NEXT:    slli a0, a0, 48
131 ; RV64I-NEXT:    srai a0, a0, 48
132 ; RV64I-NEXT:    ret
133   %1 = sext i16 %a to i32
134   ret i32 %1
137 define i64 @sext_i16_to_i64(i16 %a) nounwind {
138 ; RV32I-LABEL: sext_i16_to_i64:
139 ; RV32I:       # %bb.0:
140 ; RV32I-NEXT:    slli a1, a0, 16
141 ; RV32I-NEXT:    srai a0, a1, 16
142 ; RV32I-NEXT:    srai a1, a1, 31
143 ; RV32I-NEXT:    ret
145 ; RV64I-LABEL: sext_i16_to_i64:
146 ; RV64I:       # %bb.0:
147 ; RV64I-NEXT:    slli a0, a0, 48
148 ; RV64I-NEXT:    srai a0, a0, 48
149 ; RV64I-NEXT:    ret
150   %1 = sext i16 %a to i64
151   ret i64 %1
154 define i64 @sext_i32_to_i64(i32 %a) nounwind {
155 ; RV32I-LABEL: sext_i32_to_i64:
156 ; RV32I:       # %bb.0:
157 ; RV32I-NEXT:    srai a1, a0, 31
158 ; RV32I-NEXT:    ret
160 ; RV64I-LABEL: sext_i32_to_i64:
161 ; RV64I:       # %bb.0:
162 ; RV64I-NEXT:    sext.w a0, a0
163 ; RV64I-NEXT:    ret
164   %1 = sext i32 %a to i64
165   ret i64 %1
168 define i8 @zext_i1_to_i8(i1 %a) nounwind {
169 ; RV32I-LABEL: zext_i1_to_i8:
170 ; RV32I:       # %bb.0:
171 ; RV32I-NEXT:    andi a0, a0, 1
172 ; RV32I-NEXT:    ret
174 ; RV64I-LABEL: zext_i1_to_i8:
175 ; RV64I:       # %bb.0:
176 ; RV64I-NEXT:    andi a0, a0, 1
177 ; RV64I-NEXT:    ret
178   %1 = zext i1 %a to i8
179   ret i8 %1
182 define i16 @zext_i1_to_i16(i1 %a) nounwind {
183 ; RV32I-LABEL: zext_i1_to_i16:
184 ; RV32I:       # %bb.0:
185 ; RV32I-NEXT:    andi a0, a0, 1
186 ; RV32I-NEXT:    ret
188 ; RV64I-LABEL: zext_i1_to_i16:
189 ; RV64I:       # %bb.0:
190 ; RV64I-NEXT:    andi a0, a0, 1
191 ; RV64I-NEXT:    ret
192   %1 = zext i1 %a to i16
193   ret i16 %1
196 define i32 @zext_i1_to_i32(i1 %a) nounwind {
197 ; RV32I-LABEL: zext_i1_to_i32:
198 ; RV32I:       # %bb.0:
199 ; RV32I-NEXT:    andi a0, a0, 1
200 ; RV32I-NEXT:    ret
202 ; RV64I-LABEL: zext_i1_to_i32:
203 ; RV64I:       # %bb.0:
204 ; RV64I-NEXT:    andi a0, a0, 1
205 ; RV64I-NEXT:    ret
206   %1 = zext i1 %a to i32
207   ret i32 %1
210 define i64 @zext_i1_to_i64(i1 %a) nounwind {
211 ; RV32I-LABEL: zext_i1_to_i64:
212 ; RV32I:       # %bb.0:
213 ; RV32I-NEXT:    andi a0, a0, 1
214 ; RV32I-NEXT:    mv a1, zero
215 ; RV32I-NEXT:    ret
217 ; RV64I-LABEL: zext_i1_to_i64:
218 ; RV64I:       # %bb.0:
219 ; RV64I-NEXT:    andi a0, a0, 1
220 ; RV64I-NEXT:    ret
221   %1 = zext i1 %a to i64
222   ret i64 %1
225 define i16 @zext_i8_to_i16(i8 %a) nounwind {
226 ; RV32I-LABEL: zext_i8_to_i16:
227 ; RV32I:       # %bb.0:
228 ; RV32I-NEXT:    andi a0, a0, 255
229 ; RV32I-NEXT:    ret
231 ; RV64I-LABEL: zext_i8_to_i16:
232 ; RV64I:       # %bb.0:
233 ; RV64I-NEXT:    andi a0, a0, 255
234 ; RV64I-NEXT:    ret
235   %1 = zext i8 %a to i16
236   ret i16 %1
239 define i32 @zext_i8_to_i32(i8 %a) nounwind {
240 ; RV32I-LABEL: zext_i8_to_i32:
241 ; RV32I:       # %bb.0:
242 ; RV32I-NEXT:    andi a0, a0, 255
243 ; RV32I-NEXT:    ret
245 ; RV64I-LABEL: zext_i8_to_i32:
246 ; RV64I:       # %bb.0:
247 ; RV64I-NEXT:    andi a0, a0, 255
248 ; RV64I-NEXT:    ret
249   %1 = zext i8 %a to i32
250   ret i32 %1
253 define i64 @zext_i8_to_i64(i8 %a) nounwind {
254 ; RV32I-LABEL: zext_i8_to_i64:
255 ; RV32I:       # %bb.0:
256 ; RV32I-NEXT:    andi a0, a0, 255
257 ; RV32I-NEXT:    mv a1, zero
258 ; RV32I-NEXT:    ret
260 ; RV64I-LABEL: zext_i8_to_i64:
261 ; RV64I:       # %bb.0:
262 ; RV64I-NEXT:    andi a0, a0, 255
263 ; RV64I-NEXT:    ret
264   %1 = zext i8 %a to i64
265   ret i64 %1
268 define i32 @zext_i16_to_i32(i16 %a) nounwind {
269 ; RV32I-LABEL: zext_i16_to_i32:
270 ; RV32I:       # %bb.0:
271 ; RV32I-NEXT:    lui a1, 16
272 ; RV32I-NEXT:    addi a1, a1, -1
273 ; RV32I-NEXT:    and a0, a0, a1
274 ; RV32I-NEXT:    ret
276 ; RV64I-LABEL: zext_i16_to_i32:
277 ; RV64I:       # %bb.0:
278 ; RV64I-NEXT:    lui a1, 16
279 ; RV64I-NEXT:    addiw a1, a1, -1
280 ; RV64I-NEXT:    and a0, a0, a1
281 ; RV64I-NEXT:    ret
282   %1 = zext i16 %a to i32
283   ret i32 %1
286 define i64 @zext_i16_to_i64(i16 %a) nounwind {
287 ; RV32I-LABEL: zext_i16_to_i64:
288 ; RV32I:       # %bb.0:
289 ; RV32I-NEXT:    lui a1, 16
290 ; RV32I-NEXT:    addi a1, a1, -1
291 ; RV32I-NEXT:    and a0, a0, a1
292 ; RV32I-NEXT:    mv a1, zero
293 ; RV32I-NEXT:    ret
295 ; RV64I-LABEL: zext_i16_to_i64:
296 ; RV64I:       # %bb.0:
297 ; RV64I-NEXT:    lui a1, 16
298 ; RV64I-NEXT:    addiw a1, a1, -1
299 ; RV64I-NEXT:    and a0, a0, a1
300 ; RV64I-NEXT:    ret
301   %1 = zext i16 %a to i64
302   ret i64 %1
305 define i64 @zext_i32_to_i64(i32 %a) nounwind {
306 ; RV32I-LABEL: zext_i32_to_i64:
307 ; RV32I:       # %bb.0:
308 ; RV32I-NEXT:    mv a1, zero
309 ; RV32I-NEXT:    ret
311 ; RV64I-LABEL: zext_i32_to_i64:
312 ; RV64I:       # %bb.0:
313 ; RV64I-NEXT:    slli a0, a0, 32
314 ; RV64I-NEXT:    srli a0, a0, 32
315 ; RV64I-NEXT:    ret
316   %1 = zext i32 %a to i64
317   ret i64 %1
320 define i1 @trunc_i8_to_i1(i8 %a) nounwind {
321 ; RV32I-LABEL: trunc_i8_to_i1:
322 ; RV32I:       # %bb.0:
323 ; RV32I-NEXT:    ret
325 ; RV64I-LABEL: trunc_i8_to_i1:
326 ; RV64I:       # %bb.0:
327 ; RV64I-NEXT:    ret
328   %1 = trunc i8 %a to i1
329   ret i1 %1
332 define i1 @trunc_i16_to_i1(i16 %a) nounwind {
333 ; RV32I-LABEL: trunc_i16_to_i1:
334 ; RV32I:       # %bb.0:
335 ; RV32I-NEXT:    ret
337 ; RV64I-LABEL: trunc_i16_to_i1:
338 ; RV64I:       # %bb.0:
339 ; RV64I-NEXT:    ret
340   %1 = trunc i16 %a to i1
341   ret i1 %1
344 define i1 @trunc_i32_to_i1(i32 %a) nounwind {
345 ; RV32I-LABEL: trunc_i32_to_i1:
346 ; RV32I:       # %bb.0:
347 ; RV32I-NEXT:    ret
349 ; RV64I-LABEL: trunc_i32_to_i1:
350 ; RV64I:       # %bb.0:
351 ; RV64I-NEXT:    ret
352   %1 = trunc i32 %a to i1
353   ret i1 %1
356 define i1 @trunc_i64_to_i1(i64 %a) nounwind {
357 ; RV32I-LABEL: trunc_i64_to_i1:
358 ; RV32I:       # %bb.0:
359 ; RV32I-NEXT:    ret
361 ; RV64I-LABEL: trunc_i64_to_i1:
362 ; RV64I:       # %bb.0:
363 ; RV64I-NEXT:    ret
364   %1 = trunc i64 %a to i1
365   ret i1 %1
368 define i8 @trunc_i16_to_i8(i16 %a) nounwind {
369 ; RV32I-LABEL: trunc_i16_to_i8:
370 ; RV32I:       # %bb.0:
371 ; RV32I-NEXT:    ret
373 ; RV64I-LABEL: trunc_i16_to_i8:
374 ; RV64I:       # %bb.0:
375 ; RV64I-NEXT:    ret
376   %1 = trunc i16 %a to i8
377   ret i8 %1
380 define i8 @trunc_i32_to_i8(i32 %a) nounwind {
381 ; RV32I-LABEL: trunc_i32_to_i8:
382 ; RV32I:       # %bb.0:
383 ; RV32I-NEXT:    ret
385 ; RV64I-LABEL: trunc_i32_to_i8:
386 ; RV64I:       # %bb.0:
387 ; RV64I-NEXT:    ret
388   %1 = trunc i32 %a to i8
389   ret i8 %1
392 define i8 @trunc_i64_to_i8(i64 %a) nounwind {
393 ; RV32I-LABEL: trunc_i64_to_i8:
394 ; RV32I:       # %bb.0:
395 ; RV32I-NEXT:    ret
397 ; RV64I-LABEL: trunc_i64_to_i8:
398 ; RV64I:       # %bb.0:
399 ; RV64I-NEXT:    ret
400   %1 = trunc i64 %a to i8
401   ret i8 %1
404 define i16 @trunc_i32_to_i16(i32 %a) nounwind {
405 ; RV32I-LABEL: trunc_i32_to_i16:
406 ; RV32I:       # %bb.0:
407 ; RV32I-NEXT:    ret
409 ; RV64I-LABEL: trunc_i32_to_i16:
410 ; RV64I:       # %bb.0:
411 ; RV64I-NEXT:    ret
412   %1 = trunc i32 %a to i16
413   ret i16 %1
416 define i16 @trunc_i64_to_i16(i64 %a) nounwind {
417 ; RV32I-LABEL: trunc_i64_to_i16:
418 ; RV32I:       # %bb.0:
419 ; RV32I-NEXT:    ret
421 ; RV64I-LABEL: trunc_i64_to_i16:
422 ; RV64I:       # %bb.0:
423 ; RV64I-NEXT:    ret
424   %1 = trunc i64 %a to i16
425   ret i16 %1
428 define i32 @trunc_i64_to_i32(i64 %a) nounwind {
429 ; RV32I-LABEL: trunc_i64_to_i32:
430 ; RV32I:       # %bb.0:
431 ; RV32I-NEXT:    ret
433 ; RV64I-LABEL: trunc_i64_to_i32:
434 ; RV64I:       # %bb.0:
435 ; RV64I-NEXT:    ret
436   %1 = trunc i64 %a to i32
437   ret i32 %1