Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv32zba.ll
blob0908a393338c5014f8ec5a71a17318bec26f16a1
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32I
4 ; RUN: llc -mtriple=riscv32 -mattr=+m,+zba -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32ZBA
7 define signext i16 @sh1add(i64 %0, ptr %1) {
8 ; RV32I-LABEL: sh1add:
9 ; RV32I:       # %bb.0:
10 ; RV32I-NEXT:    slli a0, a0, 1
11 ; RV32I-NEXT:    add a0, a2, a0
12 ; RV32I-NEXT:    lh a0, 0(a0)
13 ; RV32I-NEXT:    ret
15 ; RV32ZBA-LABEL: sh1add:
16 ; RV32ZBA:       # %bb.0:
17 ; RV32ZBA-NEXT:    sh1add a0, a0, a2
18 ; RV32ZBA-NEXT:    lh a0, 0(a0)
19 ; RV32ZBA-NEXT:    ret
20   %3 = getelementptr inbounds i16, ptr %1, i64 %0
21   %4 = load i16, ptr %3
22   ret i16 %4
25 define i32 @sh2add(i64 %0, ptr %1) {
26 ; RV32I-LABEL: sh2add:
27 ; RV32I:       # %bb.0:
28 ; RV32I-NEXT:    slli a0, a0, 2
29 ; RV32I-NEXT:    add a0, a2, a0
30 ; RV32I-NEXT:    lw a0, 0(a0)
31 ; RV32I-NEXT:    ret
33 ; RV32ZBA-LABEL: sh2add:
34 ; RV32ZBA:       # %bb.0:
35 ; RV32ZBA-NEXT:    sh2add a0, a0, a2
36 ; RV32ZBA-NEXT:    lw a0, 0(a0)
37 ; RV32ZBA-NEXT:    ret
38   %3 = getelementptr inbounds i32, ptr %1, i64 %0
39   %4 = load i32, ptr %3
40   ret i32 %4
43 define i64 @sh3add(i64 %0, ptr %1) {
44 ; RV32I-LABEL: sh3add:
45 ; RV32I:       # %bb.0:
46 ; RV32I-NEXT:    slli a0, a0, 3
47 ; RV32I-NEXT:    add a2, a2, a0
48 ; RV32I-NEXT:    lw a0, 0(a2)
49 ; RV32I-NEXT:    lw a1, 4(a2)
50 ; RV32I-NEXT:    ret
52 ; RV32ZBA-LABEL: sh3add:
53 ; RV32ZBA:       # %bb.0:
54 ; RV32ZBA-NEXT:    sh3add a1, a0, a2
55 ; RV32ZBA-NEXT:    lw a0, 0(a1)
56 ; RV32ZBA-NEXT:    lw a1, 4(a1)
57 ; RV32ZBA-NEXT:    ret
58   %3 = getelementptr inbounds i64, ptr %1, i64 %0
59   %4 = load i64, ptr %3
60   ret i64 %4
63 define i32 @addmul6(i32 %a, i32 %b) {
64 ; RV32I-LABEL: addmul6:
65 ; RV32I:       # %bb.0:
66 ; RV32I-NEXT:    li a2, 6
67 ; RV32I-NEXT:    mul a0, a0, a2
68 ; RV32I-NEXT:    add a0, a0, a1
69 ; RV32I-NEXT:    ret
71 ; RV32ZBA-LABEL: addmul6:
72 ; RV32ZBA:       # %bb.0:
73 ; RV32ZBA-NEXT:    sh1add a0, a0, a0
74 ; RV32ZBA-NEXT:    sh1add a0, a0, a1
75 ; RV32ZBA-NEXT:    ret
76   %c = mul i32 %a, 6
77   %d = add i32 %c, %b
78   ret i32 %d
81 define i32 @addmul10(i32 %a, i32 %b) {
82 ; RV32I-LABEL: addmul10:
83 ; RV32I:       # %bb.0:
84 ; RV32I-NEXT:    li a2, 10
85 ; RV32I-NEXT:    mul a0, a0, a2
86 ; RV32I-NEXT:    add a0, a0, a1
87 ; RV32I-NEXT:    ret
89 ; RV32ZBA-LABEL: addmul10:
90 ; RV32ZBA:       # %bb.0:
91 ; RV32ZBA-NEXT:    sh2add a0, a0, a0
92 ; RV32ZBA-NEXT:    sh1add a0, a0, a1
93 ; RV32ZBA-NEXT:    ret
94   %c = mul i32 %a, 10
95   %d = add i32 %c, %b
96   ret i32 %d
99 define i32 @addmul12(i32 %a, i32 %b) {
100 ; RV32I-LABEL: addmul12:
101 ; RV32I:       # %bb.0:
102 ; RV32I-NEXT:    li a2, 12
103 ; RV32I-NEXT:    mul a0, a0, a2
104 ; RV32I-NEXT:    add a0, a0, a1
105 ; RV32I-NEXT:    ret
107 ; RV32ZBA-LABEL: addmul12:
108 ; RV32ZBA:       # %bb.0:
109 ; RV32ZBA-NEXT:    sh1add a0, a0, a0
110 ; RV32ZBA-NEXT:    sh2add a0, a0, a1
111 ; RV32ZBA-NEXT:    ret
112   %c = mul i32 %a, 12
113   %d = add i32 %c, %b
114   ret i32 %d
117 define i32 @addmul18(i32 %a, i32 %b) {
118 ; RV32I-LABEL: addmul18:
119 ; RV32I:       # %bb.0:
120 ; RV32I-NEXT:    li a2, 18
121 ; RV32I-NEXT:    mul a0, a0, a2
122 ; RV32I-NEXT:    add a0, a0, a1
123 ; RV32I-NEXT:    ret
125 ; RV32ZBA-LABEL: addmul18:
126 ; RV32ZBA:       # %bb.0:
127 ; RV32ZBA-NEXT:    sh3add a0, a0, a0
128 ; RV32ZBA-NEXT:    sh1add a0, a0, a1
129 ; RV32ZBA-NEXT:    ret
130   %c = mul i32 %a, 18
131   %d = add i32 %c, %b
132   ret i32 %d
135 define i32 @addmul20(i32 %a, i32 %b) {
136 ; RV32I-LABEL: addmul20:
137 ; RV32I:       # %bb.0:
138 ; RV32I-NEXT:    li a2, 20
139 ; RV32I-NEXT:    mul a0, a0, a2
140 ; RV32I-NEXT:    add a0, a0, a1
141 ; RV32I-NEXT:    ret
143 ; RV32ZBA-LABEL: addmul20:
144 ; RV32ZBA:       # %bb.0:
145 ; RV32ZBA-NEXT:    sh2add a0, a0, a0
146 ; RV32ZBA-NEXT:    sh2add a0, a0, a1
147 ; RV32ZBA-NEXT:    ret
148   %c = mul i32 %a, 20
149   %d = add i32 %c, %b
150   ret i32 %d
153 define i32 @addmul24(i32 %a, i32 %b) {
154 ; RV32I-LABEL: addmul24:
155 ; RV32I:       # %bb.0:
156 ; RV32I-NEXT:    li a2, 24
157 ; RV32I-NEXT:    mul a0, a0, a2
158 ; RV32I-NEXT:    add a0, a0, a1
159 ; RV32I-NEXT:    ret
161 ; RV32ZBA-LABEL: addmul24:
162 ; RV32ZBA:       # %bb.0:
163 ; RV32ZBA-NEXT:    sh1add a0, a0, a0
164 ; RV32ZBA-NEXT:    sh3add a0, a0, a1
165 ; RV32ZBA-NEXT:    ret
166   %c = mul i32 %a, 24
167   %d = add i32 %c, %b
168   ret i32 %d
171 define i32 @addmul36(i32 %a, i32 %b) {
172 ; RV32I-LABEL: addmul36:
173 ; RV32I:       # %bb.0:
174 ; RV32I-NEXT:    li a2, 36
175 ; RV32I-NEXT:    mul a0, a0, a2
176 ; RV32I-NEXT:    add a0, a0, a1
177 ; RV32I-NEXT:    ret
179 ; RV32ZBA-LABEL: addmul36:
180 ; RV32ZBA:       # %bb.0:
181 ; RV32ZBA-NEXT:    sh3add a0, a0, a0
182 ; RV32ZBA-NEXT:    sh2add a0, a0, a1
183 ; RV32ZBA-NEXT:    ret
184   %c = mul i32 %a, 36
185   %d = add i32 %c, %b
186   ret i32 %d
189 define i32 @addmul40(i32 %a, i32 %b) {
190 ; RV32I-LABEL: addmul40:
191 ; RV32I:       # %bb.0:
192 ; RV32I-NEXT:    li a2, 40
193 ; RV32I-NEXT:    mul a0, a0, a2
194 ; RV32I-NEXT:    add a0, a0, a1
195 ; RV32I-NEXT:    ret
197 ; RV32ZBA-LABEL: addmul40:
198 ; RV32ZBA:       # %bb.0:
199 ; RV32ZBA-NEXT:    sh2add a0, a0, a0
200 ; RV32ZBA-NEXT:    sh3add a0, a0, a1
201 ; RV32ZBA-NEXT:    ret
202   %c = mul i32 %a, 40
203   %d = add i32 %c, %b
204   ret i32 %d
207 define i32 @addmul72(i32 %a, i32 %b) {
208 ; RV32I-LABEL: addmul72:
209 ; RV32I:       # %bb.0:
210 ; RV32I-NEXT:    li a2, 72
211 ; RV32I-NEXT:    mul a0, a0, a2
212 ; RV32I-NEXT:    add a0, a0, a1
213 ; RV32I-NEXT:    ret
215 ; RV32ZBA-LABEL: addmul72:
216 ; RV32ZBA:       # %bb.0:
217 ; RV32ZBA-NEXT:    sh3add a0, a0, a0
218 ; RV32ZBA-NEXT:    sh3add a0, a0, a1
219 ; RV32ZBA-NEXT:    ret
220   %c = mul i32 %a, 72
221   %d = add i32 %c, %b
222   ret i32 %d
225 define i32 @mul96(i32 %a) {
226 ; RV32I-LABEL: mul96:
227 ; RV32I:       # %bb.0:
228 ; RV32I-NEXT:    li a1, 96
229 ; RV32I-NEXT:    mul a0, a0, a1
230 ; RV32I-NEXT:    ret
232 ; RV32ZBA-LABEL: mul96:
233 ; RV32ZBA:       # %bb.0:
234 ; RV32ZBA-NEXT:    sh1add a0, a0, a0
235 ; RV32ZBA-NEXT:    slli a0, a0, 5
236 ; RV32ZBA-NEXT:    ret
237   %c = mul i32 %a, 96
238   ret i32 %c
241 define i32 @mul160(i32 %a) {
242 ; RV32I-LABEL: mul160:
243 ; RV32I:       # %bb.0:
244 ; RV32I-NEXT:    li a1, 160
245 ; RV32I-NEXT:    mul a0, a0, a1
246 ; RV32I-NEXT:    ret
248 ; RV32ZBA-LABEL: mul160:
249 ; RV32ZBA:       # %bb.0:
250 ; RV32ZBA-NEXT:    sh2add a0, a0, a0
251 ; RV32ZBA-NEXT:    slli a0, a0, 5
252 ; RV32ZBA-NEXT:    ret
253   %c = mul i32 %a, 160
254   ret i32 %c
257 define i32 @mul288(i32 %a) {
258 ; RV32I-LABEL: mul288:
259 ; RV32I:       # %bb.0:
260 ; RV32I-NEXT:    li a1, 288
261 ; RV32I-NEXT:    mul a0, a0, a1
262 ; RV32I-NEXT:    ret
264 ; RV32ZBA-LABEL: mul288:
265 ; RV32ZBA:       # %bb.0:
266 ; RV32ZBA-NEXT:    sh3add a0, a0, a0
267 ; RV32ZBA-NEXT:    slli a0, a0, 5
268 ; RV32ZBA-NEXT:    ret
269   %c = mul i32 %a, 288
270   ret i32 %c
273 define i32 @mul258(i32 %a) {
274 ; CHECK-LABEL: mul258:
275 ; CHECK:       # %bb.0:
276 ; CHECK-NEXT:    li a1, 258
277 ; CHECK-NEXT:    mul a0, a0, a1
278 ; CHECK-NEXT:    ret
279   %c = mul i32 %a, 258
280   ret i32 %c
283 define i32 @mul260(i32 %a) {
284 ; CHECK-LABEL: mul260:
285 ; CHECK:       # %bb.0:
286 ; CHECK-NEXT:    li a1, 260
287 ; CHECK-NEXT:    mul a0, a0, a1
288 ; CHECK-NEXT:    ret
289   %c = mul i32 %a, 260
290   ret i32 %c
293 define i32 @mul264(i32 %a) {
294 ; CHECK-LABEL: mul264:
295 ; CHECK:       # %bb.0:
296 ; CHECK-NEXT:    li a1, 264
297 ; CHECK-NEXT:    mul a0, a0, a1
298 ; CHECK-NEXT:    ret
299   %c = mul i32 %a, 264
300   ret i32 %c
303 define i32 @mul11(i32 %a) {
304 ; RV32I-LABEL: mul11:
305 ; RV32I:       # %bb.0:
306 ; RV32I-NEXT:    li a1, 11
307 ; RV32I-NEXT:    mul a0, a0, a1
308 ; RV32I-NEXT:    ret
310 ; RV32ZBA-LABEL: mul11:
311 ; RV32ZBA:       # %bb.0:
312 ; RV32ZBA-NEXT:    sh2add a1, a0, a0
313 ; RV32ZBA-NEXT:    sh1add a0, a1, a0
314 ; RV32ZBA-NEXT:    ret
315   %c = mul i32 %a, 11
316   ret i32 %c
319 define i32 @mul19(i32 %a) {
320 ; RV32I-LABEL: mul19:
321 ; RV32I:       # %bb.0:
322 ; RV32I-NEXT:    li a1, 19
323 ; RV32I-NEXT:    mul a0, a0, a1
324 ; RV32I-NEXT:    ret
326 ; RV32ZBA-LABEL: mul19:
327 ; RV32ZBA:       # %bb.0:
328 ; RV32ZBA-NEXT:    sh3add a1, a0, a0
329 ; RV32ZBA-NEXT:    sh1add a0, a1, a0
330 ; RV32ZBA-NEXT:    ret
331   %c = mul i32 %a, 19
332   ret i32 %c
335 define i32 @mul13(i32 %a) {
336 ; RV32I-LABEL: mul13:
337 ; RV32I:       # %bb.0:
338 ; RV32I-NEXT:    li a1, 13
339 ; RV32I-NEXT:    mul a0, a0, a1
340 ; RV32I-NEXT:    ret
342 ; RV32ZBA-LABEL: mul13:
343 ; RV32ZBA:       # %bb.0:
344 ; RV32ZBA-NEXT:    sh1add a1, a0, a0
345 ; RV32ZBA-NEXT:    sh2add a0, a1, a0
346 ; RV32ZBA-NEXT:    ret
347   %c = mul i32 %a, 13
348   ret i32 %c
351 define i32 @mul21(i32 %a) {
352 ; RV32I-LABEL: mul21:
353 ; RV32I:       # %bb.0:
354 ; RV32I-NEXT:    li a1, 21
355 ; RV32I-NEXT:    mul a0, a0, a1
356 ; RV32I-NEXT:    ret
358 ; RV32ZBA-LABEL: mul21:
359 ; RV32ZBA:       # %bb.0:
360 ; RV32ZBA-NEXT:    sh2add a1, a0, a0
361 ; RV32ZBA-NEXT:    sh2add a0, a1, a0
362 ; RV32ZBA-NEXT:    ret
363   %c = mul i32 %a, 21
364   ret i32 %c
367 define i32 @mul37(i32 %a) {
368 ; RV32I-LABEL: mul37:
369 ; RV32I:       # %bb.0:
370 ; RV32I-NEXT:    li a1, 37
371 ; RV32I-NEXT:    mul a0, a0, a1
372 ; RV32I-NEXT:    ret
374 ; RV32ZBA-LABEL: mul37:
375 ; RV32ZBA:       # %bb.0:
376 ; RV32ZBA-NEXT:    sh3add a1, a0, a0
377 ; RV32ZBA-NEXT:    sh2add a0, a1, a0
378 ; RV32ZBA-NEXT:    ret
379   %c = mul i32 %a, 37
380   ret i32 %c
383 define i32 @mul25(i32 %a) {
384 ; RV32I-LABEL: mul25:
385 ; RV32I:       # %bb.0:
386 ; RV32I-NEXT:    li a1, 25
387 ; RV32I-NEXT:    mul a0, a0, a1
388 ; RV32I-NEXT:    ret
390 ; RV32ZBA-LABEL: mul25:
391 ; RV32ZBA:       # %bb.0:
392 ; RV32ZBA-NEXT:    sh1add a1, a0, a0
393 ; RV32ZBA-NEXT:    sh3add a0, a1, a0
394 ; RV32ZBA-NEXT:    ret
395   %c = mul i32 %a, 25
396   ret i32 %c
399 define i32 @mul41(i32 %a) {
400 ; RV32I-LABEL: mul41:
401 ; RV32I:       # %bb.0:
402 ; RV32I-NEXT:    li a1, 41
403 ; RV32I-NEXT:    mul a0, a0, a1
404 ; RV32I-NEXT:    ret
406 ; RV32ZBA-LABEL: mul41:
407 ; RV32ZBA:       # %bb.0:
408 ; RV32ZBA-NEXT:    sh2add a1, a0, a0
409 ; RV32ZBA-NEXT:    sh3add a0, a1, a0
410 ; RV32ZBA-NEXT:    ret
411   %c = mul i32 %a, 41
412   ret i32 %c
415 define i32 @mul73(i32 %a) {
416 ; RV32I-LABEL: mul73:
417 ; RV32I:       # %bb.0:
418 ; RV32I-NEXT:    li a1, 73
419 ; RV32I-NEXT:    mul a0, a0, a1
420 ; RV32I-NEXT:    ret
422 ; RV32ZBA-LABEL: mul73:
423 ; RV32ZBA:       # %bb.0:
424 ; RV32ZBA-NEXT:    sh3add a1, a0, a0
425 ; RV32ZBA-NEXT:    sh3add a0, a1, a0
426 ; RV32ZBA-NEXT:    ret
427   %c = mul i32 %a, 73
428   ret i32 %c
431 define i32 @mul27(i32 %a) {
432 ; RV32I-LABEL: mul27:
433 ; RV32I:       # %bb.0:
434 ; RV32I-NEXT:    li a1, 27
435 ; RV32I-NEXT:    mul a0, a0, a1
436 ; RV32I-NEXT:    ret
438 ; RV32ZBA-LABEL: mul27:
439 ; RV32ZBA:       # %bb.0:
440 ; RV32ZBA-NEXT:    sh3add a0, a0, a0
441 ; RV32ZBA-NEXT:    sh1add a0, a0, a0
442 ; RV32ZBA-NEXT:    ret
443   %c = mul i32 %a, 27
444   ret i32 %c
447 define i32 @mul45(i32 %a) {
448 ; RV32I-LABEL: mul45:
449 ; RV32I:       # %bb.0:
450 ; RV32I-NEXT:    li a1, 45
451 ; RV32I-NEXT:    mul a0, a0, a1
452 ; RV32I-NEXT:    ret
454 ; RV32ZBA-LABEL: mul45:
455 ; RV32ZBA:       # %bb.0:
456 ; RV32ZBA-NEXT:    sh3add a0, a0, a0
457 ; RV32ZBA-NEXT:    sh2add a0, a0, a0
458 ; RV32ZBA-NEXT:    ret
459   %c = mul i32 %a, 45
460   ret i32 %c
463 define i32 @mul81(i32 %a) {
464 ; RV32I-LABEL: mul81:
465 ; RV32I:       # %bb.0:
466 ; RV32I-NEXT:    li a1, 81
467 ; RV32I-NEXT:    mul a0, a0, a1
468 ; RV32I-NEXT:    ret
470 ; RV32ZBA-LABEL: mul81:
471 ; RV32ZBA:       # %bb.0:
472 ; RV32ZBA-NEXT:    sh3add a0, a0, a0
473 ; RV32ZBA-NEXT:    sh3add a0, a0, a0
474 ; RV32ZBA-NEXT:    ret
475   %c = mul i32 %a, 81
476   ret i32 %c
479 define i32 @mul4098(i32 %a) {
480 ; RV32I-LABEL: mul4098:
481 ; RV32I:       # %bb.0:
482 ; RV32I-NEXT:    slli a1, a0, 1
483 ; RV32I-NEXT:    slli a0, a0, 12
484 ; RV32I-NEXT:    add a0, a0, a1
485 ; RV32I-NEXT:    ret
487 ; RV32ZBA-LABEL: mul4098:
488 ; RV32ZBA:       # %bb.0:
489 ; RV32ZBA-NEXT:    slli a1, a0, 12
490 ; RV32ZBA-NEXT:    sh1add a0, a0, a1
491 ; RV32ZBA-NEXT:    ret
492   %c = mul i32 %a, 4098
493   ret i32 %c
496 define i32 @mul4100(i32 %a) {
497 ; RV32I-LABEL: mul4100:
498 ; RV32I:       # %bb.0:
499 ; RV32I-NEXT:    slli a1, a0, 2
500 ; RV32I-NEXT:    slli a0, a0, 12
501 ; RV32I-NEXT:    add a0, a0, a1
502 ; RV32I-NEXT:    ret
504 ; RV32ZBA-LABEL: mul4100:
505 ; RV32ZBA:       # %bb.0:
506 ; RV32ZBA-NEXT:    slli a1, a0, 12
507 ; RV32ZBA-NEXT:    sh2add a0, a0, a1
508 ; RV32ZBA-NEXT:    ret
509   %c = mul i32 %a, 4100
510   ret i32 %c
513 define i32 @mul4104(i32 %a) {
514 ; RV32I-LABEL: mul4104:
515 ; RV32I:       # %bb.0:
516 ; RV32I-NEXT:    slli a1, a0, 3
517 ; RV32I-NEXT:    slli a0, a0, 12
518 ; RV32I-NEXT:    add a0, a0, a1
519 ; RV32I-NEXT:    ret
521 ; RV32ZBA-LABEL: mul4104:
522 ; RV32ZBA:       # %bb.0:
523 ; RV32ZBA-NEXT:    slli a1, a0, 12
524 ; RV32ZBA-NEXT:    sh3add a0, a0, a1
525 ; RV32ZBA-NEXT:    ret
526   %c = mul i32 %a, 4104
527   ret i32 %c
530 define i32 @add4104(i32 %a) {
531 ; RV32I-LABEL: add4104:
532 ; RV32I:       # %bb.0:
533 ; RV32I-NEXT:    lui a1, 1
534 ; RV32I-NEXT:    addi a1, a1, 8
535 ; RV32I-NEXT:    add a0, a0, a1
536 ; RV32I-NEXT:    ret
538 ; RV32ZBA-LABEL: add4104:
539 ; RV32ZBA:       # %bb.0:
540 ; RV32ZBA-NEXT:    li a1, 1026
541 ; RV32ZBA-NEXT:    sh2add a0, a1, a0
542 ; RV32ZBA-NEXT:    ret
543   %c = add i32 %a, 4104
544   ret i32 %c
547 define i32 @add8208(i32 %a) {
548 ; RV32I-LABEL: add8208:
549 ; RV32I:       # %bb.0:
550 ; RV32I-NEXT:    lui a1, 2
551 ; RV32I-NEXT:    addi a1, a1, 16
552 ; RV32I-NEXT:    add a0, a0, a1
553 ; RV32I-NEXT:    ret
555 ; RV32ZBA-LABEL: add8208:
556 ; RV32ZBA:       # %bb.0:
557 ; RV32ZBA-NEXT:    li a1, 1026
558 ; RV32ZBA-NEXT:    sh3add a0, a1, a0
559 ; RV32ZBA-NEXT:    ret
560   %c = add i32 %a, 8208
561   ret i32 %c
564 define i32 @add8192(i32 %a) {
565 ; CHECK-LABEL: add8192:
566 ; CHECK:       # %bb.0:
567 ; CHECK-NEXT:    lui a1, 2
568 ; CHECK-NEXT:    add a0, a0, a1
569 ; CHECK-NEXT:    ret
570   %c = add i32 %a, 8192
571   ret i32 %c
574 define i32 @addshl_5_6(i32 %a, i32 %b) {
575 ; RV32I-LABEL: addshl_5_6:
576 ; RV32I:       # %bb.0:
577 ; RV32I-NEXT:    slli a0, a0, 5
578 ; RV32I-NEXT:    slli a1, a1, 6
579 ; RV32I-NEXT:    add a0, a0, a1
580 ; RV32I-NEXT:    ret
582 ; RV32ZBA-LABEL: addshl_5_6:
583 ; RV32ZBA:       # %bb.0:
584 ; RV32ZBA-NEXT:    sh1add a0, a1, a0
585 ; RV32ZBA-NEXT:    slli a0, a0, 5
586 ; RV32ZBA-NEXT:    ret
587   %c = shl i32 %a, 5
588   %d = shl i32 %b, 6
589   %e = add i32 %c, %d
590   ret i32 %e
593 define i32 @addshl_5_7(i32 %a, i32 %b) {
594 ; RV32I-LABEL: addshl_5_7:
595 ; RV32I:       # %bb.0:
596 ; RV32I-NEXT:    slli a0, a0, 5
597 ; RV32I-NEXT:    slli a1, a1, 7
598 ; RV32I-NEXT:    add a0, a0, a1
599 ; RV32I-NEXT:    ret
601 ; RV32ZBA-LABEL: addshl_5_7:
602 ; RV32ZBA:       # %bb.0:
603 ; RV32ZBA-NEXT:    sh2add a0, a1, a0
604 ; RV32ZBA-NEXT:    slli a0, a0, 5
605 ; RV32ZBA-NEXT:    ret
606   %c = shl i32 %a, 5
607   %d = shl i32 %b, 7
608   %e = add i32 %c, %d
609   ret i32 %e
612 define i32 @addshl_5_8(i32 %a, i32 %b) {
613 ; RV32I-LABEL: addshl_5_8:
614 ; RV32I:       # %bb.0:
615 ; RV32I-NEXT:    slli a0, a0, 5
616 ; RV32I-NEXT:    slli a1, a1, 8
617 ; RV32I-NEXT:    add a0, a0, a1
618 ; RV32I-NEXT:    ret
620 ; RV32ZBA-LABEL: addshl_5_8:
621 ; RV32ZBA:       # %bb.0:
622 ; RV32ZBA-NEXT:    sh3add a0, a1, a0
623 ; RV32ZBA-NEXT:    slli a0, a0, 5
624 ; RV32ZBA-NEXT:    ret
625   %c = shl i32 %a, 5
626   %d = shl i32 %b, 8
627   %e = add i32 %c, %d
628   ret i32 %e