[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / mul_pow2.ll
blob59ac56f34aa24d9aef8a01e7615ea671a253714b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64-eabi | FileCheck %s
3 ; RUN: llc < %s -mtriple=aarch64-eabi -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=GISEL
5 ; Convert mul x, pow2 to shift.
6 ; Convert mul x, pow2 +/- 1 to shift + add/sub.
7 ; Convert mul x, (pow2 + 1) * pow2 to shift + add + shift.
8 ; Lowering other positive constants are not supported yet.
10 define i32 @test2(i32 %x) {
11 ; CHECK-LABEL: test2:
12 ; CHECK:       // %bb.0:
13 ; CHECK-NEXT:    lsl w0, w0, #1
14 ; CHECK-NEXT:    ret
16 ; GISEL-LABEL: test2:
17 ; GISEL:       // %bb.0:
18 ; GISEL-NEXT:    lsl w0, w0, #1
19 ; GISEL-NEXT:    ret
21   %mul = shl nsw i32 %x, 1
22   ret i32 %mul
25 define i32 @test3(i32 %x) {
26 ; CHECK-LABEL: test3:
27 ; CHECK:       // %bb.0:
28 ; CHECK-NEXT:    add w0, w0, w0, lsl #1
29 ; CHECK-NEXT:    ret
31 ; GISEL-LABEL: test3:
32 ; GISEL:       // %bb.0:
33 ; GISEL-NEXT:    add w0, w0, w0, lsl #1
34 ; GISEL-NEXT:    ret
36   %mul = mul nsw i32 %x, 3
37   ret i32 %mul
40 define i32 @test4(i32 %x) {
41 ; CHECK-LABEL: test4:
42 ; CHECK:       // %bb.0:
43 ; CHECK-NEXT:    lsl w0, w0, #2
44 ; CHECK-NEXT:    ret
46 ; GISEL-LABEL: test4:
47 ; GISEL:       // %bb.0:
48 ; GISEL-NEXT:    lsl w0, w0, #2
49 ; GISEL-NEXT:    ret
51   %mul = shl nsw i32 %x, 2
52   ret i32 %mul
55 define i32 @test5(i32 %x) {
56 ; CHECK-LABEL: test5:
57 ; CHECK:       // %bb.0:
58 ; CHECK-NEXT:    add w0, w0, w0, lsl #2
59 ; CHECK-NEXT:    ret
61 ; GISEL-LABEL: test5:
62 ; GISEL:       // %bb.0:
63 ; GISEL-NEXT:    add w0, w0, w0, lsl #2
64 ; GISEL-NEXT:    ret
67   %mul = mul nsw i32 %x, 5
68   ret i32 %mul
71 define i32 @test6_32b(i32 %x) {
72 ; CHECK-LABEL: test6_32b:
73 ; CHECK:       // %bb.0:
74 ; CHECK-NEXT:    add w8, w0, w0, lsl #1
75 ; CHECK-NEXT:    lsl w0, w8, #1
76 ; CHECK-NEXT:    ret
78 ; GISEL-LABEL: test6_32b:
79 ; GISEL:       // %bb.0:
80 ; GISEL-NEXT:    add w8, w0, w0, lsl #1
81 ; GISEL-NEXT:    lsl w0, w8, #1
82 ; GISEL-NEXT:    ret
84   %mul = mul nsw i32 %x, 6
85   ret i32 %mul
88 define i64 @test6_64b(i64 %x) {
89 ; CHECK-LABEL: test6_64b:
90 ; CHECK:       // %bb.0:
91 ; CHECK-NEXT:    add x8, x0, x0, lsl #1
92 ; CHECK-NEXT:    lsl x0, x8, #1
93 ; CHECK-NEXT:    ret
95 ; GISEL-LABEL: test6_64b:
96 ; GISEL:       // %bb.0:
97 ; GISEL-NEXT:    add x8, x0, x0, lsl #1
98 ; GISEL-NEXT:    lsl x0, x8, #1
99 ; GISEL-NEXT:    ret
101   %mul = mul nsw i64 %x, 6
102   ret i64 %mul
105 ; mul that appears together with add, sub, s(z)ext is not supported to be
106 ; converted to the combination of lsl, add/sub yet.
107 define i64 @test6_umull(i32 %x) {
108 ; CHECK-LABEL: test6_umull:
109 ; CHECK:       // %bb.0:
110 ; CHECK-NEXT:    mov w8, #6
111 ; CHECK-NEXT:    umull x0, w0, w8
112 ; CHECK-NEXT:    ret
114 ; GISEL-LABEL: test6_umull:
115 ; GISEL:       // %bb.0:
116 ; GISEL-NEXT:    mov w8, #6
117 ; GISEL-NEXT:    umull x0, w0, w8
118 ; GISEL-NEXT:    ret
120   %ext = zext i32 %x to i64
121   %mul = mul nsw i64 %ext, 6
122   ret i64 %mul
125 define i64 @test6_smull(i32 %x) {
126 ; CHECK-LABEL: test6_smull:
127 ; CHECK:       // %bb.0:
128 ; CHECK-NEXT:    mov w8, #6
129 ; CHECK-NEXT:    smull x0, w0, w8
130 ; CHECK-NEXT:    ret
132 ; GISEL-LABEL: test6_smull:
133 ; GISEL:       // %bb.0:
134 ; GISEL-NEXT:    mov w8, #6
135 ; GISEL-NEXT:    smull x0, w0, w8
136 ; GISEL-NEXT:    ret
138   %ext = sext i32 %x to i64
139   %mul = mul nsw i64 %ext, 6
140   ret i64 %mul
143 define i32 @test6_madd(i32 %x, i32 %y) {
144 ; CHECK-LABEL: test6_madd:
145 ; CHECK:       // %bb.0:
146 ; CHECK-NEXT:    mov w8, #6
147 ; CHECK-NEXT:    madd w0, w0, w8, w1
148 ; CHECK-NEXT:    ret
150 ; GISEL-LABEL: test6_madd:
151 ; GISEL:       // %bb.0:
152 ; GISEL-NEXT:    mov w8, #6
153 ; GISEL-NEXT:    madd w0, w0, w8, w1
154 ; GISEL-NEXT:    ret
156   %mul = mul nsw i32 %x, 6
157   %add = add i32 %mul, %y
158   ret i32 %add
161 define i32 @test6_msub(i32 %x, i32 %y) {
162 ; CHECK-LABEL: test6_msub:
163 ; CHECK:       // %bb.0:
164 ; CHECK-NEXT:    mov w8, #6
165 ; CHECK-NEXT:    msub w0, w0, w8, w1
166 ; CHECK-NEXT:    ret
168 ; GISEL-LABEL: test6_msub:
169 ; GISEL:       // %bb.0:
170 ; GISEL-NEXT:    mov w8, #6
171 ; GISEL-NEXT:    msub w0, w0, w8, w1
172 ; GISEL-NEXT:    ret
174   %mul = mul nsw i32 %x, 6
175   %sub = sub i32 %y, %mul
176   ret i32 %sub
179 define i64 @test6_umaddl(i32 %x, i64 %y) {
180 ; CHECK-LABEL: test6_umaddl:
181 ; CHECK:       // %bb.0:
182 ; CHECK-NEXT:    mov w8, #6
183 ; CHECK-NEXT:    umaddl x0, w0, w8, x1
184 ; CHECK-NEXT:    ret
186 ; GISEL-LABEL: test6_umaddl:
187 ; GISEL:       // %bb.0:
188 ; GISEL-NEXT:    mov w8, #6
189 ; GISEL-NEXT:    umaddl x0, w0, w8, x1
190 ; GISEL-NEXT:    ret
192   %ext = zext i32 %x to i64
193   %mul = mul nsw i64 %ext, 6
194   %add = add i64 %mul, %y
195   ret i64 %add
198 define i64 @test6_smaddl(i32 %x, i64 %y) {
199 ; CHECK-LABEL: test6_smaddl:
200 ; CHECK:       // %bb.0:
201 ; CHECK-NEXT:    mov w8, #6
202 ; CHECK-NEXT:    smaddl x0, w0, w8, x1
203 ; CHECK-NEXT:    ret
205 ; GISEL-LABEL: test6_smaddl:
206 ; GISEL:       // %bb.0:
207 ; GISEL-NEXT:    mov w8, #6
208 ; GISEL-NEXT:    smaddl x0, w0, w8, x1
209 ; GISEL-NEXT:    ret
211   %ext = sext i32 %x to i64
212   %mul = mul nsw i64 %ext, 6
213   %add = add i64 %mul, %y
214   ret i64 %add
217 define i64 @test6_umsubl(i32 %x, i64 %y) {
218 ; CHECK-LABEL: test6_umsubl:
219 ; CHECK:       // %bb.0:
220 ; CHECK-NEXT:    mov w8, #6
221 ; CHECK-NEXT:    umsubl x0, w0, w8, x1
222 ; CHECK-NEXT:    ret
224 ; GISEL-LABEL: test6_umsubl:
225 ; GISEL:       // %bb.0:
226 ; GISEL-NEXT:    mov w8, #6
227 ; GISEL-NEXT:    umsubl x0, w0, w8, x1
228 ; GISEL-NEXT:    ret
230   %ext = zext i32 %x to i64
231   %mul = mul nsw i64 %ext, 6
232   %sub = sub i64 %y, %mul
233   ret i64 %sub
236 define i64 @test6_smsubl(i32 %x, i64 %y) {
237 ; CHECK-LABEL: test6_smsubl:
238 ; CHECK:       // %bb.0:
239 ; CHECK-NEXT:    mov w8, #6
240 ; CHECK-NEXT:    smsubl x0, w0, w8, x1
241 ; CHECK-NEXT:    ret
243 ; GISEL-LABEL: test6_smsubl:
244 ; GISEL:       // %bb.0:
245 ; GISEL-NEXT:    mov w8, #6
246 ; GISEL-NEXT:    smsubl x0, w0, w8, x1
247 ; GISEL-NEXT:    ret
249   %ext = sext i32 %x to i64
250   %mul = mul nsw i64 %ext, 6
251   %sub = sub i64 %y, %mul
252   ret i64 %sub
255 define i64 @test6_umnegl(i32 %x) {
256 ; CHECK-LABEL: test6_umnegl:
257 ; CHECK:       // %bb.0:
258 ; CHECK-NEXT:    mov w8, #6
259 ; CHECK-NEXT:    umnegl x0, w0, w8
260 ; CHECK-NEXT:    ret
262 ; GISEL-LABEL: test6_umnegl:
263 ; GISEL:       // %bb.0:
264 ; GISEL-NEXT:    mov w8, #6
265 ; GISEL-NEXT:    umnegl x0, w0, w8
266 ; GISEL-NEXT:    ret
268   %ext = zext i32 %x to i64
269   %mul = mul nsw i64 %ext, 6
270   %sub = sub i64 0, %mul
271   ret i64 %sub
274 define i64 @test6_smnegl(i32 %x) {
275 ; CHECK-LABEL: test6_smnegl:
276 ; CHECK:       // %bb.0:
277 ; CHECK-NEXT:    mov w8, #6
278 ; CHECK-NEXT:    smnegl x0, w0, w8
279 ; CHECK-NEXT:    ret
281 ; GISEL-LABEL: test6_smnegl:
282 ; GISEL:       // %bb.0:
283 ; GISEL-NEXT:    mov w8, #6
284 ; GISEL-NEXT:    smnegl x0, w0, w8
285 ; GISEL-NEXT:    ret
287   %ext = sext i32 %x to i64
288   %mul = mul nsw i64 %ext, 6
289   %sub = sub i64 0, %mul
290   ret i64 %sub
293 define i32 @test7(i32 %x) {
294 ; CHECK-LABEL: test7:
295 ; CHECK:       // %bb.0:
296 ; CHECK-NEXT:    lsl w8, w0, #3
297 ; CHECK-NEXT:    sub w0, w8, w0
298 ; CHECK-NEXT:    ret
300 ; GISEL-LABEL: test7:
301 ; GISEL:       // %bb.0:
302 ; GISEL-NEXT:    lsl w8, w0, #3
303 ; GISEL-NEXT:    sub w0, w8, w0
304 ; GISEL-NEXT:    ret
306   %mul = mul nsw i32 %x, 7
307   ret i32 %mul
310 define i32 @test8(i32 %x) {
311 ; CHECK-LABEL: test8:
312 ; CHECK:       // %bb.0:
313 ; CHECK-NEXT:    lsl w0, w0, #3
314 ; CHECK-NEXT:    ret
316 ; GISEL-LABEL: test8:
317 ; GISEL:       // %bb.0:
318 ; GISEL-NEXT:    lsl w0, w0, #3
319 ; GISEL-NEXT:    ret
321   %mul = shl nsw i32 %x, 3
322   ret i32 %mul
325 define i32 @test9(i32 %x) {
326 ; CHECK-LABEL: test9:
327 ; CHECK:       // %bb.0:
328 ; CHECK-NEXT:    add w0, w0, w0, lsl #3
329 ; CHECK-NEXT:    ret
331 ; GISEL-LABEL: test9:
332 ; GISEL:       // %bb.0:
333 ; GISEL-NEXT:    add w0, w0, w0, lsl #3
334 ; GISEL-NEXT:    ret
336   %mul = mul nsw i32 %x, 9
337   ret i32 %mul
340 define i32 @test10(i32 %x) {
341 ; CHECK-LABEL: test10:
342 ; CHECK:       // %bb.0:
343 ; CHECK-NEXT:    add w8, w0, w0, lsl #2
344 ; CHECK-NEXT:    lsl w0, w8, #1
345 ; CHECK-NEXT:    ret
347 ; GISEL-LABEL: test10:
348 ; GISEL:       // %bb.0:
349 ; GISEL-NEXT:    add w8, w0, w0, lsl #2
350 ; GISEL-NEXT:    lsl w0, w8, #1
351 ; GISEL-NEXT:    ret
353   %mul = mul nsw i32 %x, 10
354   ret i32 %mul
357 define i32 @test11(i32 %x) {
358 ; CHECK-LABEL: test11:
359 ; CHECK:       // %bb.0:
360 ; CHECK-NEXT:    mov w8, #11
361 ; CHECK-NEXT:    mul w0, w0, w8
362 ; CHECK-NEXT:    ret
364 ; GISEL-LABEL: test11:
365 ; GISEL:       // %bb.0:
366 ; GISEL-NEXT:    mov w8, #11
367 ; GISEL-NEXT:    mul w0, w0, w8
368 ; GISEL-NEXT:    ret
370   %mul = mul nsw i32 %x, 11
371   ret i32 %mul
374 define i32 @test12(i32 %x) {
375 ; CHECK-LABEL: test12:
376 ; CHECK:       // %bb.0:
377 ; CHECK-NEXT:    add w8, w0, w0, lsl #1
378 ; CHECK-NEXT:    lsl w0, w8, #2
379 ; CHECK-NEXT:    ret
381 ; GISEL-LABEL: test12:
382 ; GISEL:       // %bb.0:
383 ; GISEL-NEXT:    add w8, w0, w0, lsl #1
384 ; GISEL-NEXT:    lsl w0, w8, #2
385 ; GISEL-NEXT:    ret
387   %mul = mul nsw i32 %x, 12
388   ret i32 %mul
391 define i32 @test13(i32 %x) {
392 ; CHECK-LABEL: test13:
393 ; CHECK:       // %bb.0:
394 ; CHECK-NEXT:    mov w8, #13
395 ; CHECK-NEXT:    mul w0, w0, w8
396 ; CHECK-NEXT:    ret
398 ; GISEL-LABEL: test13:
399 ; GISEL:       // %bb.0:
400 ; GISEL-NEXT:    mov w8, #13
401 ; GISEL-NEXT:    mul w0, w0, w8
402 ; GISEL-NEXT:    ret
404   %mul = mul nsw i32 %x, 13
405   ret i32 %mul
408 define i32 @test14(i32 %x) {
409 ; CHECK-LABEL: test14:
410 ; CHECK:       // %bb.0:
411 ; CHECK-NEXT:    mov w8, #14
412 ; CHECK-NEXT:    mul w0, w0, w8
413 ; CHECK-NEXT:    ret
415 ; GISEL-LABEL: test14:
416 ; GISEL:       // %bb.0:
417 ; GISEL-NEXT:    mov w8, #14
418 ; GISEL-NEXT:    mul w0, w0, w8
419 ; GISEL-NEXT:    ret
421   %mul = mul nsw i32 %x, 14
422   ret i32 %mul
425 define i32 @test15(i32 %x) {
426 ; CHECK-LABEL: test15:
427 ; CHECK:       // %bb.0:
428 ; CHECK-NEXT:    lsl w8, w0, #4
429 ; CHECK-NEXT:    sub w0, w8, w0
430 ; CHECK-NEXT:    ret
432 ; GISEL-LABEL: test15:
433 ; GISEL:       // %bb.0:
434 ; GISEL-NEXT:    lsl w8, w0, #4
435 ; GISEL-NEXT:    sub w0, w8, w0
436 ; GISEL-NEXT:    ret
438   %mul = mul nsw i32 %x, 15
439   ret i32 %mul
442 define i32 @test16(i32 %x) {
443 ; CHECK-LABEL: test16:
444 ; CHECK:       // %bb.0:
445 ; CHECK-NEXT:    lsl w0, w0, #4
446 ; CHECK-NEXT:    ret
448 ; GISEL-LABEL: test16:
449 ; GISEL:       // %bb.0:
450 ; GISEL-NEXT:    lsl w0, w0, #4
451 ; GISEL-NEXT:    ret
453   %mul = mul nsw i32 %x, 16
454   ret i32 %mul
457 ; Convert mul x, -pow2 to shift.
458 ; Convert mul x, -(pow2 +/- 1) to shift + add/sub.
459 ; Lowering other negative constants are not supported yet.
461 define i32 @ntest2(i32 %x) {
462 ; CHECK-LABEL: ntest2:
463 ; CHECK:       // %bb.0:
464 ; CHECK-NEXT:    neg w0, w0, lsl #1
465 ; CHECK-NEXT:    ret
467 ; GISEL-LABEL: ntest2:
468 ; GISEL:       // %bb.0:
469 ; GISEL-NEXT:    mov w8, #-2
470 ; GISEL-NEXT:    mul w0, w0, w8
471 ; GISEL-NEXT:    ret
473   %mul = mul nsw i32 %x, -2
474   ret i32 %mul
477 define i32 @ntest3(i32 %x) {
478 ; CHECK-LABEL: ntest3:
479 ; CHECK:       // %bb.0:
480 ; CHECK-NEXT:    sub w0, w0, w0, lsl #2
481 ; CHECK-NEXT:    ret
483 ; GISEL-LABEL: ntest3:
484 ; GISEL:       // %bb.0:
485 ; GISEL-NEXT:    sub w0, w0, w0, lsl #2
486 ; GISEL-NEXT:    ret
488   %mul = mul nsw i32 %x, -3
489   ret i32 %mul
492 define i32 @ntest4(i32 %x) {
493 ; CHECK-LABEL: ntest4:
494 ; CHECK:       // %bb.0:
495 ; CHECK-NEXT:    neg w0, w0, lsl #2
496 ; CHECK-NEXT:    ret
498 ; GISEL-LABEL: ntest4:
499 ; GISEL:       // %bb.0:
500 ; GISEL-NEXT:    mov w8, #-4
501 ; GISEL-NEXT:    mul w0, w0, w8
502 ; GISEL-NEXT:    ret
504   %mul = mul nsw i32 %x, -4
505   ret i32 %mul
508 define i32 @ntest5(i32 %x) {
509 ; CHECK-LABEL: ntest5:
510 ; CHECK:       // %bb.0:
511 ; CHECK-NEXT:    add w8, w0, w0, lsl #2
512 ; CHECK-NEXT:    neg w0, w8
513 ; CHECK-NEXT:    ret
515 ; GISEL-LABEL: ntest5:
516 ; GISEL:       // %bb.0:
517 ; GISEL-NEXT:    add w8, w0, w0, lsl #2
518 ; GISEL-NEXT:    neg w0, w8
519 ; GISEL-NEXT:    ret
520   %mul = mul nsw i32 %x, -5
521   ret i32 %mul
524 define i32 @ntest6(i32 %x) {
525 ; CHECK-LABEL: ntest6:
526 ; CHECK:       // %bb.0:
527 ; CHECK-NEXT:    mov w8, #-6
528 ; CHECK-NEXT:    mul w0, w0, w8
529 ; CHECK-NEXT:    ret
531 ; GISEL-LABEL: ntest6:
532 ; GISEL:       // %bb.0:
533 ; GISEL-NEXT:    mov w8, #-6
534 ; GISEL-NEXT:    mul w0, w0, w8
535 ; GISEL-NEXT:    ret
537   %mul = mul nsw i32 %x, -6
538   ret i32 %mul
541 define i32 @ntest7(i32 %x) {
542 ; CHECK-LABEL: ntest7:
543 ; CHECK:       // %bb.0:
544 ; CHECK-NEXT:    sub w0, w0, w0, lsl #3
545 ; CHECK-NEXT:    ret
547 ; GISEL-LABEL: ntest7:
548 ; GISEL:       // %bb.0:
549 ; GISEL-NEXT:    sub w0, w0, w0, lsl #3
550 ; GISEL-NEXT:    ret
552   %mul = mul nsw i32 %x, -7
553   ret i32 %mul
556 define i32 @ntest8(i32 %x) {
557 ; CHECK-LABEL: ntest8:
558 ; CHECK:       // %bb.0:
559 ; CHECK-NEXT:    neg w0, w0, lsl #3
560 ; CHECK-NEXT:    ret
562 ; GISEL-LABEL: ntest8:
563 ; GISEL:       // %bb.0:
564 ; GISEL-NEXT:    mov w8, #-8
565 ; GISEL-NEXT:    mul w0, w0, w8
566 ; GISEL-NEXT:    ret
568   %mul = mul nsw i32 %x, -8
569   ret i32 %mul
572 define i32 @ntest9(i32 %x) {
573 ; CHECK-LABEL: ntest9:
574 ; CHECK:       // %bb.0:
575 ; CHECK-NEXT:    add w8, w0, w0, lsl #3
576 ; CHECK-NEXT:    neg w0, w8
577 ; CHECK-NEXT:    ret
579 ; GISEL-LABEL: ntest9:
580 ; GISEL:       // %bb.0:
581 ; GISEL-NEXT:    add w8, w0, w0, lsl #3
582 ; GISEL-NEXT:    neg w0, w8
583 ; GISEL-NEXT:    ret
585   %mul = mul nsw i32 %x, -9
586   ret i32 %mul
589 define i32 @ntest10(i32 %x) {
590 ; CHECK-LABEL: ntest10:
591 ; CHECK:       // %bb.0:
592 ; CHECK-NEXT:    mov w8, #-10
593 ; CHECK-NEXT:    mul w0, w0, w8
594 ; CHECK-NEXT:    ret
596 ; GISEL-LABEL: ntest10:
597 ; GISEL:       // %bb.0:
598 ; GISEL-NEXT:    mov w8, #-10
599 ; GISEL-NEXT:    mul w0, w0, w8
600 ; GISEL-NEXT:    ret
602   %mul = mul nsw i32 %x, -10
603   ret i32 %mul
606 define i32 @ntest11(i32 %x) {
607 ; CHECK-LABEL: ntest11:
608 ; CHECK:       // %bb.0:
609 ; CHECK-NEXT:    mov w8, #-11
610 ; CHECK-NEXT:    mul w0, w0, w8
611 ; CHECK-NEXT:    ret
613 ; GISEL-LABEL: ntest11:
614 ; GISEL:       // %bb.0:
615 ; GISEL-NEXT:    mov w8, #-11
616 ; GISEL-NEXT:    mul w0, w0, w8
617 ; GISEL-NEXT:    ret
619   %mul = mul nsw i32 %x, -11
620   ret i32 %mul
623 define i32 @ntest12(i32 %x) {
624 ; CHECK-LABEL: ntest12:
625 ; CHECK:       // %bb.0:
626 ; CHECK-NEXT:    mov w8, #-12
627 ; CHECK-NEXT:    mul w0, w0, w8
628 ; CHECK-NEXT:    ret
630 ; GISEL-LABEL: ntest12:
631 ; GISEL:       // %bb.0:
632 ; GISEL-NEXT:    mov w8, #-12
633 ; GISEL-NEXT:    mul w0, w0, w8
634 ; GISEL-NEXT:    ret
636   %mul = mul nsw i32 %x, -12
637   ret i32 %mul
640 define i32 @ntest13(i32 %x) {
641 ; CHECK-LABEL: ntest13:
642 ; CHECK:       // %bb.0:
643 ; CHECK-NEXT:    mov w8, #-13
644 ; CHECK-NEXT:    mul w0, w0, w8
645 ; CHECK-NEXT:    ret
647 ; GISEL-LABEL: ntest13:
648 ; GISEL:       // %bb.0:
649 ; GISEL-NEXT:    mov w8, #-13
650 ; GISEL-NEXT:    mul w0, w0, w8
651 ; GISEL-NEXT:    ret
652   %mul = mul nsw i32 %x, -13
653   ret i32 %mul
656 define i32 @ntest14(i32 %x) {
657 ; CHECK-LABEL: ntest14:
658 ; CHECK:       // %bb.0:
659 ; CHECK-NEXT:    mov w8, #-14
660 ; CHECK-NEXT:    mul w0, w0, w8
661 ; CHECK-NEXT:    ret
663 ; GISEL-LABEL: ntest14:
664 ; GISEL:       // %bb.0:
665 ; GISEL-NEXT:    mov w8, #-14
666 ; GISEL-NEXT:    mul w0, w0, w8
667 ; GISEL-NEXT:    ret
669   %mul = mul nsw i32 %x, -14
670   ret i32 %mul
673 define i32 @ntest15(i32 %x) {
674 ; CHECK-LABEL: ntest15:
675 ; CHECK:       // %bb.0:
676 ; CHECK-NEXT:    sub w0, w0, w0, lsl #4
677 ; CHECK-NEXT:    ret
679 ; GISEL-LABEL: ntest15:
680 ; GISEL:       // %bb.0:
681 ; GISEL-NEXT:    sub w0, w0, w0, lsl #4
682 ; GISEL-NEXT:    ret
684   %mul = mul nsw i32 %x, -15
685   ret i32 %mul
688 define i32 @ntest16(i32 %x) {
689 ; CHECK-LABEL: ntest16:
690 ; CHECK:       // %bb.0:
691 ; CHECK-NEXT:    neg w0, w0, lsl #4
692 ; CHECK-NEXT:    ret
694 ; GISEL-LABEL: ntest16:
695 ; GISEL:       // %bb.0:
696 ; GISEL-NEXT:    mov w8, #-16
697 ; GISEL-NEXT:    mul w0, w0, w8
698 ; GISEL-NEXT:    ret
700   %mul = mul nsw i32 %x, -16
701   ret i32 %mul