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) {
13 ; CHECK-NEXT: lsl w0, w0, #1
18 ; GISEL-NEXT: lsl w0, w0, #1
21 %mul = shl nsw i32 %x, 1
25 define i32 @test3(i32 %x) {
28 ; CHECK-NEXT: add w0, w0, w0, lsl #1
33 ; GISEL-NEXT: add w0, w0, w0, lsl #1
36 %mul = mul nsw i32 %x, 3
40 define i32 @test4(i32 %x) {
43 ; CHECK-NEXT: lsl w0, w0, #2
48 ; GISEL-NEXT: lsl w0, w0, #2
51 %mul = shl nsw i32 %x, 2
55 define i32 @test5(i32 %x) {
58 ; CHECK-NEXT: add w0, w0, w0, lsl #2
63 ; GISEL-NEXT: add w0, w0, w0, lsl #2
67 %mul = mul nsw i32 %x, 5
71 define i32 @test6_32b(i32 %x) {
72 ; CHECK-LABEL: test6_32b:
74 ; CHECK-NEXT: add w8, w0, w0, lsl #1
75 ; CHECK-NEXT: lsl w0, w8, #1
78 ; GISEL-LABEL: test6_32b:
80 ; GISEL-NEXT: add w8, w0, w0, lsl #1
81 ; GISEL-NEXT: lsl w0, w8, #1
84 %mul = mul nsw i32 %x, 6
88 define i64 @test6_64b(i64 %x) {
89 ; CHECK-LABEL: test6_64b:
91 ; CHECK-NEXT: add x8, x0, x0, lsl #1
92 ; CHECK-NEXT: lsl x0, x8, #1
95 ; GISEL-LABEL: test6_64b:
97 ; GISEL-NEXT: add x8, x0, x0, lsl #1
98 ; GISEL-NEXT: lsl x0, x8, #1
101 %mul = mul nsw i64 %x, 6
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:
110 ; CHECK-NEXT: mov w8, #6 // =0x6
111 ; CHECK-NEXT: umull x0, w0, w8
114 ; GISEL-LABEL: test6_umull:
116 ; GISEL-NEXT: mov w8, #6 // =0x6
117 ; GISEL-NEXT: umull x0, w0, w8
120 %ext = zext i32 %x to i64
121 %mul = mul nsw i64 %ext, 6
125 define i64 @test6_smull(i32 %x) {
126 ; CHECK-LABEL: test6_smull:
128 ; CHECK-NEXT: mov w8, #6 // =0x6
129 ; CHECK-NEXT: smull x0, w0, w8
132 ; GISEL-LABEL: test6_smull:
134 ; GISEL-NEXT: mov w8, #6 // =0x6
135 ; GISEL-NEXT: smull x0, w0, w8
138 %ext = sext i32 %x to i64
139 %mul = mul nsw i64 %ext, 6
143 define i32 @test6_madd(i32 %x, i32 %y) {
144 ; CHECK-LABEL: test6_madd:
146 ; CHECK-NEXT: mov w8, #6 // =0x6
147 ; CHECK-NEXT: madd w0, w0, w8, w1
150 ; GISEL-LABEL: test6_madd:
152 ; GISEL-NEXT: mov w8, #6 // =0x6
153 ; GISEL-NEXT: madd w0, w0, w8, w1
156 %mul = mul nsw i32 %x, 6
157 %add = add i32 %mul, %y
161 define i32 @test6_msub(i32 %x, i32 %y) {
162 ; CHECK-LABEL: test6_msub:
164 ; CHECK-NEXT: mov w8, #6 // =0x6
165 ; CHECK-NEXT: msub w0, w0, w8, w1
168 ; GISEL-LABEL: test6_msub:
170 ; GISEL-NEXT: mov w8, #6 // =0x6
171 ; GISEL-NEXT: msub w0, w0, w8, w1
174 %mul = mul nsw i32 %x, 6
175 %sub = sub i32 %y, %mul
179 define i64 @test6_umaddl(i32 %x, i64 %y) {
180 ; CHECK-LABEL: test6_umaddl:
182 ; CHECK-NEXT: mov w8, #6 // =0x6
183 ; CHECK-NEXT: umaddl x0, w0, w8, x1
186 ; GISEL-LABEL: test6_umaddl:
188 ; GISEL-NEXT: mov w8, #6 // =0x6
189 ; GISEL-NEXT: umaddl x0, w0, w8, x1
192 %ext = zext i32 %x to i64
193 %mul = mul nsw i64 %ext, 6
194 %add = add i64 %mul, %y
198 define i64 @test6_smaddl(i32 %x, i64 %y) {
199 ; CHECK-LABEL: test6_smaddl:
201 ; CHECK-NEXT: mov w8, #6 // =0x6
202 ; CHECK-NEXT: smaddl x0, w0, w8, x1
205 ; GISEL-LABEL: test6_smaddl:
207 ; GISEL-NEXT: mov w8, #6 // =0x6
208 ; GISEL-NEXT: smaddl x0, w0, w8, x1
211 %ext = sext i32 %x to i64
212 %mul = mul nsw i64 %ext, 6
213 %add = add i64 %mul, %y
217 define i64 @test6_umsubl(i32 %x, i64 %y) {
218 ; CHECK-LABEL: test6_umsubl:
220 ; CHECK-NEXT: mov w8, #6 // =0x6
221 ; CHECK-NEXT: umsubl x0, w0, w8, x1
224 ; GISEL-LABEL: test6_umsubl:
226 ; GISEL-NEXT: mov w8, #6 // =0x6
227 ; GISEL-NEXT: umsubl x0, w0, w8, x1
230 %ext = zext i32 %x to i64
231 %mul = mul nsw i64 %ext, 6
232 %sub = sub i64 %y, %mul
236 define i64 @test6_smsubl(i32 %x, i64 %y) {
237 ; CHECK-LABEL: test6_smsubl:
239 ; CHECK-NEXT: mov w8, #6 // =0x6
240 ; CHECK-NEXT: smsubl x0, w0, w8, x1
243 ; GISEL-LABEL: test6_smsubl:
245 ; GISEL-NEXT: mov w8, #6 // =0x6
246 ; GISEL-NEXT: smsubl x0, w0, w8, x1
249 %ext = sext i32 %x to i64
250 %mul = mul nsw i64 %ext, 6
251 %sub = sub i64 %y, %mul
255 define i64 @test6_umnegl(i32 %x) {
256 ; CHECK-LABEL: test6_umnegl:
258 ; CHECK-NEXT: mov w8, #6 // =0x6
259 ; CHECK-NEXT: umnegl x0, w0, w8
262 ; GISEL-LABEL: test6_umnegl:
264 ; GISEL-NEXT: mov w8, #6 // =0x6
265 ; GISEL-NEXT: umnegl x0, w0, w8
268 %ext = zext i32 %x to i64
269 %mul = mul nsw i64 %ext, 6
270 %sub = sub i64 0, %mul
274 define i64 @test6_smnegl(i32 %x) {
275 ; CHECK-LABEL: test6_smnegl:
277 ; CHECK-NEXT: mov w8, #6 // =0x6
278 ; CHECK-NEXT: smnegl x0, w0, w8
281 ; GISEL-LABEL: test6_smnegl:
283 ; GISEL-NEXT: mov w8, #6 // =0x6
284 ; GISEL-NEXT: smnegl x0, w0, w8
287 %ext = sext i32 %x to i64
288 %mul = mul nsw i64 %ext, 6
289 %sub = sub i64 0, %mul
293 ; We may hoist the "mov" instructions out of a loop
294 define i32 @mull6_sub(i32 %x) {
295 ; CHECK-LABEL: mull6_sub:
297 ; CHECK-NEXT: mov w8, #6 // =0x6
298 ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
299 ; CHECK-NEXT: madd w0, w0, w8, w9
302 ; GISEL-LABEL: mull6_sub:
304 ; GISEL-NEXT: mov w8, #6 // =0x6
305 ; GISEL-NEXT: mov w9, #-1 // =0xffffffff
306 ; GISEL-NEXT: madd w0, w0, w8, w9
308 %mul = mul nsw i32 %x, 6
309 %sub = add nsw i32 %mul, -1
313 define i64 @mull6_sub_orr(i64 %x) {
314 ; CHECK-LABEL: mull6_sub_orr:
316 ; CHECK-NEXT: mov w8, #6 // =0x6
317 ; CHECK-NEXT: mov x9, #16773120 // =0xfff000
318 ; CHECK-NEXT: madd x0, x0, x8, x9
321 ; GISEL-LABEL: mull6_sub_orr:
323 ; GISEL-NEXT: mov w8, #6 // =0x6
324 ; GISEL-NEXT: mov x9, #16773120 // =0xfff000
325 ; GISEL-NEXT: madd x0, x0, x8, x9
327 %mul = mul nsw i64 %x, 6
328 %sub = add nsw i64 %mul, 16773120
332 define i32 @test7(i32 %x) {
333 ; CHECK-LABEL: test7:
335 ; CHECK-NEXT: lsl w8, w0, #3
336 ; CHECK-NEXT: sub w0, w8, w0
339 ; GISEL-LABEL: test7:
341 ; GISEL-NEXT: lsl w8, w0, #3
342 ; GISEL-NEXT: sub w0, w8, w0
345 %mul = mul nsw i32 %x, 7
349 define i32 @test8(i32 %x) {
350 ; CHECK-LABEL: test8:
352 ; CHECK-NEXT: lsl w0, w0, #3
355 ; GISEL-LABEL: test8:
357 ; GISEL-NEXT: lsl w0, w0, #3
360 %mul = shl nsw i32 %x, 3
364 define i32 @test9(i32 %x) {
365 ; CHECK-LABEL: test9:
367 ; CHECK-NEXT: add w0, w0, w0, lsl #3
370 ; GISEL-LABEL: test9:
372 ; GISEL-NEXT: add w0, w0, w0, lsl #3
375 %mul = mul nsw i32 %x, 9
379 define i32 @test10(i32 %x) {
380 ; CHECK-LABEL: test10:
382 ; CHECK-NEXT: add w8, w0, w0, lsl #2
383 ; CHECK-NEXT: lsl w0, w8, #1
386 ; GISEL-LABEL: test10:
388 ; GISEL-NEXT: add w8, w0, w0, lsl #2
389 ; GISEL-NEXT: lsl w0, w8, #1
392 %mul = mul nsw i32 %x, 10
396 define i32 @test11(i32 %x) {
397 ; CHECK-LABEL: test11:
399 ; CHECK-NEXT: mov w8, #11 // =0xb
400 ; CHECK-NEXT: mul w0, w0, w8
403 ; GISEL-LABEL: test11:
405 ; GISEL-NEXT: mov w8, #11 // =0xb
406 ; GISEL-NEXT: mul w0, w0, w8
409 %mul = mul nsw i32 %x, 11
413 define i32 @test12(i32 %x) {
414 ; CHECK-LABEL: test12:
416 ; CHECK-NEXT: add w8, w0, w0, lsl #1
417 ; CHECK-NEXT: lsl w0, w8, #2
420 ; GISEL-LABEL: test12:
422 ; GISEL-NEXT: add w8, w0, w0, lsl #1
423 ; GISEL-NEXT: lsl w0, w8, #2
426 %mul = mul nsw i32 %x, 12
430 define i32 @test13(i32 %x) {
431 ; CHECK-LABEL: test13:
433 ; CHECK-NEXT: mov w8, #13 // =0xd
434 ; CHECK-NEXT: mul w0, w0, w8
437 ; GISEL-LABEL: test13:
439 ; GISEL-NEXT: mov w8, #13 // =0xd
440 ; GISEL-NEXT: mul w0, w0, w8
443 %mul = mul nsw i32 %x, 13
447 define i32 @test14(i32 %x) {
448 ; CHECK-LABEL: test14:
450 ; CHECK-NEXT: lsl w8, w0, #4
451 ; CHECK-NEXT: sub w0, w8, w0, lsl #1
454 ; GISEL-LABEL: test14:
456 ; GISEL-NEXT: mov w8, #14 // =0xe
457 ; GISEL-NEXT: mul w0, w0, w8
460 %mul = mul nsw i32 %x, 14
464 define i32 @test15(i32 %x) {
465 ; CHECK-LABEL: test15:
467 ; CHECK-NEXT: lsl w8, w0, #4
468 ; CHECK-NEXT: sub w0, w8, w0
471 ; GISEL-LABEL: test15:
473 ; GISEL-NEXT: lsl w8, w0, #4
474 ; GISEL-NEXT: sub w0, w8, w0
477 %mul = mul nsw i32 %x, 15
481 define i32 @test16(i32 %x) {
482 ; CHECK-LABEL: test16:
484 ; CHECK-NEXT: lsl w0, w0, #4
487 ; GISEL-LABEL: test16:
489 ; GISEL-NEXT: lsl w0, w0, #4
492 %mul = mul nsw i32 %x, 16
496 define i32 @test25_fast_shift(i32 %x) "target-features"="+alu-lsl-fast" {
497 ; CHECK-LABEL: test25_fast_shift:
499 ; CHECK-NEXT: add w8, w0, w0, lsl #2
500 ; CHECK-NEXT: add w0, w8, w8, lsl #2
503 ; GISEL-LABEL: test25_fast_shift:
505 ; GISEL-NEXT: mov w8, #25 // =0x19
506 ; GISEL-NEXT: mul w0, w0, w8
509 %mul = mul nsw i32 %x, 25 ; 25 = (1+4)*(1+4)
513 define i32 @test45_fast_shift(i32 %x) "target-features"="+alu-lsl-fast" {
514 ; CHECK-LABEL: test45_fast_shift:
516 ; CHECK-NEXT: add w8, w0, w0, lsl #2
517 ; CHECK-NEXT: add w0, w8, w8, lsl #3
520 ; GISEL-LABEL: test45_fast_shift:
522 ; GISEL-NEXT: mov w8, #45 // =0x2d
523 ; GISEL-NEXT: mul w0, w0, w8
526 %mul = mul nsw i32 %x, 45 ; 45 = (1+4)*(1+8)
530 ; Negative test: Keep MUL as don't have the feature LSLFast
531 define i32 @test45(i32 %x) {
532 ; CHECK-LABEL: test45:
534 ; CHECK-NEXT: mov w8, #45 // =0x2d
535 ; CHECK-NEXT: mul w0, w0, w8
538 ; GISEL-LABEL: test45:
540 ; GISEL-NEXT: mov w8, #45 // =0x2d
541 ; GISEL-NEXT: mul w0, w0, w8
544 %mul = mul nsw i32 %x, 45 ; 45 = (1+4)*(1+8)
548 ; Negative test: The shift amount 4 larger than 3
549 define i32 @test85_fast_shift(i32 %x) "target-features"="+alu-lsl-fast" {
550 ; CHECK-LABEL: test85_fast_shift:
552 ; CHECK-NEXT: mov w8, #85 // =0x55
553 ; CHECK-NEXT: mul w0, w0, w8
556 ; GISEL-LABEL: test85_fast_shift:
558 ; GISEL-NEXT: mov w8, #85 // =0x55
559 ; GISEL-NEXT: mul w0, w0, w8
562 %mul = mul nsw i32 %x, 85 ; 85 = (1+4)*(1+16)
566 ; Negative test: The shift amount 5 larger than 3
567 define i32 @test297_fast_shift(i32 %x) "target-features"="+alu-lsl-fast" {
568 ; CHECK-LABEL: test297_fast_shift:
570 ; CHECK-NEXT: mov w8, #297 // =0x129
571 ; CHECK-NEXT: mul w0, w0, w8
574 ; GISEL-LABEL: test297_fast_shift:
576 ; GISEL-NEXT: mov w8, #297 // =0x129
577 ; GISEL-NEXT: mul w0, w0, w8
580 %mul = mul nsw i32 %x, 297 ; 297 = (1+8)*(1+32)
584 ; Convert mul x, -pow2 to shift.
585 ; Convert mul x, -(pow2 +/- 1) to shift + add/sub.
586 ; Lowering other negative constants are not supported yet.
588 define i32 @ntest2(i32 %x) {
589 ; CHECK-LABEL: ntest2:
591 ; CHECK-NEXT: neg w0, w0, lsl #1
594 ; GISEL-LABEL: ntest2:
596 ; GISEL-NEXT: mov w8, #-2 // =0xfffffffe
597 ; GISEL-NEXT: mul w0, w0, w8
600 %mul = mul nsw i32 %x, -2
604 define i32 @ntest3(i32 %x) {
605 ; CHECK-LABEL: ntest3:
607 ; CHECK-NEXT: sub w0, w0, w0, lsl #2
610 ; GISEL-LABEL: ntest3:
612 ; GISEL-NEXT: sub w0, w0, w0, lsl #2
615 %mul = mul nsw i32 %x, -3
619 define i32 @ntest4(i32 %x) {
620 ; CHECK-LABEL: ntest4:
622 ; CHECK-NEXT: neg w0, w0, lsl #2
625 ; GISEL-LABEL: ntest4:
627 ; GISEL-NEXT: mov w8, #-4 // =0xfffffffc
628 ; GISEL-NEXT: mul w0, w0, w8
631 %mul = mul nsw i32 %x, -4
635 define i32 @ntest5(i32 %x) {
636 ; CHECK-LABEL: ntest5:
638 ; CHECK-NEXT: add w8, w0, w0, lsl #2
639 ; CHECK-NEXT: neg w0, w8
642 ; GISEL-LABEL: ntest5:
644 ; GISEL-NEXT: add w8, w0, w0, lsl #2
645 ; GISEL-NEXT: neg w0, w8
647 %mul = mul nsw i32 %x, -5
651 define i32 @ntest6(i32 %x) {
652 ; CHECK-LABEL: ntest6:
654 ; CHECK-NEXT: lsl w8, w0, #1
655 ; CHECK-NEXT: sub w0, w8, w0, lsl #3
658 ; GISEL-LABEL: ntest6:
660 ; GISEL-NEXT: mov w8, #-6 // =0xfffffffa
661 ; GISEL-NEXT: mul w0, w0, w8
664 %mul = mul nsw i32 %x, -6
668 define i32 @ntest7(i32 %x) {
669 ; CHECK-LABEL: ntest7:
671 ; CHECK-NEXT: sub w0, w0, w0, lsl #3
674 ; GISEL-LABEL: ntest7:
676 ; GISEL-NEXT: sub w0, w0, w0, lsl #3
679 %mul = mul nsw i32 %x, -7
683 define i32 @ntest8(i32 %x) {
684 ; CHECK-LABEL: ntest8:
686 ; CHECK-NEXT: neg w0, w0, lsl #3
689 ; GISEL-LABEL: ntest8:
691 ; GISEL-NEXT: mov w8, #-8 // =0xfffffff8
692 ; GISEL-NEXT: mul w0, w0, w8
695 %mul = mul nsw i32 %x, -8
699 define i32 @ntest9(i32 %x) {
700 ; CHECK-LABEL: ntest9:
702 ; CHECK-NEXT: add w8, w0, w0, lsl #3
703 ; CHECK-NEXT: neg w0, w8
706 ; GISEL-LABEL: ntest9:
708 ; GISEL-NEXT: add w8, w0, w0, lsl #3
709 ; GISEL-NEXT: neg w0, w8
712 %mul = mul nsw i32 %x, -9
716 define i32 @ntest10(i32 %x) {
717 ; CHECK-LABEL: ntest10:
719 ; CHECK-NEXT: mov w8, #-10 // =0xfffffff6
720 ; CHECK-NEXT: mul w0, w0, w8
723 ; GISEL-LABEL: ntest10:
725 ; GISEL-NEXT: mov w8, #-10 // =0xfffffff6
726 ; GISEL-NEXT: mul w0, w0, w8
729 %mul = mul nsw i32 %x, -10
733 define i32 @ntest11(i32 %x) {
734 ; CHECK-LABEL: ntest11:
736 ; CHECK-NEXT: mov w8, #-11 // =0xfffffff5
737 ; CHECK-NEXT: mul w0, w0, w8
740 ; GISEL-LABEL: ntest11:
742 ; GISEL-NEXT: mov w8, #-11 // =0xfffffff5
743 ; GISEL-NEXT: mul w0, w0, w8
746 %mul = mul nsw i32 %x, -11
750 define i32 @ntest12(i32 %x) {
751 ; CHECK-LABEL: ntest12:
753 ; CHECK-NEXT: lsl w8, w0, #2
754 ; CHECK-NEXT: sub w0, w8, w0, lsl #4
757 ; GISEL-LABEL: ntest12:
759 ; GISEL-NEXT: mov w8, #-12 // =0xfffffff4
760 ; GISEL-NEXT: mul w0, w0, w8
763 %mul = mul nsw i32 %x, -12
767 define i32 @ntest13(i32 %x) {
768 ; CHECK-LABEL: ntest13:
770 ; CHECK-NEXT: mov w8, #-13 // =0xfffffff3
771 ; CHECK-NEXT: mul w0, w0, w8
774 ; GISEL-LABEL: ntest13:
776 ; GISEL-NEXT: mov w8, #-13 // =0xfffffff3
777 ; GISEL-NEXT: mul w0, w0, w8
779 %mul = mul nsw i32 %x, -13
783 define i32 @ntest14(i32 %x) {
784 ; CHECK-LABEL: ntest14:
786 ; CHECK-NEXT: lsl w8, w0, #1
787 ; CHECK-NEXT: sub w0, w8, w0, lsl #4
790 ; GISEL-LABEL: ntest14:
792 ; GISEL-NEXT: mov w8, #-14 // =0xfffffff2
793 ; GISEL-NEXT: mul w0, w0, w8
796 %mul = mul nsw i32 %x, -14
800 define i32 @ntest15(i32 %x) {
801 ; CHECK-LABEL: ntest15:
803 ; CHECK-NEXT: sub w0, w0, w0, lsl #4
806 ; GISEL-LABEL: ntest15:
808 ; GISEL-NEXT: sub w0, w0, w0, lsl #4
811 %mul = mul nsw i32 %x, -15
815 define i32 @ntest16(i32 %x) {
816 ; CHECK-LABEL: ntest16:
818 ; CHECK-NEXT: neg w0, w0, lsl #4
821 ; GISEL-LABEL: ntest16:
823 ; GISEL-NEXT: mov w8, #-16 // =0xfffffff0
824 ; GISEL-NEXT: mul w0, w0, w8
827 %mul = mul nsw i32 %x, -16
831 define i32 @muladd_demand(i32 %x, i32 %y) {
832 ; CHECK-LABEL: muladd_demand:
834 ; CHECK-NEXT: sub w8, w1, w0, lsl #6
835 ; CHECK-NEXT: and w0, w8, #0x1ffc0
838 ; GISEL-LABEL: muladd_demand:
840 ; GISEL-NEXT: mov w8, #131008 // =0x1ffc0
841 ; GISEL-NEXT: madd w8, w0, w8, w1
842 ; GISEL-NEXT: and w0, w8, #0x1ffc0
844 %m = mul i32 %x, 131008 ; 0x0001ffc0
846 %r = and i32 %a, 131008
850 define <4 x i32> @muladd_demand_commute(<4 x i32> %x, <4 x i32> %y) {
851 ; CHECK-LABEL: muladd_demand_commute:
853 ; CHECK-NEXT: shl v0.4s, v0.4s, #6
854 ; CHECK-NEXT: movi v2.4s, #1, msl #16
855 ; CHECK-NEXT: sub v0.4s, v1.4s, v0.4s
856 ; CHECK-NEXT: and v0.16b, v0.16b, v2.16b
859 ; GISEL-LABEL: muladd_demand_commute:
861 ; GISEL-NEXT: adrp x8, .LCPI49_0
862 ; GISEL-NEXT: movi v3.4s, #1, msl #16
863 ; GISEL-NEXT: ldr q2, [x8, :lo12:.LCPI49_0]
864 ; GISEL-NEXT: mla v1.4s, v0.4s, v2.4s
865 ; GISEL-NEXT: and v0.16b, v1.16b, v3.16b
867 %m = mul <4 x i32> %x, <i32 131008, i32 131008, i32 131008, i32 131008>
868 %a = add <4 x i32> %m, %y
869 %r = and <4 x i32> %a, <i32 131071, i32 131071, i32 131071, i32 131071>