Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64i-exhaustive-w-insts.ll
blobdad20b2d1946457a50dee2f57eca6bc0e6d842ba
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-prefixes=RV64,RV64I
4 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs -mattr=+zba < %s \
5 ; RUN:   | FileCheck %s -check-prefixes=RV64,RV64ZBA
7 ; The patterns for the 'W' suffixed RV64I instructions have the potential of
8 ; missing cases. This file checks all the variants of
9 ; sign-extended/zero-extended/any-extended inputs and outputs.
11 ; The 64-bit add instruction can safely be used when the result is anyext.
13 define i32 @aext_addw_aext_aext(i32 %a, i32 %b) nounwind {
14 ; RV64-LABEL: aext_addw_aext_aext:
15 ; RV64:       # %bb.0:
16 ; RV64-NEXT:    addw a0, a0, a1
17 ; RV64-NEXT:    ret
18   %1 = add i32 %a, %b
19   ret i32 %1
22 define i32 @aext_addw_aext_sext(i32 %a, i32 signext %b) nounwind {
23 ; RV64-LABEL: aext_addw_aext_sext:
24 ; RV64:       # %bb.0:
25 ; RV64-NEXT:    addw a0, a0, a1
26 ; RV64-NEXT:    ret
27   %1 = add i32 %a, %b
28   ret i32 %1
31 define i32 @aext_addw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
32 ; RV64-LABEL: aext_addw_aext_zext:
33 ; RV64:       # %bb.0:
34 ; RV64-NEXT:    addw a0, a0, a1
35 ; RV64-NEXT:    ret
36   %1 = add i32 %a, %b
37   ret i32 %1
40 define i32 @aext_addw_sext_aext(i32 signext %a, i32 %b) nounwind {
41 ; RV64-LABEL: aext_addw_sext_aext:
42 ; RV64:       # %bb.0:
43 ; RV64-NEXT:    addw a0, a0, a1
44 ; RV64-NEXT:    ret
45   %1 = add i32 %a, %b
46   ret i32 %1
49 define i32 @aext_addw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
50 ; RV64-LABEL: aext_addw_sext_sext:
51 ; RV64:       # %bb.0:
52 ; RV64-NEXT:    addw a0, a0, a1
53 ; RV64-NEXT:    ret
54   %1 = add i32 %a, %b
55   ret i32 %1
58 define i32 @aext_addw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
59 ; RV64-LABEL: aext_addw_sext_zext:
60 ; RV64:       # %bb.0:
61 ; RV64-NEXT:    addw a0, a0, a1
62 ; RV64-NEXT:    ret
63   %1 = add i32 %a, %b
64   ret i32 %1
67 define i32 @aext_addw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
68 ; RV64-LABEL: aext_addw_zext_aext:
69 ; RV64:       # %bb.0:
70 ; RV64-NEXT:    addw a0, a0, a1
71 ; RV64-NEXT:    ret
72   %1 = add i32 %a, %b
73   ret i32 %1
76 define i32 @aext_addw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
77 ; RV64-LABEL: aext_addw_zext_sext:
78 ; RV64:       # %bb.0:
79 ; RV64-NEXT:    addw a0, a0, a1
80 ; RV64-NEXT:    ret
81   %1 = add i32 %a, %b
82   ret i32 %1
85 define i32 @aext_addw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
86 ; RV64-LABEL: aext_addw_zext_zext:
87 ; RV64:       # %bb.0:
88 ; RV64-NEXT:    addw a0, a0, a1
89 ; RV64-NEXT:    ret
90   %1 = add i32 %a, %b
91   ret i32 %1
94 ; Always select addw when a signext result is required.
96 define signext i32 @sext_addw_aext_aext(i32 %a, i32 %b) nounwind {
97 ; RV64-LABEL: sext_addw_aext_aext:
98 ; RV64:       # %bb.0:
99 ; RV64-NEXT:    addw a0, a0, a1
100 ; RV64-NEXT:    ret
101   %1 = add i32 %a, %b
102   ret i32 %1
105 define signext i32 @sext_addw_aext_sext(i32 %a, i32 signext %b) nounwind {
106 ; RV64-LABEL: sext_addw_aext_sext:
107 ; RV64:       # %bb.0:
108 ; RV64-NEXT:    addw a0, a0, a1
109 ; RV64-NEXT:    ret
110   %1 = add i32 %a, %b
111   ret i32 %1
114 define signext i32 @sext_addw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
115 ; RV64-LABEL: sext_addw_aext_zext:
116 ; RV64:       # %bb.0:
117 ; RV64-NEXT:    addw a0, a0, a1
118 ; RV64-NEXT:    ret
119   %1 = add i32 %a, %b
120   ret i32 %1
123 define signext i32 @sext_addw_sext_aext(i32 signext %a, i32 %b) nounwind {
124 ; RV64-LABEL: sext_addw_sext_aext:
125 ; RV64:       # %bb.0:
126 ; RV64-NEXT:    addw a0, a0, a1
127 ; RV64-NEXT:    ret
128   %1 = add i32 %a, %b
129   ret i32 %1
132 define signext i32 @sext_addw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
133 ; RV64-LABEL: sext_addw_sext_sext:
134 ; RV64:       # %bb.0:
135 ; RV64-NEXT:    addw a0, a0, a1
136 ; RV64-NEXT:    ret
137   %1 = add i32 %a, %b
138   ret i32 %1
141 define signext i32 @sext_addw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
142 ; RV64-LABEL: sext_addw_sext_zext:
143 ; RV64:       # %bb.0:
144 ; RV64-NEXT:    addw a0, a0, a1
145 ; RV64-NEXT:    ret
146   %1 = add i32 %a, %b
147   ret i32 %1
150 define signext i32 @sext_addw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
151 ; RV64-LABEL: sext_addw_zext_aext:
152 ; RV64:       # %bb.0:
153 ; RV64-NEXT:    addw a0, a0, a1
154 ; RV64-NEXT:    ret
155   %1 = add i32 %a, %b
156   ret i32 %1
159 define signext i32 @sext_addw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
160 ; RV64-LABEL: sext_addw_zext_sext:
161 ; RV64:       # %bb.0:
162 ; RV64-NEXT:    addw a0, a0, a1
163 ; RV64-NEXT:    ret
164   %1 = add i32 %a, %b
165   ret i32 %1
168 define signext i32 @sext_addw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
169 ; RV64-LABEL: sext_addw_zext_zext:
170 ; RV64:       # %bb.0:
171 ; RV64-NEXT:    addw a0, a0, a1
172 ; RV64-NEXT:    ret
173   %1 = add i32 %a, %b
174   ret i32 %1
177 ; 64-bit add followed by zero-extension is a safe option when a zeroext result
178 ; is required.
180 define zeroext i32 @zext_addw_aext_aext(i32 %a, i32 %b) nounwind {
181 ; RV64I-LABEL: zext_addw_aext_aext:
182 ; RV64I:       # %bb.0:
183 ; RV64I-NEXT:    add a0, a0, a1
184 ; RV64I-NEXT:    slli a0, a0, 32
185 ; RV64I-NEXT:    srli a0, a0, 32
186 ; RV64I-NEXT:    ret
188 ; RV64ZBA-LABEL: zext_addw_aext_aext:
189 ; RV64ZBA:       # %bb.0:
190 ; RV64ZBA-NEXT:    add a0, a0, a1
191 ; RV64ZBA-NEXT:    zext.w a0, a0
192 ; RV64ZBA-NEXT:    ret
193   %1 = add i32 %a, %b
194   ret i32 %1
197 define zeroext i32 @zext_addw_aext_sext(i32 %a, i32 signext %b) nounwind {
198 ; RV64I-LABEL: zext_addw_aext_sext:
199 ; RV64I:       # %bb.0:
200 ; RV64I-NEXT:    add a0, a0, a1
201 ; RV64I-NEXT:    slli a0, a0, 32
202 ; RV64I-NEXT:    srli a0, a0, 32
203 ; RV64I-NEXT:    ret
205 ; RV64ZBA-LABEL: zext_addw_aext_sext:
206 ; RV64ZBA:       # %bb.0:
207 ; RV64ZBA-NEXT:    add a0, a0, a1
208 ; RV64ZBA-NEXT:    zext.w a0, a0
209 ; RV64ZBA-NEXT:    ret
210   %1 = add i32 %a, %b
211   ret i32 %1
214 define zeroext i32 @zext_addw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
215 ; RV64I-LABEL: zext_addw_aext_zext:
216 ; RV64I:       # %bb.0:
217 ; RV64I-NEXT:    add a0, a0, a1
218 ; RV64I-NEXT:    slli a0, a0, 32
219 ; RV64I-NEXT:    srli a0, a0, 32
220 ; RV64I-NEXT:    ret
222 ; RV64ZBA-LABEL: zext_addw_aext_zext:
223 ; RV64ZBA:       # %bb.0:
224 ; RV64ZBA-NEXT:    add a0, a0, a1
225 ; RV64ZBA-NEXT:    zext.w a0, a0
226 ; RV64ZBA-NEXT:    ret
227   %1 = add i32 %a, %b
228   ret i32 %1
231 define zeroext i32 @zext_addw_sext_aext(i32 signext %a, i32 %b) nounwind {
232 ; RV64I-LABEL: zext_addw_sext_aext:
233 ; RV64I:       # %bb.0:
234 ; RV64I-NEXT:    add a0, a0, a1
235 ; RV64I-NEXT:    slli a0, a0, 32
236 ; RV64I-NEXT:    srli a0, a0, 32
237 ; RV64I-NEXT:    ret
239 ; RV64ZBA-LABEL: zext_addw_sext_aext:
240 ; RV64ZBA:       # %bb.0:
241 ; RV64ZBA-NEXT:    add a0, a0, a1
242 ; RV64ZBA-NEXT:    zext.w a0, a0
243 ; RV64ZBA-NEXT:    ret
244   %1 = add i32 %a, %b
245   ret i32 %1
248 define zeroext i32 @zext_addw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
249 ; RV64I-LABEL: zext_addw_sext_sext:
250 ; RV64I:       # %bb.0:
251 ; RV64I-NEXT:    add a0, a0, a1
252 ; RV64I-NEXT:    slli a0, a0, 32
253 ; RV64I-NEXT:    srli a0, a0, 32
254 ; RV64I-NEXT:    ret
256 ; RV64ZBA-LABEL: zext_addw_sext_sext:
257 ; RV64ZBA:       # %bb.0:
258 ; RV64ZBA-NEXT:    add a0, a0, a1
259 ; RV64ZBA-NEXT:    zext.w a0, a0
260 ; RV64ZBA-NEXT:    ret
261   %1 = add i32 %a, %b
262   ret i32 %1
265 define zeroext i32 @zext_addw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
266 ; RV64I-LABEL: zext_addw_sext_zext:
267 ; RV64I:       # %bb.0:
268 ; RV64I-NEXT:    add a0, a0, a1
269 ; RV64I-NEXT:    slli a0, a0, 32
270 ; RV64I-NEXT:    srli a0, a0, 32
271 ; RV64I-NEXT:    ret
273 ; RV64ZBA-LABEL: zext_addw_sext_zext:
274 ; RV64ZBA:       # %bb.0:
275 ; RV64ZBA-NEXT:    add a0, a0, a1
276 ; RV64ZBA-NEXT:    zext.w a0, a0
277 ; RV64ZBA-NEXT:    ret
278   %1 = add i32 %a, %b
279   ret i32 %1
282 define zeroext i32 @zext_addw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
283 ; RV64I-LABEL: zext_addw_zext_aext:
284 ; RV64I:       # %bb.0:
285 ; RV64I-NEXT:    add a0, a0, a1
286 ; RV64I-NEXT:    slli a0, a0, 32
287 ; RV64I-NEXT:    srli a0, a0, 32
288 ; RV64I-NEXT:    ret
290 ; RV64ZBA-LABEL: zext_addw_zext_aext:
291 ; RV64ZBA:       # %bb.0:
292 ; RV64ZBA-NEXT:    add a0, a0, a1
293 ; RV64ZBA-NEXT:    zext.w a0, a0
294 ; RV64ZBA-NEXT:    ret
295   %1 = add i32 %a, %b
296   ret i32 %1
299 define zeroext i32 @zext_addw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
300 ; RV64I-LABEL: zext_addw_zext_sext:
301 ; RV64I:       # %bb.0:
302 ; RV64I-NEXT:    add a0, a0, a1
303 ; RV64I-NEXT:    slli a0, a0, 32
304 ; RV64I-NEXT:    srli a0, a0, 32
305 ; RV64I-NEXT:    ret
307 ; RV64ZBA-LABEL: zext_addw_zext_sext:
308 ; RV64ZBA:       # %bb.0:
309 ; RV64ZBA-NEXT:    add a0, a0, a1
310 ; RV64ZBA-NEXT:    zext.w a0, a0
311 ; RV64ZBA-NEXT:    ret
312   %1 = add i32 %a, %b
313   ret i32 %1
316 define zeroext i32 @zext_addw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
317 ; RV64I-LABEL: zext_addw_zext_zext:
318 ; RV64I:       # %bb.0:
319 ; RV64I-NEXT:    add a0, a0, a1
320 ; RV64I-NEXT:    slli a0, a0, 32
321 ; RV64I-NEXT:    srli a0, a0, 32
322 ; RV64I-NEXT:    ret
324 ; RV64ZBA-LABEL: zext_addw_zext_zext:
325 ; RV64ZBA:       # %bb.0:
326 ; RV64ZBA-NEXT:    add a0, a0, a1
327 ; RV64ZBA-NEXT:    zext.w a0, a0
328 ; RV64ZBA-NEXT:    ret
329   %1 = add i32 %a, %b
330   ret i32 %1
333 ; 64-bit sub is safe for an anyext result.
335 define i32 @aext_subw_aext_aext(i32 %a, i32 %b) nounwind {
336 ; RV64-LABEL: aext_subw_aext_aext:
337 ; RV64:       # %bb.0:
338 ; RV64-NEXT:    subw a0, a0, a1
339 ; RV64-NEXT:    ret
340   %1 = sub i32 %a, %b
341   ret i32 %1
344 define i32 @aext_subw_aext_sext(i32 %a, i32 signext %b) nounwind {
345 ; RV64-LABEL: aext_subw_aext_sext:
346 ; RV64:       # %bb.0:
347 ; RV64-NEXT:    subw a0, a0, a1
348 ; RV64-NEXT:    ret
349   %1 = sub i32 %a, %b
350   ret i32 %1
353 define i32 @aext_subw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
354 ; RV64-LABEL: aext_subw_aext_zext:
355 ; RV64:       # %bb.0:
356 ; RV64-NEXT:    subw a0, a0, a1
357 ; RV64-NEXT:    ret
358   %1 = sub i32 %a, %b
359   ret i32 %1
362 define i32 @aext_subw_sext_aext(i32 signext %a, i32 %b) nounwind {
363 ; RV64-LABEL: aext_subw_sext_aext:
364 ; RV64:       # %bb.0:
365 ; RV64-NEXT:    subw a0, a0, a1
366 ; RV64-NEXT:    ret
367   %1 = sub i32 %a, %b
368   ret i32 %1
371 define i32 @aext_subw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
372 ; RV64-LABEL: aext_subw_sext_sext:
373 ; RV64:       # %bb.0:
374 ; RV64-NEXT:    subw a0, a0, a1
375 ; RV64-NEXT:    ret
376   %1 = sub i32 %a, %b
377   ret i32 %1
380 define i32 @aext_subw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
381 ; RV64-LABEL: aext_subw_sext_zext:
382 ; RV64:       # %bb.0:
383 ; RV64-NEXT:    subw a0, a0, a1
384 ; RV64-NEXT:    ret
385   %1 = sub i32 %a, %b
386   ret i32 %1
389 define i32 @aext_subw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
390 ; RV64-LABEL: aext_subw_zext_aext:
391 ; RV64:       # %bb.0:
392 ; RV64-NEXT:    subw a0, a0, a1
393 ; RV64-NEXT:    ret
394   %1 = sub i32 %a, %b
395   ret i32 %1
398 define i32 @aext_subw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
399 ; RV64-LABEL: aext_subw_zext_sext:
400 ; RV64:       # %bb.0:
401 ; RV64-NEXT:    subw a0, a0, a1
402 ; RV64-NEXT:    ret
403   %1 = sub i32 %a, %b
404   ret i32 %1
407 define i32 @aext_subw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
408 ; RV64-LABEL: aext_subw_zext_zext:
409 ; RV64:       # %bb.0:
410 ; RV64-NEXT:    subw a0, a0, a1
411 ; RV64-NEXT:    ret
412   %1 = sub i32 %a, %b
413   ret i32 %1
416 ; Always select subw for a signext result.
418 define signext i32 @sext_subw_aext_aext(i32 %a, i32 %b) nounwind {
419 ; RV64-LABEL: sext_subw_aext_aext:
420 ; RV64:       # %bb.0:
421 ; RV64-NEXT:    subw a0, a0, a1
422 ; RV64-NEXT:    ret
423   %1 = sub i32 %a, %b
424   ret i32 %1
427 define signext i32 @sext_subw_aext_sext(i32 %a, i32 signext %b) nounwind {
428 ; RV64-LABEL: sext_subw_aext_sext:
429 ; RV64:       # %bb.0:
430 ; RV64-NEXT:    subw a0, a0, a1
431 ; RV64-NEXT:    ret
432   %1 = sub i32 %a, %b
433   ret i32 %1
436 define signext i32 @sext_subw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
437 ; RV64-LABEL: sext_subw_aext_zext:
438 ; RV64:       # %bb.0:
439 ; RV64-NEXT:    subw a0, a0, a1
440 ; RV64-NEXT:    ret
441   %1 = sub i32 %a, %b
442   ret i32 %1
445 define signext i32 @sext_subw_sext_aext(i32 signext %a, i32 %b) nounwind {
446 ; RV64-LABEL: sext_subw_sext_aext:
447 ; RV64:       # %bb.0:
448 ; RV64-NEXT:    subw a0, a0, a1
449 ; RV64-NEXT:    ret
450   %1 = sub i32 %a, %b
451   ret i32 %1
454 define signext i32 @sext_subw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
455 ; RV64-LABEL: sext_subw_sext_sext:
456 ; RV64:       # %bb.0:
457 ; RV64-NEXT:    subw a0, a0, a1
458 ; RV64-NEXT:    ret
459   %1 = sub i32 %a, %b
460   ret i32 %1
463 define signext i32 @sext_subw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
464 ; RV64-LABEL: sext_subw_sext_zext:
465 ; RV64:       # %bb.0:
466 ; RV64-NEXT:    subw a0, a0, a1
467 ; RV64-NEXT:    ret
468   %1 = sub i32 %a, %b
469   ret i32 %1
472 define signext i32 @sext_subw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
473 ; RV64-LABEL: sext_subw_zext_aext:
474 ; RV64:       # %bb.0:
475 ; RV64-NEXT:    subw a0, a0, a1
476 ; RV64-NEXT:    ret
477   %1 = sub i32 %a, %b
478   ret i32 %1
481 define signext i32 @sext_subw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
482 ; RV64-LABEL: sext_subw_zext_sext:
483 ; RV64:       # %bb.0:
484 ; RV64-NEXT:    subw a0, a0, a1
485 ; RV64-NEXT:    ret
486   %1 = sub i32 %a, %b
487   ret i32 %1
490 define signext i32 @sext_subw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
491 ; RV64-LABEL: sext_subw_zext_zext:
492 ; RV64:       # %bb.0:
493 ; RV64-NEXT:    subw a0, a0, a1
494 ; RV64-NEXT:    ret
495   %1 = sub i32 %a, %b
496   ret i32 %1
499 ; 64-bit sub followed by zero-extension is safe for a zeroext result.
501 define zeroext i32 @zext_subw_aext_aext(i32 %a, i32 %b) nounwind {
502 ; RV64I-LABEL: zext_subw_aext_aext:
503 ; RV64I:       # %bb.0:
504 ; RV64I-NEXT:    subw a0, a0, a1
505 ; RV64I-NEXT:    slli a0, a0, 32
506 ; RV64I-NEXT:    srli a0, a0, 32
507 ; RV64I-NEXT:    ret
509 ; RV64ZBA-LABEL: zext_subw_aext_aext:
510 ; RV64ZBA:       # %bb.0:
511 ; RV64ZBA-NEXT:    subw a0, a0, a1
512 ; RV64ZBA-NEXT:    zext.w a0, a0
513 ; RV64ZBA-NEXT:    ret
514   %1 = sub i32 %a, %b
515   ret i32 %1
518 define zeroext i32 @zext_subw_aext_sext(i32 %a, i32 signext %b) nounwind {
519 ; RV64I-LABEL: zext_subw_aext_sext:
520 ; RV64I:       # %bb.0:
521 ; RV64I-NEXT:    subw a0, a0, a1
522 ; RV64I-NEXT:    slli a0, a0, 32
523 ; RV64I-NEXT:    srli a0, a0, 32
524 ; RV64I-NEXT:    ret
526 ; RV64ZBA-LABEL: zext_subw_aext_sext:
527 ; RV64ZBA:       # %bb.0:
528 ; RV64ZBA-NEXT:    subw a0, a0, a1
529 ; RV64ZBA-NEXT:    zext.w a0, a0
530 ; RV64ZBA-NEXT:    ret
531   %1 = sub i32 %a, %b
532   ret i32 %1
535 define zeroext i32 @zext_subw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
536 ; RV64I-LABEL: zext_subw_aext_zext:
537 ; RV64I:       # %bb.0:
538 ; RV64I-NEXT:    subw a0, a0, a1
539 ; RV64I-NEXT:    slli a0, a0, 32
540 ; RV64I-NEXT:    srli a0, a0, 32
541 ; RV64I-NEXT:    ret
543 ; RV64ZBA-LABEL: zext_subw_aext_zext:
544 ; RV64ZBA:       # %bb.0:
545 ; RV64ZBA-NEXT:    subw a0, a0, a1
546 ; RV64ZBA-NEXT:    zext.w a0, a0
547 ; RV64ZBA-NEXT:    ret
548   %1 = sub i32 %a, %b
549   ret i32 %1
552 define zeroext i32 @zext_subw_sext_aext(i32 signext %a, i32 %b) nounwind {
553 ; RV64I-LABEL: zext_subw_sext_aext:
554 ; RV64I:       # %bb.0:
555 ; RV64I-NEXT:    subw a0, a0, a1
556 ; RV64I-NEXT:    slli a0, a0, 32
557 ; RV64I-NEXT:    srli a0, a0, 32
558 ; RV64I-NEXT:    ret
560 ; RV64ZBA-LABEL: zext_subw_sext_aext:
561 ; RV64ZBA:       # %bb.0:
562 ; RV64ZBA-NEXT:    subw a0, a0, a1
563 ; RV64ZBA-NEXT:    zext.w a0, a0
564 ; RV64ZBA-NEXT:    ret
565   %1 = sub i32 %a, %b
566   ret i32 %1
569 define zeroext i32 @zext_subw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
570 ; RV64I-LABEL: zext_subw_sext_sext:
571 ; RV64I:       # %bb.0:
572 ; RV64I-NEXT:    subw a0, a0, a1
573 ; RV64I-NEXT:    slli a0, a0, 32
574 ; RV64I-NEXT:    srli a0, a0, 32
575 ; RV64I-NEXT:    ret
577 ; RV64ZBA-LABEL: zext_subw_sext_sext:
578 ; RV64ZBA:       # %bb.0:
579 ; RV64ZBA-NEXT:    subw a0, a0, a1
580 ; RV64ZBA-NEXT:    zext.w a0, a0
581 ; RV64ZBA-NEXT:    ret
582   %1 = sub i32 %a, %b
583   ret i32 %1
586 define zeroext i32 @zext_subw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
587 ; RV64I-LABEL: zext_subw_sext_zext:
588 ; RV64I:       # %bb.0:
589 ; RV64I-NEXT:    subw a0, a0, a1
590 ; RV64I-NEXT:    slli a0, a0, 32
591 ; RV64I-NEXT:    srli a0, a0, 32
592 ; RV64I-NEXT:    ret
594 ; RV64ZBA-LABEL: zext_subw_sext_zext:
595 ; RV64ZBA:       # %bb.0:
596 ; RV64ZBA-NEXT:    subw a0, a0, a1
597 ; RV64ZBA-NEXT:    zext.w a0, a0
598 ; RV64ZBA-NEXT:    ret
599   %1 = sub i32 %a, %b
600   ret i32 %1
603 define zeroext i32 @zext_subw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
604 ; RV64I-LABEL: zext_subw_zext_aext:
605 ; RV64I:       # %bb.0:
606 ; RV64I-NEXT:    subw a0, a0, a1
607 ; RV64I-NEXT:    slli a0, a0, 32
608 ; RV64I-NEXT:    srli a0, a0, 32
609 ; RV64I-NEXT:    ret
611 ; RV64ZBA-LABEL: zext_subw_zext_aext:
612 ; RV64ZBA:       # %bb.0:
613 ; RV64ZBA-NEXT:    subw a0, a0, a1
614 ; RV64ZBA-NEXT:    zext.w a0, a0
615 ; RV64ZBA-NEXT:    ret
616   %1 = sub i32 %a, %b
617   ret i32 %1
620 define zeroext i32 @zext_subw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
621 ; RV64I-LABEL: zext_subw_zext_sext:
622 ; RV64I:       # %bb.0:
623 ; RV64I-NEXT:    subw a0, a0, a1
624 ; RV64I-NEXT:    slli a0, a0, 32
625 ; RV64I-NEXT:    srli a0, a0, 32
626 ; RV64I-NEXT:    ret
628 ; RV64ZBA-LABEL: zext_subw_zext_sext:
629 ; RV64ZBA:       # %bb.0:
630 ; RV64ZBA-NEXT:    subw a0, a0, a1
631 ; RV64ZBA-NEXT:    zext.w a0, a0
632 ; RV64ZBA-NEXT:    ret
633   %1 = sub i32 %a, %b
634   ret i32 %1
637 define zeroext i32 @zext_subw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
638 ; RV64I-LABEL: zext_subw_zext_zext:
639 ; RV64I:       # %bb.0:
640 ; RV64I-NEXT:    subw a0, a0, a1
641 ; RV64I-NEXT:    slli a0, a0, 32
642 ; RV64I-NEXT:    srli a0, a0, 32
643 ; RV64I-NEXT:    ret
645 ; RV64ZBA-LABEL: zext_subw_zext_zext:
646 ; RV64ZBA:       # %bb.0:
647 ; RV64ZBA-NEXT:    subw a0, a0, a1
648 ; RV64ZBA-NEXT:    zext.w a0, a0
649 ; RV64ZBA-NEXT:    ret
650   %1 = sub i32 %a, %b
651   ret i32 %1
654 ; 64-bit sll is a safe choice for an anyext result.
656 define i32 @aext_sllw_aext_aext(i32 %a, i32 %b) nounwind {
657 ; RV64-LABEL: aext_sllw_aext_aext:
658 ; RV64:       # %bb.0:
659 ; RV64-NEXT:    sllw a0, a0, a1
660 ; RV64-NEXT:    ret
661   %1 = shl i32 %a, %b
662   ret i32 %1
665 define i32 @aext_sllw_aext_sext(i32 %a, i32 signext %b) nounwind {
666 ; RV64-LABEL: aext_sllw_aext_sext:
667 ; RV64:       # %bb.0:
668 ; RV64-NEXT:    sllw a0, a0, a1
669 ; RV64-NEXT:    ret
670   %1 = shl i32 %a, %b
671   ret i32 %1
674 define i32 @aext_sllw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
675 ; RV64-LABEL: aext_sllw_aext_zext:
676 ; RV64:       # %bb.0:
677 ; RV64-NEXT:    sllw a0, a0, a1
678 ; RV64-NEXT:    ret
679   %1 = shl i32 %a, %b
680   ret i32 %1
683 define i32 @aext_sllw_sext_aext(i32 signext %a, i32 %b) nounwind {
684 ; RV64-LABEL: aext_sllw_sext_aext:
685 ; RV64:       # %bb.0:
686 ; RV64-NEXT:    sllw a0, a0, a1
687 ; RV64-NEXT:    ret
688   %1 = shl i32 %a, %b
689   ret i32 %1
692 define i32 @aext_sllw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
693 ; RV64-LABEL: aext_sllw_sext_sext:
694 ; RV64:       # %bb.0:
695 ; RV64-NEXT:    sllw a0, a0, a1
696 ; RV64-NEXT:    ret
697   %1 = shl i32 %a, %b
698   ret i32 %1
701 define i32 @aext_sllw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
702 ; RV64-LABEL: aext_sllw_sext_zext:
703 ; RV64:       # %bb.0:
704 ; RV64-NEXT:    sllw a0, a0, a1
705 ; RV64-NEXT:    ret
706   %1 = shl i32 %a, %b
707   ret i32 %1
710 define i32 @aext_sllw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
711 ; RV64-LABEL: aext_sllw_zext_aext:
712 ; RV64:       # %bb.0:
713 ; RV64-NEXT:    sllw a0, a0, a1
714 ; RV64-NEXT:    ret
715   %1 = shl i32 %a, %b
716   ret i32 %1
719 define i32 @aext_sllw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
720 ; RV64-LABEL: aext_sllw_zext_sext:
721 ; RV64:       # %bb.0:
722 ; RV64-NEXT:    sllw a0, a0, a1
723 ; RV64-NEXT:    ret
724   %1 = shl i32 %a, %b
725   ret i32 %1
728 define i32 @aext_sllw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
729 ; RV64-LABEL: aext_sllw_zext_zext:
730 ; RV64:       # %bb.0:
731 ; RV64-NEXT:    sllw a0, a0, a1
732 ; RV64-NEXT:    ret
733   %1 = shl i32 %a, %b
734   ret i32 %1
737 define signext i32 @sext_sllw_aext_aext(i32 %a, i32 %b) nounwind {
738 ; RV64-LABEL: sext_sllw_aext_aext:
739 ; RV64:       # %bb.0:
740 ; RV64-NEXT:    sllw a0, a0, a1
741 ; RV64-NEXT:    ret
742   %1 = shl i32 %a, %b
743   ret i32 %1
746 define signext i32 @sext_sllw_aext_sext(i32 %a, i32 signext %b) nounwind {
747 ; RV64-LABEL: sext_sllw_aext_sext:
748 ; RV64:       # %bb.0:
749 ; RV64-NEXT:    sllw a0, a0, a1
750 ; RV64-NEXT:    ret
751   %1 = shl i32 %a, %b
752   ret i32 %1
755 define signext i32 @sext_sllw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
756 ; RV64-LABEL: sext_sllw_aext_zext:
757 ; RV64:       # %bb.0:
758 ; RV64-NEXT:    sllw a0, a0, a1
759 ; RV64-NEXT:    ret
760   %1 = shl i32 %a, %b
761   ret i32 %1
764 define signext i32 @sext_sllw_sext_aext(i32 signext %a, i32 %b) nounwind {
765 ; RV64-LABEL: sext_sllw_sext_aext:
766 ; RV64:       # %bb.0:
767 ; RV64-NEXT:    sllw a0, a0, a1
768 ; RV64-NEXT:    ret
769   %1 = shl i32 %a, %b
770   ret i32 %1
773 define signext i32 @sext_sllw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
774 ; RV64-LABEL: sext_sllw_sext_sext:
775 ; RV64:       # %bb.0:
776 ; RV64-NEXT:    sllw a0, a0, a1
777 ; RV64-NEXT:    ret
778   %1 = shl i32 %a, %b
779   ret i32 %1
782 define signext i32 @sext_sllw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
783 ; RV64-LABEL: sext_sllw_sext_zext:
784 ; RV64:       # %bb.0:
785 ; RV64-NEXT:    sllw a0, a0, a1
786 ; RV64-NEXT:    ret
787   %1 = shl i32 %a, %b
788   ret i32 %1
791 define signext i32 @sext_sllw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
792 ; RV64-LABEL: sext_sllw_zext_aext:
793 ; RV64:       # %bb.0:
794 ; RV64-NEXT:    sllw a0, a0, a1
795 ; RV64-NEXT:    ret
796   %1 = shl i32 %a, %b
797   ret i32 %1
800 define signext i32 @sext_sllw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
801 ; RV64-LABEL: sext_sllw_zext_sext:
802 ; RV64:       # %bb.0:
803 ; RV64-NEXT:    sllw a0, a0, a1
804 ; RV64-NEXT:    ret
805   %1 = shl i32 %a, %b
806   ret i32 %1
809 define signext i32 @sext_sllw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
810 ; RV64-LABEL: sext_sllw_zext_zext:
811 ; RV64:       # %bb.0:
812 ; RV64-NEXT:    sllw a0, a0, a1
813 ; RV64-NEXT:    ret
814   %1 = shl i32 %a, %b
815   ret i32 %1
818 ; 64-bit sll followed by zero-extension for a zeroext result.
820 define zeroext i32 @zext_sllw_aext_aext(i32 %a, i32 %b) nounwind {
821 ; RV64I-LABEL: zext_sllw_aext_aext:
822 ; RV64I:       # %bb.0:
823 ; RV64I-NEXT:    sllw a0, a0, a1
824 ; RV64I-NEXT:    slli a0, a0, 32
825 ; RV64I-NEXT:    srli a0, a0, 32
826 ; RV64I-NEXT:    ret
828 ; RV64ZBA-LABEL: zext_sllw_aext_aext:
829 ; RV64ZBA:       # %bb.0:
830 ; RV64ZBA-NEXT:    sllw a0, a0, a1
831 ; RV64ZBA-NEXT:    zext.w a0, a0
832 ; RV64ZBA-NEXT:    ret
833   %1 = shl i32 %a, %b
834   ret i32 %1
837 define zeroext i32 @zext_sllw_aext_sext(i32 %a, i32 signext %b) nounwind {
838 ; RV64I-LABEL: zext_sllw_aext_sext:
839 ; RV64I:       # %bb.0:
840 ; RV64I-NEXT:    sllw a0, a0, a1
841 ; RV64I-NEXT:    slli a0, a0, 32
842 ; RV64I-NEXT:    srli a0, a0, 32
843 ; RV64I-NEXT:    ret
845 ; RV64ZBA-LABEL: zext_sllw_aext_sext:
846 ; RV64ZBA:       # %bb.0:
847 ; RV64ZBA-NEXT:    sllw a0, a0, a1
848 ; RV64ZBA-NEXT:    zext.w a0, a0
849 ; RV64ZBA-NEXT:    ret
850   %1 = shl i32 %a, %b
851   ret i32 %1
854 define zeroext i32 @zext_sllw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
855 ; RV64I-LABEL: zext_sllw_aext_zext:
856 ; RV64I:       # %bb.0:
857 ; RV64I-NEXT:    sllw a0, a0, a1
858 ; RV64I-NEXT:    slli a0, a0, 32
859 ; RV64I-NEXT:    srli a0, a0, 32
860 ; RV64I-NEXT:    ret
862 ; RV64ZBA-LABEL: zext_sllw_aext_zext:
863 ; RV64ZBA:       # %bb.0:
864 ; RV64ZBA-NEXT:    sllw a0, a0, a1
865 ; RV64ZBA-NEXT:    zext.w a0, a0
866 ; RV64ZBA-NEXT:    ret
867   %1 = shl i32 %a, %b
868   ret i32 %1
871 define zeroext i32 @zext_sllw_sext_aext(i32 signext %a, i32 %b) nounwind {
872 ; RV64I-LABEL: zext_sllw_sext_aext:
873 ; RV64I:       # %bb.0:
874 ; RV64I-NEXT:    sllw a0, a0, a1
875 ; RV64I-NEXT:    slli a0, a0, 32
876 ; RV64I-NEXT:    srli a0, a0, 32
877 ; RV64I-NEXT:    ret
879 ; RV64ZBA-LABEL: zext_sllw_sext_aext:
880 ; RV64ZBA:       # %bb.0:
881 ; RV64ZBA-NEXT:    sllw a0, a0, a1
882 ; RV64ZBA-NEXT:    zext.w a0, a0
883 ; RV64ZBA-NEXT:    ret
884   %1 = shl i32 %a, %b
885   ret i32 %1
888 define zeroext i32 @zext_sllw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
889 ; RV64I-LABEL: zext_sllw_sext_sext:
890 ; RV64I:       # %bb.0:
891 ; RV64I-NEXT:    sllw a0, a0, a1
892 ; RV64I-NEXT:    slli a0, a0, 32
893 ; RV64I-NEXT:    srli a0, a0, 32
894 ; RV64I-NEXT:    ret
896 ; RV64ZBA-LABEL: zext_sllw_sext_sext:
897 ; RV64ZBA:       # %bb.0:
898 ; RV64ZBA-NEXT:    sllw a0, a0, a1
899 ; RV64ZBA-NEXT:    zext.w a0, a0
900 ; RV64ZBA-NEXT:    ret
901   %1 = shl i32 %a, %b
902   ret i32 %1
905 define zeroext i32 @zext_sllw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
906 ; RV64I-LABEL: zext_sllw_sext_zext:
907 ; RV64I:       # %bb.0:
908 ; RV64I-NEXT:    sllw a0, a0, a1
909 ; RV64I-NEXT:    slli a0, a0, 32
910 ; RV64I-NEXT:    srli a0, a0, 32
911 ; RV64I-NEXT:    ret
913 ; RV64ZBA-LABEL: zext_sllw_sext_zext:
914 ; RV64ZBA:       # %bb.0:
915 ; RV64ZBA-NEXT:    sllw a0, a0, a1
916 ; RV64ZBA-NEXT:    zext.w a0, a0
917 ; RV64ZBA-NEXT:    ret
918   %1 = shl i32 %a, %b
919   ret i32 %1
922 define zeroext i32 @zext_sllw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
923 ; RV64I-LABEL: zext_sllw_zext_aext:
924 ; RV64I:       # %bb.0:
925 ; RV64I-NEXT:    sllw a0, a0, a1
926 ; RV64I-NEXT:    slli a0, a0, 32
927 ; RV64I-NEXT:    srli a0, a0, 32
928 ; RV64I-NEXT:    ret
930 ; RV64ZBA-LABEL: zext_sllw_zext_aext:
931 ; RV64ZBA:       # %bb.0:
932 ; RV64ZBA-NEXT:    sllw a0, a0, a1
933 ; RV64ZBA-NEXT:    zext.w a0, a0
934 ; RV64ZBA-NEXT:    ret
935   %1 = shl i32 %a, %b
936   ret i32 %1
939 define zeroext i32 @zext_sllw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
940 ; RV64I-LABEL: zext_sllw_zext_sext:
941 ; RV64I:       # %bb.0:
942 ; RV64I-NEXT:    sllw a0, a0, a1
943 ; RV64I-NEXT:    slli a0, a0, 32
944 ; RV64I-NEXT:    srli a0, a0, 32
945 ; RV64I-NEXT:    ret
947 ; RV64ZBA-LABEL: zext_sllw_zext_sext:
948 ; RV64ZBA:       # %bb.0:
949 ; RV64ZBA-NEXT:    sllw a0, a0, a1
950 ; RV64ZBA-NEXT:    zext.w a0, a0
951 ; RV64ZBA-NEXT:    ret
952   %1 = shl i32 %a, %b
953   ret i32 %1
956 define zeroext i32 @zext_sllw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
957 ; RV64I-LABEL: zext_sllw_zext_zext:
958 ; RV64I:       # %bb.0:
959 ; RV64I-NEXT:    sllw a0, a0, a1
960 ; RV64I-NEXT:    slli a0, a0, 32
961 ; RV64I-NEXT:    srli a0, a0, 32
962 ; RV64I-NEXT:    ret
964 ; RV64ZBA-LABEL: zext_sllw_zext_zext:
965 ; RV64ZBA:       # %bb.0:
966 ; RV64ZBA-NEXT:    sllw a0, a0, a1
967 ; RV64ZBA-NEXT:    zext.w a0, a0
968 ; RV64ZBA-NEXT:    ret
969   %1 = shl i32 %a, %b
970   ret i32 %1
973 define i32 @aext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
974 ; RV64-LABEL: aext_srlw_aext_aext:
975 ; RV64:       # %bb.0:
976 ; RV64-NEXT:    srlw a0, a0, a1
977 ; RV64-NEXT:    ret
978   %1 = lshr i32 %a, %b
979   ret i32 %1
982 define i32 @aext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
983 ; RV64-LABEL: aext_srlw_aext_sext:
984 ; RV64:       # %bb.0:
985 ; RV64-NEXT:    srlw a0, a0, a1
986 ; RV64-NEXT:    ret
987   %1 = lshr i32 %a, %b
988   ret i32 %1
991 define i32 @aext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
992 ; RV64-LABEL: aext_srlw_aext_zext:
993 ; RV64:       # %bb.0:
994 ; RV64-NEXT:    srlw a0, a0, a1
995 ; RV64-NEXT:    ret
996   %1 = lshr i32 %a, %b
997   ret i32 %1
1000 define i32 @aext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
1001 ; RV64-LABEL: aext_srlw_sext_aext:
1002 ; RV64:       # %bb.0:
1003 ; RV64-NEXT:    srlw a0, a0, a1
1004 ; RV64-NEXT:    ret
1005   %1 = lshr i32 %a, %b
1006   ret i32 %1
1009 define i32 @aext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
1010 ; RV64-LABEL: aext_srlw_sext_sext:
1011 ; RV64:       # %bb.0:
1012 ; RV64-NEXT:    srlw a0, a0, a1
1013 ; RV64-NEXT:    ret
1014   %1 = lshr i32 %a, %b
1015   ret i32 %1
1018 define i32 @aext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
1019 ; RV64-LABEL: aext_srlw_sext_zext:
1020 ; RV64:       # %bb.0:
1021 ; RV64-NEXT:    srlw a0, a0, a1
1022 ; RV64-NEXT:    ret
1023   %1 = lshr i32 %a, %b
1024   ret i32 %1
1027 define i32 @aext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
1028 ; RV64-LABEL: aext_srlw_zext_aext:
1029 ; RV64:       # %bb.0:
1030 ; RV64-NEXT:    srlw a0, a0, a1
1031 ; RV64-NEXT:    ret
1032   %1 = lshr i32 %a, %b
1033   ret i32 %1
1036 define i32 @aext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
1037 ; RV64-LABEL: aext_srlw_zext_sext:
1038 ; RV64:       # %bb.0:
1039 ; RV64-NEXT:    srlw a0, a0, a1
1040 ; RV64-NEXT:    ret
1041   %1 = lshr i32 %a, %b
1042   ret i32 %1
1045 define i32 @aext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
1046 ; RV64-LABEL: aext_srlw_zext_zext:
1047 ; RV64:       # %bb.0:
1048 ; RV64-NEXT:    srlw a0, a0, a1
1049 ; RV64-NEXT:    ret
1050   %1 = lshr i32 %a, %b
1051   ret i32 %1
1054 define signext i32 @sext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
1055 ; RV64-LABEL: sext_srlw_aext_aext:
1056 ; RV64:       # %bb.0:
1057 ; RV64-NEXT:    srlw a0, a0, a1
1058 ; RV64-NEXT:    ret
1059   %1 = lshr i32 %a, %b
1060   ret i32 %1
1063 define signext i32 @sext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
1064 ; RV64-LABEL: sext_srlw_aext_sext:
1065 ; RV64:       # %bb.0:
1066 ; RV64-NEXT:    srlw a0, a0, a1
1067 ; RV64-NEXT:    ret
1068   %1 = lshr i32 %a, %b
1069   ret i32 %1
1072 define signext i32 @sext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
1073 ; RV64-LABEL: sext_srlw_aext_zext:
1074 ; RV64:       # %bb.0:
1075 ; RV64-NEXT:    srlw a0, a0, a1
1076 ; RV64-NEXT:    ret
1077   %1 = lshr i32 %a, %b
1078   ret i32 %1
1081 define signext i32 @sext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
1082 ; RV64-LABEL: sext_srlw_sext_aext:
1083 ; RV64:       # %bb.0:
1084 ; RV64-NEXT:    srlw a0, a0, a1
1085 ; RV64-NEXT:    ret
1086   %1 = lshr i32 %a, %b
1087   ret i32 %1
1090 define signext i32 @sext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
1091 ; RV64-LABEL: sext_srlw_sext_sext:
1092 ; RV64:       # %bb.0:
1093 ; RV64-NEXT:    srlw a0, a0, a1
1094 ; RV64-NEXT:    ret
1095   %1 = lshr i32 %a, %b
1096   ret i32 %1
1099 define signext i32 @sext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
1100 ; RV64-LABEL: sext_srlw_sext_zext:
1101 ; RV64:       # %bb.0:
1102 ; RV64-NEXT:    srlw a0, a0, a1
1103 ; RV64-NEXT:    ret
1104   %1 = lshr i32 %a, %b
1105   ret i32 %1
1108 define signext i32 @sext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
1109 ; RV64-LABEL: sext_srlw_zext_aext:
1110 ; RV64:       # %bb.0:
1111 ; RV64-NEXT:    srlw a0, a0, a1
1112 ; RV64-NEXT:    ret
1113   %1 = lshr i32 %a, %b
1114   ret i32 %1
1117 define signext i32 @sext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
1118 ; RV64-LABEL: sext_srlw_zext_sext:
1119 ; RV64:       # %bb.0:
1120 ; RV64-NEXT:    srlw a0, a0, a1
1121 ; RV64-NEXT:    ret
1122   %1 = lshr i32 %a, %b
1123   ret i32 %1
1126 define signext i32 @sext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
1127 ; RV64-LABEL: sext_srlw_zext_zext:
1128 ; RV64:       # %bb.0:
1129 ; RV64-NEXT:    srlw a0, a0, a1
1130 ; RV64-NEXT:    ret
1131   %1 = lshr i32 %a, %b
1132   ret i32 %1
1135 define zeroext i32 @zext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
1136 ; RV64I-LABEL: zext_srlw_aext_aext:
1137 ; RV64I:       # %bb.0:
1138 ; RV64I-NEXT:    srlw a0, a0, a1
1139 ; RV64I-NEXT:    slli a0, a0, 32
1140 ; RV64I-NEXT:    srli a0, a0, 32
1141 ; RV64I-NEXT:    ret
1143 ; RV64ZBA-LABEL: zext_srlw_aext_aext:
1144 ; RV64ZBA:       # %bb.0:
1145 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1146 ; RV64ZBA-NEXT:    zext.w a0, a0
1147 ; RV64ZBA-NEXT:    ret
1148   %1 = lshr i32 %a, %b
1149   ret i32 %1
1152 define zeroext i32 @zext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
1153 ; RV64I-LABEL: zext_srlw_aext_sext:
1154 ; RV64I:       # %bb.0:
1155 ; RV64I-NEXT:    srlw a0, a0, a1
1156 ; RV64I-NEXT:    slli a0, a0, 32
1157 ; RV64I-NEXT:    srli a0, a0, 32
1158 ; RV64I-NEXT:    ret
1160 ; RV64ZBA-LABEL: zext_srlw_aext_sext:
1161 ; RV64ZBA:       # %bb.0:
1162 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1163 ; RV64ZBA-NEXT:    zext.w a0, a0
1164 ; RV64ZBA-NEXT:    ret
1165   %1 = lshr i32 %a, %b
1166   ret i32 %1
1169 define zeroext i32 @zext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
1170 ; RV64I-LABEL: zext_srlw_aext_zext:
1171 ; RV64I:       # %bb.0:
1172 ; RV64I-NEXT:    srlw a0, a0, a1
1173 ; RV64I-NEXT:    slli a0, a0, 32
1174 ; RV64I-NEXT:    srli a0, a0, 32
1175 ; RV64I-NEXT:    ret
1177 ; RV64ZBA-LABEL: zext_srlw_aext_zext:
1178 ; RV64ZBA:       # %bb.0:
1179 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1180 ; RV64ZBA-NEXT:    zext.w a0, a0
1181 ; RV64ZBA-NEXT:    ret
1182   %1 = lshr i32 %a, %b
1183   ret i32 %1
1186 define zeroext i32 @zext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
1187 ; RV64I-LABEL: zext_srlw_sext_aext:
1188 ; RV64I:       # %bb.0:
1189 ; RV64I-NEXT:    srlw a0, a0, a1
1190 ; RV64I-NEXT:    slli a0, a0, 32
1191 ; RV64I-NEXT:    srli a0, a0, 32
1192 ; RV64I-NEXT:    ret
1194 ; RV64ZBA-LABEL: zext_srlw_sext_aext:
1195 ; RV64ZBA:       # %bb.0:
1196 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1197 ; RV64ZBA-NEXT:    zext.w a0, a0
1198 ; RV64ZBA-NEXT:    ret
1199   %1 = lshr i32 %a, %b
1200   ret i32 %1
1203 define zeroext i32 @zext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
1204 ; RV64I-LABEL: zext_srlw_sext_sext:
1205 ; RV64I:       # %bb.0:
1206 ; RV64I-NEXT:    srlw a0, a0, a1
1207 ; RV64I-NEXT:    slli a0, a0, 32
1208 ; RV64I-NEXT:    srli a0, a0, 32
1209 ; RV64I-NEXT:    ret
1211 ; RV64ZBA-LABEL: zext_srlw_sext_sext:
1212 ; RV64ZBA:       # %bb.0:
1213 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1214 ; RV64ZBA-NEXT:    zext.w a0, a0
1215 ; RV64ZBA-NEXT:    ret
1216   %1 = lshr i32 %a, %b
1217   ret i32 %1
1220 define zeroext i32 @zext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
1221 ; RV64I-LABEL: zext_srlw_sext_zext:
1222 ; RV64I:       # %bb.0:
1223 ; RV64I-NEXT:    srlw a0, a0, a1
1224 ; RV64I-NEXT:    slli a0, a0, 32
1225 ; RV64I-NEXT:    srli a0, a0, 32
1226 ; RV64I-NEXT:    ret
1228 ; RV64ZBA-LABEL: zext_srlw_sext_zext:
1229 ; RV64ZBA:       # %bb.0:
1230 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1231 ; RV64ZBA-NEXT:    zext.w a0, a0
1232 ; RV64ZBA-NEXT:    ret
1233   %1 = lshr i32 %a, %b
1234   ret i32 %1
1237 define zeroext i32 @zext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
1238 ; RV64I-LABEL: zext_srlw_zext_aext:
1239 ; RV64I:       # %bb.0:
1240 ; RV64I-NEXT:    srlw a0, a0, a1
1241 ; RV64I-NEXT:    slli a0, a0, 32
1242 ; RV64I-NEXT:    srli a0, a0, 32
1243 ; RV64I-NEXT:    ret
1245 ; RV64ZBA-LABEL: zext_srlw_zext_aext:
1246 ; RV64ZBA:       # %bb.0:
1247 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1248 ; RV64ZBA-NEXT:    zext.w a0, a0
1249 ; RV64ZBA-NEXT:    ret
1250   %1 = lshr i32 %a, %b
1251   ret i32 %1
1254 define zeroext i32 @zext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
1255 ; RV64I-LABEL: zext_srlw_zext_sext:
1256 ; RV64I:       # %bb.0:
1257 ; RV64I-NEXT:    srlw a0, a0, a1
1258 ; RV64I-NEXT:    slli a0, a0, 32
1259 ; RV64I-NEXT:    srli a0, a0, 32
1260 ; RV64I-NEXT:    ret
1262 ; RV64ZBA-LABEL: zext_srlw_zext_sext:
1263 ; RV64ZBA:       # %bb.0:
1264 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1265 ; RV64ZBA-NEXT:    zext.w a0, a0
1266 ; RV64ZBA-NEXT:    ret
1267   %1 = lshr i32 %a, %b
1268   ret i32 %1
1271 define zeroext i32 @zext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
1272 ; RV64I-LABEL: zext_srlw_zext_zext:
1273 ; RV64I:       # %bb.0:
1274 ; RV64I-NEXT:    srlw a0, a0, a1
1275 ; RV64I-NEXT:    slli a0, a0, 32
1276 ; RV64I-NEXT:    srli a0, a0, 32
1277 ; RV64I-NEXT:    ret
1279 ; RV64ZBA-LABEL: zext_srlw_zext_zext:
1280 ; RV64ZBA:       # %bb.0:
1281 ; RV64ZBA-NEXT:    srlw a0, a0, a1
1282 ; RV64ZBA-NEXT:    zext.w a0, a0
1283 ; RV64ZBA-NEXT:    ret
1284   %1 = lshr i32 %a, %b
1285   ret i32 %1
1288 define i32 @aext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
1289 ; RV64-LABEL: aext_sraw_aext_aext:
1290 ; RV64:       # %bb.0:
1291 ; RV64-NEXT:    sraw a0, a0, a1
1292 ; RV64-NEXT:    ret
1293   %1 = ashr i32 %a, %b
1294   ret i32 %1
1297 define i32 @aext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
1298 ; RV64-LABEL: aext_sraw_aext_sext:
1299 ; RV64:       # %bb.0:
1300 ; RV64-NEXT:    sraw a0, a0, a1
1301 ; RV64-NEXT:    ret
1302   %1 = ashr i32 %a, %b
1303   ret i32 %1
1306 define i32 @aext_sraw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
1307 ; RV64-LABEL: aext_sraw_aext_zext:
1308 ; RV64:       # %bb.0:
1309 ; RV64-NEXT:    sraw a0, a0, a1
1310 ; RV64-NEXT:    ret
1311   %1 = ashr i32 %a, %b
1312   ret i32 %1
1315 define i32 @aext_sraw_sext_aext(i32 signext %a, i32 %b) nounwind {
1316 ; RV64-LABEL: aext_sraw_sext_aext:
1317 ; RV64:       # %bb.0:
1318 ; RV64-NEXT:    sraw a0, a0, a1
1319 ; RV64-NEXT:    ret
1320   %1 = ashr i32 %a, %b
1321   ret i32 %1
1324 define i32 @aext_sraw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
1325 ; RV64-LABEL: aext_sraw_sext_sext:
1326 ; RV64:       # %bb.0:
1327 ; RV64-NEXT:    sraw a0, a0, a1
1328 ; RV64-NEXT:    ret
1329   %1 = ashr i32 %a, %b
1330   ret i32 %1
1333 define i32 @aext_sraw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
1334 ; RV64-LABEL: aext_sraw_sext_zext:
1335 ; RV64:       # %bb.0:
1336 ; RV64-NEXT:    sraw a0, a0, a1
1337 ; RV64-NEXT:    ret
1338   %1 = ashr i32 %a, %b
1339   ret i32 %1
1342 define i32 @aext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
1343 ; RV64-LABEL: aext_sraw_zext_aext:
1344 ; RV64:       # %bb.0:
1345 ; RV64-NEXT:    sraw a0, a0, a1
1346 ; RV64-NEXT:    ret
1347   %1 = ashr i32 %a, %b
1348   ret i32 %1
1351 define i32 @aext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
1352 ; RV64-LABEL: aext_sraw_zext_sext:
1353 ; RV64:       # %bb.0:
1354 ; RV64-NEXT:    sraw a0, a0, a1
1355 ; RV64-NEXT:    ret
1356   %1 = ashr i32 %a, %b
1357   ret i32 %1
1360 define i32 @aext_sraw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
1361 ; RV64-LABEL: aext_sraw_zext_zext:
1362 ; RV64:       # %bb.0:
1363 ; RV64-NEXT:    sraw a0, a0, a1
1364 ; RV64-NEXT:    ret
1365   %1 = ashr i32 %a, %b
1366   ret i32 %1
1369 define signext i32 @sext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
1370 ; RV64-LABEL: sext_sraw_aext_aext:
1371 ; RV64:       # %bb.0:
1372 ; RV64-NEXT:    sraw a0, a0, a1
1373 ; RV64-NEXT:    ret
1374   %1 = ashr i32 %a, %b
1375   ret i32 %1
1378 define signext i32 @sext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
1379 ; RV64-LABEL: sext_sraw_aext_sext:
1380 ; RV64:       # %bb.0:
1381 ; RV64-NEXT:    sraw a0, a0, a1
1382 ; RV64-NEXT:    ret
1383   %1 = ashr i32 %a, %b
1384   ret i32 %1
1387 define signext i32 @sext_sraw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
1388 ; RV64-LABEL: sext_sraw_aext_zext:
1389 ; RV64:       # %bb.0:
1390 ; RV64-NEXT:    sraw a0, a0, a1
1391 ; RV64-NEXT:    ret
1392   %1 = ashr i32 %a, %b
1393   ret i32 %1
1396 define signext i32 @sext_sraw_sext_aext(i32 signext %a, i32 %b) nounwind {
1397 ; RV64-LABEL: sext_sraw_sext_aext:
1398 ; RV64:       # %bb.0:
1399 ; RV64-NEXT:    sraw a0, a0, a1
1400 ; RV64-NEXT:    ret
1401   %1 = ashr i32 %a, %b
1402   ret i32 %1
1405 define signext i32 @sext_sraw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
1406 ; RV64-LABEL: sext_sraw_sext_sext:
1407 ; RV64:       # %bb.0:
1408 ; RV64-NEXT:    sraw a0, a0, a1
1409 ; RV64-NEXT:    ret
1410   %1 = ashr i32 %a, %b
1411   ret i32 %1
1414 define signext i32 @sext_sraw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
1415 ; RV64-LABEL: sext_sraw_sext_zext:
1416 ; RV64:       # %bb.0:
1417 ; RV64-NEXT:    sraw a0, a0, a1
1418 ; RV64-NEXT:    ret
1419   %1 = ashr i32 %a, %b
1420   ret i32 %1
1423 define signext i32 @sext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
1424 ; RV64-LABEL: sext_sraw_zext_aext:
1425 ; RV64:       # %bb.0:
1426 ; RV64-NEXT:    sraw a0, a0, a1
1427 ; RV64-NEXT:    ret
1428   %1 = ashr i32 %a, %b
1429   ret i32 %1
1432 define signext i32 @sext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
1433 ; RV64-LABEL: sext_sraw_zext_sext:
1434 ; RV64:       # %bb.0:
1435 ; RV64-NEXT:    sraw a0, a0, a1
1436 ; RV64-NEXT:    ret
1437   %1 = ashr i32 %a, %b
1438   ret i32 %1
1441 define signext i32 @sext_sraw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
1442 ; RV64-LABEL: sext_sraw_zext_zext:
1443 ; RV64:       # %bb.0:
1444 ; RV64-NEXT:    sraw a0, a0, a1
1445 ; RV64-NEXT:    ret
1446   %1 = ashr i32 %a, %b
1447   ret i32 %1
1450 define zeroext i32 @zext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
1451 ; RV64I-LABEL: zext_sraw_aext_aext:
1452 ; RV64I:       # %bb.0:
1453 ; RV64I-NEXT:    sraw a0, a0, a1
1454 ; RV64I-NEXT:    slli a0, a0, 32
1455 ; RV64I-NEXT:    srli a0, a0, 32
1456 ; RV64I-NEXT:    ret
1458 ; RV64ZBA-LABEL: zext_sraw_aext_aext:
1459 ; RV64ZBA:       # %bb.0:
1460 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1461 ; RV64ZBA-NEXT:    zext.w a0, a0
1462 ; RV64ZBA-NEXT:    ret
1463   %1 = ashr i32 %a, %b
1464   ret i32 %1
1467 define zeroext i32 @zext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
1468 ; RV64I-LABEL: zext_sraw_aext_sext:
1469 ; RV64I:       # %bb.0:
1470 ; RV64I-NEXT:    sraw a0, a0, a1
1471 ; RV64I-NEXT:    slli a0, a0, 32
1472 ; RV64I-NEXT:    srli a0, a0, 32
1473 ; RV64I-NEXT:    ret
1475 ; RV64ZBA-LABEL: zext_sraw_aext_sext:
1476 ; RV64ZBA:       # %bb.0:
1477 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1478 ; RV64ZBA-NEXT:    zext.w a0, a0
1479 ; RV64ZBA-NEXT:    ret
1480   %1 = ashr i32 %a, %b
1481   ret i32 %1
1484 define zeroext i32 @zext_sraw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
1485 ; RV64I-LABEL: zext_sraw_aext_zext:
1486 ; RV64I:       # %bb.0:
1487 ; RV64I-NEXT:    sraw a0, a0, a1
1488 ; RV64I-NEXT:    slli a0, a0, 32
1489 ; RV64I-NEXT:    srli a0, a0, 32
1490 ; RV64I-NEXT:    ret
1492 ; RV64ZBA-LABEL: zext_sraw_aext_zext:
1493 ; RV64ZBA:       # %bb.0:
1494 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1495 ; RV64ZBA-NEXT:    zext.w a0, a0
1496 ; RV64ZBA-NEXT:    ret
1497   %1 = ashr i32 %a, %b
1498   ret i32 %1
1501 define zeroext i32 @zext_sraw_sext_aext(i32 signext %a, i32 %b) nounwind {
1502 ; RV64I-LABEL: zext_sraw_sext_aext:
1503 ; RV64I:       # %bb.0:
1504 ; RV64I-NEXT:    sraw a0, a0, a1
1505 ; RV64I-NEXT:    slli a0, a0, 32
1506 ; RV64I-NEXT:    srli a0, a0, 32
1507 ; RV64I-NEXT:    ret
1509 ; RV64ZBA-LABEL: zext_sraw_sext_aext:
1510 ; RV64ZBA:       # %bb.0:
1511 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1512 ; RV64ZBA-NEXT:    zext.w a0, a0
1513 ; RV64ZBA-NEXT:    ret
1514   %1 = ashr i32 %a, %b
1515   ret i32 %1
1518 define zeroext i32 @zext_sraw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
1519 ; RV64I-LABEL: zext_sraw_sext_sext:
1520 ; RV64I:       # %bb.0:
1521 ; RV64I-NEXT:    sraw a0, a0, a1
1522 ; RV64I-NEXT:    slli a0, a0, 32
1523 ; RV64I-NEXT:    srli a0, a0, 32
1524 ; RV64I-NEXT:    ret
1526 ; RV64ZBA-LABEL: zext_sraw_sext_sext:
1527 ; RV64ZBA:       # %bb.0:
1528 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1529 ; RV64ZBA-NEXT:    zext.w a0, a0
1530 ; RV64ZBA-NEXT:    ret
1531   %1 = ashr i32 %a, %b
1532   ret i32 %1
1535 define zeroext i32 @zext_sraw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
1536 ; RV64I-LABEL: zext_sraw_sext_zext:
1537 ; RV64I:       # %bb.0:
1538 ; RV64I-NEXT:    sraw a0, a0, a1
1539 ; RV64I-NEXT:    slli a0, a0, 32
1540 ; RV64I-NEXT:    srli a0, a0, 32
1541 ; RV64I-NEXT:    ret
1543 ; RV64ZBA-LABEL: zext_sraw_sext_zext:
1544 ; RV64ZBA:       # %bb.0:
1545 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1546 ; RV64ZBA-NEXT:    zext.w a0, a0
1547 ; RV64ZBA-NEXT:    ret
1548   %1 = ashr i32 %a, %b
1549   ret i32 %1
1552 define zeroext i32 @zext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
1553 ; RV64I-LABEL: zext_sraw_zext_aext:
1554 ; RV64I:       # %bb.0:
1555 ; RV64I-NEXT:    sraw a0, a0, a1
1556 ; RV64I-NEXT:    slli a0, a0, 32
1557 ; RV64I-NEXT:    srli a0, a0, 32
1558 ; RV64I-NEXT:    ret
1560 ; RV64ZBA-LABEL: zext_sraw_zext_aext:
1561 ; RV64ZBA:       # %bb.0:
1562 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1563 ; RV64ZBA-NEXT:    zext.w a0, a0
1564 ; RV64ZBA-NEXT:    ret
1565   %1 = ashr i32 %a, %b
1566   ret i32 %1
1569 define zeroext i32 @zext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
1570 ; RV64I-LABEL: zext_sraw_zext_sext:
1571 ; RV64I:       # %bb.0:
1572 ; RV64I-NEXT:    sraw a0, a0, a1
1573 ; RV64I-NEXT:    slli a0, a0, 32
1574 ; RV64I-NEXT:    srli a0, a0, 32
1575 ; RV64I-NEXT:    ret
1577 ; RV64ZBA-LABEL: zext_sraw_zext_sext:
1578 ; RV64ZBA:       # %bb.0:
1579 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1580 ; RV64ZBA-NEXT:    zext.w a0, a0
1581 ; RV64ZBA-NEXT:    ret
1582   %1 = ashr i32 %a, %b
1583   ret i32 %1
1586 define zeroext i32 @zext_sraw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
1587 ; RV64I-LABEL: zext_sraw_zext_zext:
1588 ; RV64I:       # %bb.0:
1589 ; RV64I-NEXT:    sraw a0, a0, a1
1590 ; RV64I-NEXT:    slli a0, a0, 32
1591 ; RV64I-NEXT:    srli a0, a0, 32
1592 ; RV64I-NEXT:    ret
1594 ; RV64ZBA-LABEL: zext_sraw_zext_zext:
1595 ; RV64ZBA:       # %bb.0:
1596 ; RV64ZBA-NEXT:    sraw a0, a0, a1
1597 ; RV64ZBA-NEXT:    zext.w a0, a0
1598 ; RV64ZBA-NEXT:    ret
1599   %1 = ashr i32 %a, %b
1600   ret i32 %1
1603 ; addiw should be selected when there is a signext result.
1605 define i32 @aext_addiw_aext(i32 %a) nounwind {
1606 ; RV64-LABEL: aext_addiw_aext:
1607 ; RV64:       # %bb.0:
1608 ; RV64-NEXT:    addiw a0, a0, 1
1609 ; RV64-NEXT:    ret
1610   %1 = add i32 %a, 1
1611   ret i32 %1
1614 define i32 @aext_addiw_sext(i32 signext %a) nounwind {
1615 ; RV64-LABEL: aext_addiw_sext:
1616 ; RV64:       # %bb.0:
1617 ; RV64-NEXT:    addiw a0, a0, 2
1618 ; RV64-NEXT:    ret
1619   %1 = add i32 %a, 2
1620   ret i32 %1
1623 define i32 @aext_addiw_zext(i32 zeroext %a) nounwind {
1624 ; RV64-LABEL: aext_addiw_zext:
1625 ; RV64:       # %bb.0:
1626 ; RV64-NEXT:    addiw a0, a0, 3
1627 ; RV64-NEXT:    ret
1628   %1 = add i32 %a, 3
1629   ret i32 %1
1632 define signext i32 @sext_addiw_aext(i32 %a) nounwind {
1633 ; RV64-LABEL: sext_addiw_aext:
1634 ; RV64:       # %bb.0:
1635 ; RV64-NEXT:    addiw a0, a0, 4
1636 ; RV64-NEXT:    ret
1637   %1 = add i32 %a, 4
1638   ret i32 %1
1641 define signext i32 @sext_addiw_sext(i32 signext %a) nounwind {
1642 ; RV64-LABEL: sext_addiw_sext:
1643 ; RV64:       # %bb.0:
1644 ; RV64-NEXT:    addiw a0, a0, 5
1645 ; RV64-NEXT:    ret
1646   %1 = add i32 %a, 5
1647   ret i32 %1
1650 define signext i32 @sext_addiw_zext(i32 zeroext %a) nounwind {
1651 ; RV64-LABEL: sext_addiw_zext:
1652 ; RV64:       # %bb.0:
1653 ; RV64-NEXT:    addiw a0, a0, 6
1654 ; RV64-NEXT:    ret
1655   %1 = add i32 %a, 6
1656   ret i32 %1
1659 define zeroext i32 @zext_addiw_aext(i32 %a) nounwind {
1660 ; RV64I-LABEL: zext_addiw_aext:
1661 ; RV64I:       # %bb.0:
1662 ; RV64I-NEXT:    addi a0, a0, 7
1663 ; RV64I-NEXT:    slli a0, a0, 32
1664 ; RV64I-NEXT:    srli a0, a0, 32
1665 ; RV64I-NEXT:    ret
1667 ; RV64ZBA-LABEL: zext_addiw_aext:
1668 ; RV64ZBA:       # %bb.0:
1669 ; RV64ZBA-NEXT:    addi a0, a0, 7
1670 ; RV64ZBA-NEXT:    zext.w a0, a0
1671 ; RV64ZBA-NEXT:    ret
1672   %1 = add i32 %a, 7
1673   ret i32 %1
1676 define zeroext i32 @zext_addiw_sext(i32 signext %a) nounwind {
1677 ; RV64I-LABEL: zext_addiw_sext:
1678 ; RV64I:       # %bb.0:
1679 ; RV64I-NEXT:    addi a0, a0, 8
1680 ; RV64I-NEXT:    slli a0, a0, 32
1681 ; RV64I-NEXT:    srli a0, a0, 32
1682 ; RV64I-NEXT:    ret
1684 ; RV64ZBA-LABEL: zext_addiw_sext:
1685 ; RV64ZBA:       # %bb.0:
1686 ; RV64ZBA-NEXT:    addi a0, a0, 8
1687 ; RV64ZBA-NEXT:    zext.w a0, a0
1688 ; RV64ZBA-NEXT:    ret
1689   %1 = add i32 %a, 8
1690   ret i32 %1
1693 define zeroext i32 @zext_addiw_zext(i32 zeroext %a) nounwind {
1694 ; RV64I-LABEL: zext_addiw_zext:
1695 ; RV64I:       # %bb.0:
1696 ; RV64I-NEXT:    addi a0, a0, 9
1697 ; RV64I-NEXT:    slli a0, a0, 32
1698 ; RV64I-NEXT:    srli a0, a0, 32
1699 ; RV64I-NEXT:    ret
1701 ; RV64ZBA-LABEL: zext_addiw_zext:
1702 ; RV64ZBA:       # %bb.0:
1703 ; RV64ZBA-NEXT:    addi a0, a0, 9
1704 ; RV64ZBA-NEXT:    zext.w a0, a0
1705 ; RV64ZBA-NEXT:    ret
1706   %1 = add i32 %a, 9
1707   ret i32 %1
1710 ; slliw should be selected whenever the return is signext.
1712 define i32 @aext_slliw_aext(i32 %a) nounwind {
1713 ; RV64-LABEL: aext_slliw_aext:
1714 ; RV64:       # %bb.0:
1715 ; RV64-NEXT:    slliw a0, a0, 1
1716 ; RV64-NEXT:    ret
1717   %1 = shl i32 %a, 1
1718   ret i32 %1
1721 define i32 @aext_slliw_sext(i32 signext %a) nounwind {
1722 ; RV64-LABEL: aext_slliw_sext:
1723 ; RV64:       # %bb.0:
1724 ; RV64-NEXT:    slliw a0, a0, 2
1725 ; RV64-NEXT:    ret
1726   %1 = shl i32 %a, 2
1727   ret i32 %1
1730 define i32 @aext_slliw_zext(i32 zeroext %a) nounwind {
1731 ; RV64-LABEL: aext_slliw_zext:
1732 ; RV64:       # %bb.0:
1733 ; RV64-NEXT:    slliw a0, a0, 3
1734 ; RV64-NEXT:    ret
1735   %1 = shl i32 %a, 3
1736   ret i32 %1
1739 define signext i32 @sext_slliw_aext(i32 %a) nounwind {
1740 ; RV64-LABEL: sext_slliw_aext:
1741 ; RV64:       # %bb.0:
1742 ; RV64-NEXT:    slliw a0, a0, 4
1743 ; RV64-NEXT:    ret
1744   %1 = shl i32 %a, 4
1745   ret i32 %1
1748 define signext i32 @sext_slliw_sext(i32 signext %a) nounwind {
1749 ; RV64-LABEL: sext_slliw_sext:
1750 ; RV64:       # %bb.0:
1751 ; RV64-NEXT:    slliw a0, a0, 5
1752 ; RV64-NEXT:    ret
1753   %1 = shl i32 %a, 5
1754   ret i32 %1
1757 define signext i32 @sext_slliw_zext(i32 zeroext %a) nounwind {
1758 ; RV64-LABEL: sext_slliw_zext:
1759 ; RV64:       # %bb.0:
1760 ; RV64-NEXT:    slliw a0, a0, 6
1761 ; RV64-NEXT:    ret
1762   %1 = shl i32 %a, 6
1763   ret i32 %1
1766 define zeroext i32 @zext_slliw_aext(i32 %a) nounwind {
1767 ; RV64-LABEL: zext_slliw_aext:
1768 ; RV64:       # %bb.0:
1769 ; RV64-NEXT:    slli a0, a0, 39
1770 ; RV64-NEXT:    srli a0, a0, 32
1771 ; RV64-NEXT:    ret
1772   %1 = shl i32 %a, 7
1773   ret i32 %1
1776 define zeroext i32 @zext_slliw_sext(i32 signext %a) nounwind {
1777 ; RV64-LABEL: zext_slliw_sext:
1778 ; RV64:       # %bb.0:
1779 ; RV64-NEXT:    slli a0, a0, 40
1780 ; RV64-NEXT:    srli a0, a0, 32
1781 ; RV64-NEXT:    ret
1782   %1 = shl i32 %a, 8
1783   ret i32 %1
1786 define zeroext i32 @zext_slliw_zext(i32 zeroext %a) nounwind {
1787 ; RV64-LABEL: zext_slliw_zext:
1788 ; RV64:       # %bb.0:
1789 ; RV64-NEXT:    slli a0, a0, 41
1790 ; RV64-NEXT:    srli a0, a0, 32
1791 ; RV64-NEXT:    ret
1792   %1 = shl i32 %a, 9
1793   ret i32 %1
1796 ; srliw should be selected unless the first operand is zeroext, when srli is
1797 ; equivalent.
1799 define i32 @aext_srliw_aext(i32 %a) nounwind {
1800 ; RV64-LABEL: aext_srliw_aext:
1801 ; RV64:       # %bb.0:
1802 ; RV64-NEXT:    srliw a0, a0, 1
1803 ; RV64-NEXT:    ret
1804   %1 = lshr i32 %a, 1
1805   ret i32 %1
1808 define i32 @aext_srliw_sext(i32 signext %a) nounwind {
1809 ; RV64-LABEL: aext_srliw_sext:
1810 ; RV64:       # %bb.0:
1811 ; RV64-NEXT:    srliw a0, a0, 2
1812 ; RV64-NEXT:    ret
1813   %1 = lshr i32 %a, 2
1814   ret i32 %1
1817 define i32 @aext_srliw_zext(i32 zeroext %a) nounwind {
1818 ; RV64-LABEL: aext_srliw_zext:
1819 ; RV64:       # %bb.0:
1820 ; RV64-NEXT:    srli a0, a0, 3
1821 ; RV64-NEXT:    ret
1822   %1 = lshr i32 %a, 3
1823   ret i32 %1
1826 define signext i32 @sext_srliw_aext(i32 %a) nounwind {
1827 ; RV64-LABEL: sext_srliw_aext:
1828 ; RV64:       # %bb.0:
1829 ; RV64-NEXT:    srliw a0, a0, 4
1830 ; RV64-NEXT:    ret
1831   %1 = lshr i32 %a, 4
1832   ret i32 %1
1835 define signext i32 @sext_srliw_sext(i32 signext %a) nounwind {
1836 ; RV64-LABEL: sext_srliw_sext:
1837 ; RV64:       # %bb.0:
1838 ; RV64-NEXT:    srliw a0, a0, 5
1839 ; RV64-NEXT:    ret
1840   %1 = lshr i32 %a, 5
1841   ret i32 %1
1844 define signext i32 @sext_srliw_zext(i32 zeroext %a) nounwind {
1845 ; RV64-LABEL: sext_srliw_zext:
1846 ; RV64:       # %bb.0:
1847 ; RV64-NEXT:    srli a0, a0, 6
1848 ; RV64-NEXT:    ret
1849   %1 = lshr i32 %a, 6
1850   ret i32 %1
1853 define zeroext i32 @zext_srliw_aext(i32 %a) nounwind {
1854 ; RV64-LABEL: zext_srliw_aext:
1855 ; RV64:       # %bb.0:
1856 ; RV64-NEXT:    srliw a0, a0, 7
1857 ; RV64-NEXT:    ret
1858   %1 = lshr i32 %a, 7
1859   ret i32 %1
1862 define zeroext i32 @zext_srliw_sext(i32 signext %a) nounwind {
1863 ; RV64-LABEL: zext_srliw_sext:
1864 ; RV64:       # %bb.0:
1865 ; RV64-NEXT:    srliw a0, a0, 8
1866 ; RV64-NEXT:    ret
1867   %1 = lshr i32 %a, 8
1868   ret i32 %1
1871 define zeroext i32 @zext_srliw_zext(i32 zeroext %a) nounwind {
1872 ; RV64-LABEL: zext_srliw_zext:
1873 ; RV64:       # %bb.0:
1874 ; RV64-NEXT:    srli a0, a0, 9
1875 ; RV64-NEXT:    ret
1876   %1 = lshr i32 %a, 9
1877   ret i32 %1
1880 ; srai is equivalent to sraiw if the first operand is sign-extended.
1882 define i32 @aext_sraiw_aext(i32 %a) nounwind {
1883 ; RV64-LABEL: aext_sraiw_aext:
1884 ; RV64:       # %bb.0:
1885 ; RV64-NEXT:    sraiw a0, a0, 1
1886 ; RV64-NEXT:    ret
1887   %1 = ashr i32 %a, 1
1888   ret i32 %1
1891 define i32 @aext_sraiw_sext(i32 signext %a) nounwind {
1892 ; RV64-LABEL: aext_sraiw_sext:
1893 ; RV64:       # %bb.0:
1894 ; RV64-NEXT:    srai a0, a0, 2
1895 ; RV64-NEXT:    ret
1896   %1 = ashr i32 %a, 2
1897   ret i32 %1
1900 define i32 @aext_sraiw_zext(i32 zeroext %a) nounwind {
1901 ; RV64-LABEL: aext_sraiw_zext:
1902 ; RV64:       # %bb.0:
1903 ; RV64-NEXT:    sraiw a0, a0, 3
1904 ; RV64-NEXT:    ret
1905   %1 = ashr i32 %a, 3
1906   ret i32 %1
1909 define signext i32 @sext_sraiw_aext(i32 %a) nounwind {
1910 ; RV64-LABEL: sext_sraiw_aext:
1911 ; RV64:       # %bb.0:
1912 ; RV64-NEXT:    sraiw a0, a0, 4
1913 ; RV64-NEXT:    ret
1914   %1 = ashr i32 %a, 4
1915   ret i32 %1
1918 define signext i32 @sext_sraiw_sext(i32 signext %a) nounwind {
1919 ; RV64-LABEL: sext_sraiw_sext:
1920 ; RV64:       # %bb.0:
1921 ; RV64-NEXT:    srai a0, a0, 5
1922 ; RV64-NEXT:    ret
1923   %1 = ashr i32 %a, 5
1924   ret i32 %1
1927 define signext i32 @sext_sraiw_zext(i32 zeroext %a) nounwind {
1928 ; RV64-LABEL: sext_sraiw_zext:
1929 ; RV64:       # %bb.0:
1930 ; RV64-NEXT:    sraiw a0, a0, 6
1931 ; RV64-NEXT:    ret
1932   %1 = ashr i32 %a, 6
1933   ret i32 %1
1936 define zeroext i32 @zext_sraiw_aext(i32 %a) nounwind {
1937 ; RV64I-LABEL: zext_sraiw_aext:
1938 ; RV64I:       # %bb.0:
1939 ; RV64I-NEXT:    sext.w a0, a0
1940 ; RV64I-NEXT:    slli a0, a0, 25
1941 ; RV64I-NEXT:    srli a0, a0, 32
1942 ; RV64I-NEXT:    ret
1944 ; RV64ZBA-LABEL: zext_sraiw_aext:
1945 ; RV64ZBA:       # %bb.0:
1946 ; RV64ZBA-NEXT:    sraiw a0, a0, 7
1947 ; RV64ZBA-NEXT:    zext.w a0, a0
1948 ; RV64ZBA-NEXT:    ret
1949   %1 = ashr i32 %a, 7
1950   ret i32 %1
1953 define zeroext i32 @zext_sraiw_sext(i32 signext %a) nounwind {
1954 ; RV64-LABEL: zext_sraiw_sext:
1955 ; RV64:       # %bb.0:
1956 ; RV64-NEXT:    slli a0, a0, 24
1957 ; RV64-NEXT:    srli a0, a0, 32
1958 ; RV64-NEXT:    ret
1959   %1 = ashr i32 %a, 8
1960   ret i32 %1
1963 define zeroext i32 @zext_sraiw_zext(i32 zeroext %a) nounwind {
1964 ; RV64I-LABEL: zext_sraiw_zext:
1965 ; RV64I:       # %bb.0:
1966 ; RV64I-NEXT:    sext.w a0, a0
1967 ; RV64I-NEXT:    slli a0, a0, 23
1968 ; RV64I-NEXT:    srli a0, a0, 32
1969 ; RV64I-NEXT:    ret
1971 ; RV64ZBA-LABEL: zext_sraiw_zext:
1972 ; RV64ZBA:       # %bb.0:
1973 ; RV64ZBA-NEXT:    sraiw a0, a0, 9
1974 ; RV64ZBA-NEXT:    zext.w a0, a0
1975 ; RV64ZBA-NEXT:    ret
1976   %1 = ashr i32 %a, 9
1977   ret i32 %1