Lines Matching +full:r +full:- +full:xp
2 ; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | File…
5 ; CHECK-LABEL: add_v4i32_v4i32:
7 ; CHECK-NEXT: vmlav.u32 r0, q0, q1
8 ; CHECK-NEXT: bx lr
16 ; CHECK-LABEL: add_v4i32_v4i64_zext:
18 ; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1
19 ; CHECK-NEXT: bx lr
29 ; CHECK-LABEL: add_v4i32_v4i64_sext:
31 ; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1
32 ; CHECK-NEXT: bx lr
42 ; CHECK-LABEL: add_v2i32_v2i64_zext:
44 ; CHECK-NEXT: vmullb.u32 q2, q0, q1
45 ; CHECK-NEXT: vmov r0, r1, d5
46 ; CHECK-NEXT: vmov r2, r3, d4
47 ; CHECK-NEXT: adds r0, r0, r2
48 ; CHECK-NEXT: adcs r1, r3
49 ; CHECK-NEXT: bx lr
59 ; CHECK-LABEL: add_v2i32_v2i64_sext:
61 ; CHECK-NEXT: vmullb.s32 q2, q0, q1
62 ; CHECK-NEXT: vmov r0, r1, d5
63 ; CHECK-NEXT: vmov r2, r3, d4
64 ; CHECK-NEXT: adds r0, r0, r2
65 ; CHECK-NEXT: adcs r1, r3
66 ; CHECK-NEXT: bx lr
76 ; CHECK-LABEL: add_v8i16_v8i32_zext:
78 ; CHECK-NEXT: vmlav.u16 r0, q0, q1
79 ; CHECK-NEXT: bx lr
89 ; CHECK-LABEL: add_v8i16_v8i32_sext:
91 ; CHECK-NEXT: vmlav.s16 r0, q0, q1
92 ; CHECK-NEXT: bx lr
102 ; CHECK-LABEL: add_v4i16_v4i32_zext:
104 ; CHECK-NEXT: vmovlb.u16 q1, q1
105 ; CHECK-NEXT: vmovlb.u16 q0, q0
106 ; CHECK-NEXT: vmlav.u32 r0, q0, q1
107 ; CHECK-NEXT: bx lr
117 ; CHECK-LABEL: add_v4i16_v4i32_sext:
119 ; CHECK-NEXT: vmovlb.s16 q1, q1
120 ; CHECK-NEXT: vmovlb.s16 q0, q0
121 ; CHECK-NEXT: vmlav.u32 r0, q0, q1
122 ; CHECK-NEXT: bx lr
132 ; CHECK-LABEL: add_v8i16_v8i16:
134 ; CHECK-NEXT: vmlav.u16 r0, q0, q1
135 ; CHECK-NEXT: uxth r0, r0
136 ; CHECK-NEXT: bx lr
144 ; CHECK-LABEL: add_v8i16_v8i64_zext:
146 ; CHECK-NEXT: vmlalv.u16 r0, r1, q0, q1
147 ; CHECK-NEXT: bx lr
157 ; CHECK-LABEL: add_v8i16_v8i64_sext:
159 ; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q1
160 ; CHECK-NEXT: bx lr
170 ; CHECK-LABEL: add_v8i8i16_v8i64_zext:
172 ; CHECK-NEXT: vmovlb.u8 q1, q1
173 ; CHECK-NEXT: vmlalv.u16 r0, r1, q0, q1
174 ; CHECK-NEXT: bx lr
184 ; CHECK-LABEL: add_v8i8i16_v8i64_sext:
186 ; CHECK-NEXT: vmovlb.s8 q1, q1
187 ; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q1
188 ; CHECK-NEXT: bx lr
198 ; CHECK-LABEL: add_v4i16_v4i64_zext:
200 ; CHECK-NEXT: vmovlb.u16 q1, q1
201 ; CHECK-NEXT: vmovlb.u16 q0, q0
202 ; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1
203 ; CHECK-NEXT: bx lr
213 ; CHECK-LABEL: add_v4i16_v4i64_sext:
215 ; CHECK-NEXT: vmovlb.s16 q1, q1
216 ; CHECK-NEXT: vmovlb.s16 q0, q0
217 ; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1
218 ; CHECK-NEXT: bx lr
228 ; CHECK-LABEL: add_v8i16_v8i32_v8i64_zext:
230 ; CHECK-NEXT: vmlalv.u16 r0, r1, q0, q1
231 ; CHECK-NEXT: bx lr
242 ; CHECK-LABEL: add_v8i16_v8i32_v8i64_sext:
244 ; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q1
245 ; CHECK-NEXT: bx lr
256 ; CHECK-LABEL: add_v8i16_v8i32_v8i64_sextzext:
258 ; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q0
259 ; CHECK-NEXT: bx lr
269 ; CHECK-LABEL: add_v2i16_v2i64_zext:
271 ; CHECK-NEXT: vmov.i64 q2, #0xffff
272 ; CHECK-NEXT: vand q1, q1, q2
273 ; CHECK-NEXT: vand q0, q0, q2
274 ; CHECK-NEXT: vmov r0, s6
275 ; CHECK-NEXT: vmov r1, s2
276 ; CHECK-NEXT: vmov r2, s4
277 ; CHECK-NEXT: vmov r3, s0
278 ; CHECK-NEXT: umull r0, r1, r1, r0
279 ; CHECK-NEXT: umlal r0, r1, r3, r2
280 ; CHECK-NEXT: bx lr
290 ; CHECK-LABEL: add_v2i16_v2i64_sext:
292 ; CHECK-NEXT: vmov r0, s6
293 ; CHECK-NEXT: vmov r1, s2
294 ; CHECK-NEXT: vmov r2, s4
295 ; CHECK-NEXT: vmov r3, s0
296 ; CHECK-NEXT: sxth r0, r0
297 ; CHECK-NEXT: sxth r1, r1
298 ; CHECK-NEXT: smull r0, r1, r1, r0
299 ; CHECK-NEXT: sxth r2, r2
300 ; CHECK-NEXT: sxth r3, r3
301 ; CHECK-NEXT: smlal r0, r1, r3, r2
302 ; CHECK-NEXT: bx lr
312 ; CHECK-LABEL: add_v16i8_v16i32_zext:
314 ; CHECK-NEXT: vmlav.u8 r0, q0, q1
315 ; CHECK-NEXT: bx lr
325 ; CHECK-LABEL: add_v16i8_v16i32_sext:
327 ; CHECK-NEXT: vmlav.s8 r0, q0, q1
328 ; CHECK-NEXT: bx lr
338 ; CHECK-LABEL: add_v8i8_v8i32_zext:
340 ; CHECK-NEXT: vmovlb.u8 q1, q1
341 ; CHECK-NEXT: vmovlb.u8 q0, q0
342 ; CHECK-NEXT: vmlav.u16 r0, q0, q1
343 ; CHECK-NEXT: bx lr
353 ; CHECK-LABEL: add_v8i8_v8i32_sext:
355 ; CHECK-NEXT: vmovlb.s8 q1, q1
356 ; CHECK-NEXT: vmovlb.s8 q0, q0
357 ; CHECK-NEXT: vmlav.s16 r0, q0, q1
358 ; CHECK-NEXT: bx lr
368 ; CHECK-LABEL: add_v8i8i16_v8i32_zext:
370 ; CHECK-NEXT: vmovlb.u8 q0, q0
371 ; CHECK-NEXT: vmlav.u16 r0, q0, q1
372 ; CHECK-NEXT: bx lr
382 ; CHECK-LABEL: add_v8i8i16_v8i32_sext:
384 ; CHECK-NEXT: vmovlb.s8 q0, q0
385 ; CHECK-NEXT: vmlav.s16 r0, q0, q1
386 ; CHECK-NEXT: bx lr
396 ; CHECK-LABEL: add_v16i8_v16i16_v16i32_zext:
398 ; CHECK-NEXT: vmlav.u8 r0, q0, q1
399 ; CHECK-NEXT: bx lr
410 ; CHECK-LABEL: add_v16i8_v16i16_v16i32_sext:
412 ; CHECK-NEXT: vmlav.s8 r0, q0, q1
413 ; CHECK-NEXT: bx lr
424 ; CHECK-LABEL: add_v16i8_v16i16_v16i32_sextzext:
426 ; CHECK-NEXT: vmlav.s8 r0, q0, q0
427 ; CHECK-NEXT: bx lr
437 ; CHECK-LABEL: add_v4i8_v4i32_zext:
439 ; CHECK-NEXT: vmov.i32 q2, #0xff
440 ; CHECK-NEXT: vand q1, q1, q2
441 ; CHECK-NEXT: vand q0, q0, q2
442 ; CHECK-NEXT: vmlav.u32 r0, q0, q1
443 ; CHECK-NEXT: bx lr
453 ; CHECK-LABEL: add_v4i8_v4i32_sext:
455 ; CHECK-NEXT: vmovlb.s8 q1, q1
456 ; CHECK-NEXT: vmovlb.s8 q0, q0
457 ; CHECK-NEXT: vmovlb.s16 q1, q1
458 ; CHECK-NEXT: vmovlb.s16 q0, q0
459 ; CHECK-NEXT: vmlav.u32 r0, q0, q1
460 ; CHECK-NEXT: bx lr
470 ; CHECK-LABEL: add_v4i8_v4i32_szext:
472 ; CHECK-NEXT: vmovlb.s8 q0, q0
473 ; CHECK-NEXT: vmov.i32 q2, #0xff
474 ; CHECK-NEXT: vand q1, q1, q2
475 ; CHECK-NEXT: vmovlb.s16 q0, q0
476 ; CHECK-NEXT: vmlav.u32 r0, q0, q1
477 ; CHECK-NEXT: bx lr
487 ; CHECK-LABEL: add_v16i8_v16i16_zext:
489 ; CHECK-NEXT: vmlav.u8 r0, q0, q1
490 ; CHECK-NEXT: uxth r0, r0
491 ; CHECK-NEXT: bx lr
501 ; CHECK-LABEL: add_v16i8_v16i16_sext:
503 ; CHECK-NEXT: vmlav.s8 r0, q0, q1
504 ; CHECK-NEXT: sxth r0, r0
505 ; CHECK-NEXT: bx lr
515 ; CHECK-LABEL: add_v16i8_v16i16_szext:
517 ; CHECK-NEXT: .pad #32
518 ; CHECK-NEXT: sub sp, #32
519 ; CHECK-NEXT: add r0, sp, #16
520 ; CHECK-NEXT: mov r1, sp
521 ; CHECK-NEXT: vstrw.32 q1, [r0]
522 ; CHECK-NEXT: vstrw.32 q0, [r1]
523 ; CHECK-NEXT: vldrb.u16 q0, [r0, #8]
524 ; CHECK-NEXT: vldrb.s16 q1, [r1, #8]
525 ; CHECK-NEXT: vmlav.u16 r2, q1, q0
526 ; CHECK-NEXT: vldrb.u16 q0, [r0]
527 ; CHECK-NEXT: vldrb.s16 q1, [r1]
528 ; CHECK-NEXT: vmlava.u16 r2, q1, q0
529 ; CHECK-NEXT: sxth r0, r2
530 ; CHECK-NEXT: add sp, #32
531 ; CHECK-NEXT: bx lr
541 ; CHECK-LABEL: add_v8i8_v8i16_zext:
543 ; CHECK-NEXT: vmovlb.u8 q1, q1
544 ; CHECK-NEXT: vmovlb.u8 q0, q0
545 ; CHECK-NEXT: vmlav.u16 r0, q0, q1
546 ; CHECK-NEXT: uxth r0, r0
547 ; CHECK-NEXT: bx lr
557 ; CHECK-LABEL: add_v8i8_v8i16_sext:
559 ; CHECK-NEXT: vmovlb.s8 q1, q1
560 ; CHECK-NEXT: vmovlb.s8 q0, q0
561 ; CHECK-NEXT: vmlav.u16 r0, q0, q1
562 ; CHECK-NEXT: sxth r0, r0
563 ; CHECK-NEXT: bx lr
573 ; CHECK-LABEL: add_v16i8_v16i8:
575 ; CHECK-NEXT: vmlav.u8 r0, q0, q1
576 ; CHECK-NEXT: uxtb r0, r0
577 ; CHECK-NEXT: bx lr
585 ; CHECK-LABEL: add_v16i8_v16i64_zext:
587 ; CHECK-NEXT: .pad #32
588 ; CHECK-NEXT: sub sp, #32
589 ; CHECK-NEXT: add r2, sp, #16
590 ; CHECK-NEXT: mov r3, sp
591 ; CHECK-NEXT: vstrw.32 q1, [r2]
592 ; CHECK-NEXT: vstrw.32 q0, [r3]
593 ; CHECK-NEXT: vldrb.u16 q0, [r2]
594 ; CHECK-NEXT: vldrb.u16 q1, [r3]
595 ; CHECK-NEXT: vmlalv.u16 r0, r1, q1, q0
596 ; CHECK-NEXT: vldrb.u16 q0, [r2, #8]
597 ; CHECK-NEXT: vldrb.u16 q1, [r3, #8]
598 ; CHECK-NEXT: vmlalva.u16 r0, r1, q1, q0
599 ; CHECK-NEXT: add sp, #32
600 ; CHECK-NEXT: bx lr
610 ; CHECK-LABEL: add_v16i8_v16i64_sext:
612 ; CHECK-NEXT: .pad #32
613 ; CHECK-NEXT: sub sp, #32
614 ; CHECK-NEXT: add r2, sp, #16
615 ; CHECK-NEXT: mov r3, sp
616 ; CHECK-NEXT: vstrw.32 q1, [r2]
617 ; CHECK-NEXT: vstrw.32 q0, [r3]
618 ; CHECK-NEXT: vldrb.s16 q0, [r2]
619 ; CHECK-NEXT: vldrb.s16 q1, [r3]
620 ; CHECK-NEXT: vmlalv.s16 r0, r1, q1, q0
621 ; CHECK-NEXT: vldrb.s16 q0, [r2, #8]
622 ; CHECK-NEXT: vldrb.s16 q1, [r3, #8]
623 ; CHECK-NEXT: vmlalva.s16 r0, r1, q1, q0
624 ; CHECK-NEXT: add sp, #32
625 ; CHECK-NEXT: bx lr
634 define arm_aapcs_vfpcc i64 @add_v16i8_v16i64_zext_load(ptr %xp, ptr %yp) {
635 ; CHECK-LABEL: add_v16i8_v16i64_zext_load:
637 ; CHECK-NEXT: vldrb.u16 q0, [r1]
638 ; CHECK-NEXT: vldrb.u16 q1, [r0]
639 ; CHECK-NEXT: vmlalv.u16 r2, r3, q1, q0
640 ; CHECK-NEXT: vldrb.u16 q0, [r1, #8]
641 ; CHECK-NEXT: vldrb.u16 q1, [r0, #8]
642 ; CHECK-NEXT: vmlalva.u16 r2, r3, q1, q0
643 ; CHECK-NEXT: mov r0, r2
644 ; CHECK-NEXT: mov r1, r3
645 ; CHECK-NEXT: bx lr
647 %x = load <16 x i8>, ptr %xp
656 define arm_aapcs_vfpcc i64 @add_v16i8_v16i64_sext_load(ptr %xp, ptr %yp) {
657 ; CHECK-LABEL: add_v16i8_v16i64_sext_load:
659 ; CHECK-NEXT: vldrb.s16 q0, [r1]
660 ; CHECK-NEXT: vldrb.s16 q1, [r0]
661 ; CHECK-NEXT: vmlalv.s16 r2, r3, q1, q0
662 ; CHECK-NEXT: vldrb.s16 q0, [r1, #8]
663 ; CHECK-NEXT: vldrb.s16 q1, [r0, #8]
664 ; CHECK-NEXT: vmlalva.s16 r2, r3, q1, q0
665 ; CHECK-NEXT: mov r0, r2
666 ; CHECK-NEXT: mov r1, r3
667 ; CHECK-NEXT: bx lr
669 %x = load <16 x i8>, ptr %xp
679 ; CHECK-LABEL: add_v8i8_v8i64_zext:
681 ; CHECK-NEXT: vmovlb.u8 q1, q1
682 ; CHECK-NEXT: vmovlb.u8 q0, q0
683 ; CHECK-NEXT: vmlalv.u16 r0, r1, q0, q1
684 ; CHECK-NEXT: bx lr
694 ; CHECK-LABEL: add_v8i8_v8i64_sext:
696 ; CHECK-NEXT: vmovlb.s8 q1, q1
697 ; CHECK-NEXT: vmovlb.s8 q0, q0
698 ; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q1
699 ; CHECK-NEXT: bx lr
709 ; CHECK-LABEL: add_v4i8_v4i64_zext:
711 ; CHECK-NEXT: vmov.i32 q2, #0xff
712 ; CHECK-NEXT: vand q1, q1, q2
713 ; CHECK-NEXT: vand q0, q0, q2
714 ; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1
715 ; CHECK-NEXT: bx lr
725 ; CHECK-LABEL: add_v4i8_v4i64_sext:
727 ; CHECK-NEXT: vmovlb.s8 q1, q1
728 ; CHECK-NEXT: vmovlb.s8 q0, q0
729 ; CHECK-NEXT: vmovlb.s16 q1, q1
730 ; CHECK-NEXT: vmovlb.s16 q0, q0
731 ; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1
732 ; CHECK-NEXT: bx lr
742 ; CHECK-LABEL: add_v4i8i16_v4i64_zext:
744 ; CHECK-NEXT: vmov.i32 q2, #0xff
745 ; CHECK-NEXT: vmovlb.u16 q1, q1
746 ; CHECK-NEXT: vand q0, q0, q2
747 ; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1
748 ; CHECK-NEXT: bx lr
758 ; CHECK-LABEL: add_v4i8i16_v4i64_sext:
760 ; CHECK-NEXT: vmovlb.s8 q0, q0
761 ; CHECK-NEXT: vmovlb.s16 q1, q1
762 ; CHECK-NEXT: vmovlb.s16 q0, q0
763 ; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1
764 ; CHECK-NEXT: bx lr
774 ; CHECK-LABEL: add_v4i8i16_v4i32_v4i64_zext:
776 ; CHECK-NEXT: vmov.i32 q2, #0xff
777 ; CHECK-NEXT: vmovlb.u16 q1, q1
778 ; CHECK-NEXT: vand q0, q0, q2
779 ; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1
780 ; CHECK-NEXT: bx lr
791 ; CHECK-LABEL: add_v4i8i16_v4i32_v4i64_sext:
793 ; CHECK-NEXT: vmovlb.s8 q0, q0
794 ; CHECK-NEXT: vmovlb.s16 q1, q1
795 ; CHECK-NEXT: vmovlb.s16 q0, q0
796 ; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1
797 ; CHECK-NEXT: bx lr
808 ; CHECK-LABEL: add_v2i8_v2i64_zext:
810 ; CHECK-NEXT: vmov.i64 q2, #0xff
811 ; CHECK-NEXT: vand q1, q1, q2
812 ; CHECK-NEXT: vand q0, q0, q2
813 ; CHECK-NEXT: vmov r0, s6
814 ; CHECK-NEXT: vmov r1, s2
815 ; CHECK-NEXT: vmov r2, s4
816 ; CHECK-NEXT: vmov r3, s0
817 ; CHECK-NEXT: umull r0, r1, r1, r0
818 ; CHECK-NEXT: umull r2, r3, r3, r2
819 ; CHECK-NEXT: add r0, r2
820 ; CHECK-NEXT: orrs r1, r3
821 ; CHECK-NEXT: bx lr
831 ; CHECK-LABEL: add_v2i8_v2i64_sext:
833 ; CHECK-NEXT: vmov r0, s6
834 ; CHECK-NEXT: vmov r1, s2
835 ; CHECK-NEXT: vmov r2, s4
836 ; CHECK-NEXT: vmov r3, s0
837 ; CHECK-NEXT: sxtb r0, r0
838 ; CHECK-NEXT: sxtb r1, r1
839 ; CHECK-NEXT: smull r0, r1, r1, r0
840 ; CHECK-NEXT: sxtb r2, r2
841 ; CHECK-NEXT: sxtb r3, r3
842 ; CHECK-NEXT: smlal r0, r1, r3, r2
843 ; CHECK-NEXT: bx lr
853 ; CHECK-LABEL: add_v2i64_v2i64:
855 ; CHECK-NEXT: .save {r4, r5, r7, lr}
856 ; CHECK-NEXT: push {r4, r5, r7, lr}
857 ; CHECK-NEXT: vmov r0, lr, d3
858 ; CHECK-NEXT: vmov r2, r3, d1
859 ; CHECK-NEXT: umull r12, r1, r2, r0
860 ; CHECK-NEXT: mla r1, r2, lr, r1
861 ; CHECK-NEXT: mla lr, r3, r0, r1
862 ; CHECK-NEXT: vmov r0, r2, d2
863 ; CHECK-NEXT: vmov r3, r1, d0
864 ; CHECK-NEXT: umull r4, r5, r3, r0
865 ; CHECK-NEXT: mla r2, r3, r2, r5
866 ; CHECK-NEXT: mla r1, r1, r0, r2
867 ; CHECK-NEXT: adds.w r0, r4, r12
868 ; CHECK-NEXT: adc.w r1, r1, lr
869 ; CHECK-NEXT: pop {r4, r5, r7, pc}
877 ; CHECK-LABEL: add_v4i32_v4i32_acc:
879 ; CHECK-NEXT: vmlava.u32 r0, q0, q1
880 ; CHECK-NEXT: bx lr
884 %r = add i32 %z, %a
885 ret i32 %r
889 ; CHECK-LABEL: add_v4i32_v4i64_acc_zext:
891 ; CHECK-NEXT: vmlalva.u32 r0, r1, q0, q1
892 ; CHECK-NEXT: bx lr
898 %r = add i64 %z, %a
899 ret i64 %r
903 ; CHECK-LABEL: add_v4i32_v4i64_acc_sext:
905 ; CHECK-NEXT: vmlalva.s32 r0, r1, q0, q1
906 ; CHECK-NEXT: bx lr
912 %r = add i64 %z, %a
913 ret i64 %r
917 ; CHECK-LABEL: add_v2i32_v2i64_acc_zext:
919 ; CHECK-NEXT: .save {r7, lr}
920 ; CHECK-NEXT: push {r7, lr}
921 ; CHECK-NEXT: vmullb.u32 q2, q0, q1
922 ; CHECK-NEXT: vmov lr, r12, d5
923 ; CHECK-NEXT: vmov r3, r2, d4
924 ; CHECK-NEXT: adds.w r3, r3, lr
925 ; CHECK-NEXT: adc.w r2, r2, r12
926 ; CHECK-NEXT: adds r0, r0, r3
927 ; CHECK-NEXT: adcs r1, r2
928 ; CHECK-NEXT: pop {r7, pc}
934 %r = add i64 %z, %a
935 ret i64 %r
939 ; CHECK-LABEL: add_v2i32_v2i64_acc_sext:
941 ; CHECK-NEXT: .save {r7, lr}
942 ; CHECK-NEXT: push {r7, lr}
943 ; CHECK-NEXT: vmullb.s32 q2, q0, q1
944 ; CHECK-NEXT: vmov lr, r12, d5
945 ; CHECK-NEXT: vmov r3, r2, d4
946 ; CHECK-NEXT: adds.w r3, r3, lr
947 ; CHECK-NEXT: adc.w r2, r2, r12
948 ; CHECK-NEXT: adds r0, r0, r3
949 ; CHECK-NEXT: adcs r1, r2
950 ; CHECK-NEXT: pop {r7, pc}
956 %r = add i64 %z, %a
957 ret i64 %r
961 ; CHECK-LABEL: add_v8i16_v8i32_acc_zext:
963 ; CHECK-NEXT: vmlava.u16 r0, q0, q1
964 ; CHECK-NEXT: bx lr
970 %r = add i32 %z, %a
971 ret i32 %r
975 ; CHECK-LABEL: add_v8i16_v8i32_acc_sext:
977 ; CHECK-NEXT: vmlava.s16 r0, q0, q1
978 ; CHECK-NEXT: bx lr
984 %r = add i32 %z, %a
985 ret i32 %r
989 ; CHECK-LABEL: add_v4i16_v4i32_acc_zext:
991 ; CHECK-NEXT: vmovlb.u16 q1, q1
992 ; CHECK-NEXT: vmovlb.u16 q0, q0
993 ; CHECK-NEXT: vmlava.u32 r0, q0, q1
994 ; CHECK-NEXT: bx lr
1000 %r = add i32 %z, %a
1001 ret i32 %r
1005 ; CHECK-LABEL: add_v4i16_v4i32_acc_sext:
1007 ; CHECK-NEXT: vmovlb.s16 q1, q1
1008 ; CHECK-NEXT: vmovlb.s16 q0, q0
1009 ; CHECK-NEXT: vmlava.u32 r0, q0, q1
1010 ; CHECK-NEXT: bx lr
1016 %r = add i32 %z, %a
1017 ret i32 %r
1021 ; CHECK-LABEL: add_v8i16_v8i16_acc:
1023 ; CHECK-NEXT: vmlava.u16 r0, q0, q1
1024 ; CHECK-NEXT: uxth r0, r0
1025 ; CHECK-NEXT: bx lr
1029 %r = add i16 %z, %a
1030 ret i16 %r
1034 ; CHECK-LABEL: add_v8i16_v8i64_acc_zext:
1036 ; CHECK-NEXT: vmlalva.u16 r0, r1, q0, q1
1037 ; CHECK-NEXT: bx lr
1043 %r = add i64 %z, %a
1044 ret i64 %r
1048 ; CHECK-LABEL: add_v8i16_v8i64_acc_sext:
1050 ; CHECK-NEXT: vmlalva.s16 r0, r1, q0, q1
1051 ; CHECK-NEXT: bx lr
1057 %r = add i64 %z, %a
1058 ret i64 %r
1062 ; CHECK-LABEL: add_v8i16_v8i32_v8i64_acc_zext:
1064 ; CHECK-NEXT: vmlalva.u16 r0, r1, q0, q1
1065 ; CHECK-NEXT: bx lr
1072 %r = add i64 %z, %a
1073 ret i64 %r
1077 ; CHECK-LABEL: add_v8i16_v8i32_v8i64_acc_sext:
1079 ; CHECK-NEXT: vmlalva.s16 r0, r1, q0, q1
1080 ; CHECK-NEXT: bx lr
1087 %r = add i64 %z, %a
1088 ret i64 %r
1092 ; CHECK-LABEL: add_v8i16_v8i32_v8i64_acc_sextzext:
1094 ; CHECK-NEXT: vmlalva.s16 r0, r1, q0, q0
1095 ; CHECK-NEXT: bx lr
1101 %r = add i64 %z, %a
1102 ret i64 %r
1106 ; CHECK-LABEL: add_v2i16_v2i64_acc_zext:
1108 ; CHECK-NEXT: .save {r7, lr}
1109 ; CHECK-NEXT: push {r7, lr}
1110 ; CHECK-NEXT: vmov.i64 q2, #0xffff
1111 ; CHECK-NEXT: vand q1, q1, q2
1112 ; CHECK-NEXT: vand q0, q0, q2
1113 ; CHECK-NEXT: vmov r2, s6
1114 ; CHECK-NEXT: vmov r3, s2
1115 ; CHECK-NEXT: vmov r12, s4
1116 ; CHECK-NEXT: umull r2, lr, r3, r2
1117 ; CHECK-NEXT: vmov r3, s0
1118 ; CHECK-NEXT: umlal r2, lr, r3, r12
1119 ; CHECK-NEXT: adds r0, r0, r2
1120 ; CHECK-NEXT: adc.w r1, r1, lr
1121 ; CHECK-NEXT: pop {r7, pc}
1127 %r = add i64 %z, %a
1128 ret i64 %r
1132 ; CHECK-LABEL: add_v2i16_v2i64_acc_sext:
1134 ; CHECK-NEXT: .save {r7, lr}
1135 ; CHECK-NEXT: push {r7, lr}
1136 ; CHECK-NEXT: vmov r2, s6
1137 ; CHECK-NEXT: vmov r3, s2
1138 ; CHECK-NEXT: sxth r2, r2
1139 ; CHECK-NEXT: sxth r3, r3
1140 ; CHECK-NEXT: smull r2, r12, r3, r2
1141 ; CHECK-NEXT: vmov r3, s4
1142 ; CHECK-NEXT: sxth.w lr, r3
1143 ; CHECK-NEXT: vmov r3, s0
1144 ; CHECK-NEXT: sxth r3, r3
1145 ; CHECK-NEXT: smlal r2, r12, r3, lr
1146 ; CHECK-NEXT: adds r0, r0, r2
1147 ; CHECK-NEXT: adc.w r1, r1, r12
1148 ; CHECK-NEXT: pop {r7, pc}
1154 %r = add i64 %z, %a
1155 ret i64 %r
1159 ; CHECK-LABEL: add_v16i8_v16i32_acc_zext:
1161 ; CHECK-NEXT: vmlava.u8 r0, q0, q1
1162 ; CHECK-NEXT: bx lr
1168 %r = add i32 %z, %a
1169 ret i32 %r
1173 ; CHECK-LABEL: add_v16i8_v16i32_acc_sext:
1175 ; CHECK-NEXT: vmlava.s8 r0, q0, q1
1176 ; CHECK-NEXT: bx lr
1182 %r = add i32 %z, %a
1183 ret i32 %r
1187 ; CHECK-LABEL: add_v16i8_v16i16_v16i32_acc_zext:
1189 ; CHECK-NEXT: vmlava.u8 r0, q0, q1
1190 ; CHECK-NEXT: bx lr
1197 %r = add i32 %z, %a
1198 ret i32 %r
1202 ; CHECK-LABEL: add_v16i8_v16i16_v16i32_acc_sext:
1204 ; CHECK-NEXT: vmlava.s8 r0, q0, q1
1205 ; CHECK-NEXT: bx lr
1212 %r = add i32 %z, %a
1213 ret i32 %r
1217 ; CHECK-LABEL: add_v16i8_v16i16_v16i32_acc_sextzext:
1219 ; CHECK-NEXT: vmlava.s8 r0, q0, q0
1220 ; CHECK-NEXT: bx lr
1226 %r = add i32 %z, %a
1227 ret i32 %r
1231 ; CHECK-LABEL: add_v4i8_v4i32_acc_zext:
1233 ; CHECK-NEXT: vmov.i32 q2, #0xff
1234 ; CHECK-NEXT: vand q1, q1, q2
1235 ; CHECK-NEXT: vand q0, q0, q2
1236 ; CHECK-NEXT: vmlava.u32 r0, q0, q1
1237 ; CHECK-NEXT: bx lr
1243 %r = add i32 %z, %a
1244 ret i32 %r
1248 ; CHECK-LABEL: add_v4i8_v4i32_acc_sext:
1250 ; CHECK-NEXT: vmovlb.s8 q1, q1
1251 ; CHECK-NEXT: vmovlb.s8 q0, q0
1252 ; CHECK-NEXT: vmovlb.s16 q1, q1
1253 ; CHECK-NEXT: vmovlb.s16 q0, q0
1254 ; CHECK-NEXT: vmlava.u32 r0, q0, q1
1255 ; CHECK-NEXT: bx lr
1261 %r = add i32 %z, %a
1262 ret i32 %r
1266 ; CHECK-LABEL: add_v16i8_v16i16_acc_zext:
1268 ; CHECK-NEXT: vmlava.u8 r0, q0, q1
1269 ; CHECK-NEXT: uxth r0, r0
1270 ; CHECK-NEXT: bx lr
1276 %r = add i16 %z, %a
1277 ret i16 %r
1281 ; CHECK-LABEL: add_v16i8_v16i16_acc_sext:
1283 ; CHECK-NEXT: vmlava.s8 r0, q0, q1
1284 ; CHECK-NEXT: sxth r0, r0
1285 ; CHECK-NEXT: bx lr
1291 %r = add i16 %z, %a
1292 ret i16 %r
1296 ; CHECK-LABEL: add_v8i8_v8i16_acc_zext:
1298 ; CHECK-NEXT: vmovlb.u8 q1, q1
1299 ; CHECK-NEXT: vmovlb.u8 q0, q0
1300 ; CHECK-NEXT: vmlava.u16 r0, q0, q1
1301 ; CHECK-NEXT: uxth r0, r0
1302 ; CHECK-NEXT: bx lr
1308 %r = add i16 %z, %a
1309 ret i16 %r
1313 ; CHECK-LABEL: add_v8i8_v8i16_acc_sext:
1315 ; CHECK-NEXT: vmovlb.s8 q1, q1
1316 ; CHECK-NEXT: vmovlb.s8 q0, q0
1317 ; CHECK-NEXT: vmlava.u16 r0, q0, q1
1318 ; CHECK-NEXT: sxth r0, r0
1319 ; CHECK-NEXT: bx lr
1325 %r = add i16 %z, %a
1326 ret i16 %r
1330 ; CHECK-LABEL: add_v16i8_v16i8_acc:
1332 ; CHECK-NEXT: vmlava.u8 r0, q0, q1
1333 ; CHECK-NEXT: uxtb r0, r0
1334 ; CHECK-NEXT: bx lr
1338 %r = add i8 %z, %a
1339 ret i8 %r
1343 ; CHECK-LABEL: add_v16i8_v16i64_acc_zext:
1345 ; CHECK-NEXT: .pad #32
1346 ; CHECK-NEXT: sub sp, #32
1347 ; CHECK-NEXT: add r2, sp, #16
1348 ; CHECK-NEXT: mov r3, sp
1349 ; CHECK-NEXT: vstrw.32 q1, [r2]
1350 ; CHECK-NEXT: vstrw.32 q0, [r3]
1351 ; CHECK-NEXT: vldrb.u16 q0, [r2]
1352 ; CHECK-NEXT: vldrb.u16 q1, [r3]
1353 ; CHECK-NEXT: vmlalva.u16 r0, r1, q1, q0
1354 ; CHECK-NEXT: vldrb.u16 q0, [r2, #8]
1355 ; CHECK-NEXT: vldrb.u16 q1, [r3, #8]
1356 ; CHECK-NEXT: vmlalva.u16 r0, r1, q1, q0
1357 ; CHECK-NEXT: add sp, #32
1358 ; CHECK-NEXT: bx lr
1364 %r = add i64 %z, %a
1365 ret i64 %r
1369 ; CHECK-LABEL: add_v16i8_v16i64_acc_sext:
1371 ; CHECK-NEXT: .pad #32
1372 ; CHECK-NEXT: sub sp, #32
1373 ; CHECK-NEXT: add r2, sp, #16
1374 ; CHECK-NEXT: mov r3, sp
1375 ; CHECK-NEXT: vstrw.32 q1, [r2]
1376 ; CHECK-NEXT: vstrw.32 q0, [r3]
1377 ; CHECK-NEXT: vldrb.s16 q0, [r2]
1378 ; CHECK-NEXT: vldrb.s16 q1, [r3]
1379 ; CHECK-NEXT: vmlalva.s16 r0, r1, q1, q0
1380 ; CHECK-NEXT: vldrb.s16 q0, [r2, #8]
1381 ; CHECK-NEXT: vldrb.s16 q1, [r3, #8]
1382 ; CHECK-NEXT: vmlalva.s16 r0, r1, q1, q0
1383 ; CHECK-NEXT: add sp, #32
1384 ; CHECK-NEXT: bx lr
1390 %r = add i64 %z, %a
1391 ret i64 %r
1394 define arm_aapcs_vfpcc i64 @add_v16i8_v16i64_acc_zext_load(ptr %xp, ptr %yp, i64 %a) {
1395 ; CHECK-LABEL: add_v16i8_v16i64_acc_zext_load:
1397 ; CHECK-NEXT: vldrb.u16 q0, [r1]
1398 ; CHECK-NEXT: vldrb.u16 q1, [r0]
1399 ; CHECK-NEXT: vmlalva.u16 r2, r3, q1, q0
1400 ; CHECK-NEXT: vldrb.u16 q0, [r1, #8]
1401 ; CHECK-NEXT: vldrb.u16 q1, [r0, #8]
1402 ; CHECK-NEXT: vmlalva.u16 r2, r3, q1, q0
1403 ; CHECK-NEXT: mov r0, r2
1404 ; CHECK-NEXT: mov r1, r3
1405 ; CHECK-NEXT: bx lr
1407 %x = load <16 x i8>, ptr %xp
1413 %r = add i64 %z, %a
1414 ret i64 %r
1417 define arm_aapcs_vfpcc i64 @add_v16i8_v16i64_acc_sext_load(ptr %xp, ptr %yp, i64 %a) {
1418 ; CHECK-LABEL: add_v16i8_v16i64_acc_sext_load:
1420 ; CHECK-NEXT: vldrb.s16 q0, [r1]
1421 ; CHECK-NEXT: vldrb.s16 q1, [r0]
1422 ; CHECK-NEXT: vmlalva.s16 r2, r3, q1, q0
1423 ; CHECK-NEXT: vldrb.s16 q0, [r1, #8]
1424 ; CHECK-NEXT: vldrb.s16 q1, [r0, #8]
1425 ; CHECK-NEXT: vmlalva.s16 r2, r3, q1, q0
1426 ; CHECK-NEXT: mov r0, r2
1427 ; CHECK-NEXT: mov r1, r3
1428 ; CHECK-NEXT: bx lr
1430 %x = load <16 x i8>, ptr %xp
1436 %r = add i64 %z, %a
1437 ret i64 %r
1441 ; CHECK-LABEL: add_v2i8_v2i64_acc_zext:
1443 ; CHECK-NEXT: .save {r7, lr}
1444 ; CHECK-NEXT: push {r7, lr}
1445 ; CHECK-NEXT: vmov.i64 q2, #0xff
1446 ; CHECK-NEXT: vand q1, q1, q2
1447 ; CHECK-NEXT: vand q0, q0, q2
1448 ; CHECK-NEXT: vmov r2, s6
1449 ; CHECK-NEXT: vmov r3, s2
1450 ; CHECK-NEXT: umull r12, lr, r3, r2
1451 ; CHECK-NEXT: vmov r2, s4
1452 ; CHECK-NEXT: vmov r3, s0
1453 ; CHECK-NEXT: umull r2, r3, r3, r2
1454 ; CHECK-NEXT: add r2, r12
1455 ; CHECK-NEXT: orr.w r3, r3, lr
1456 ; CHECK-NEXT: adds r0, r0, r2
1457 ; CHECK-NEXT: adcs r1, r3
1458 ; CHECK-NEXT: pop {r7, pc}
1464 %r = add i64 %z, %a
1465 ret i64 %r
1469 ; CHECK-LABEL: add_v2i8_v2i64_acc_sext:
1471 ; CHECK-NEXT: .save {r7, lr}
1472 ; CHECK-NEXT: push {r7, lr}
1473 ; CHECK-NEXT: vmov r2, s6
1474 ; CHECK-NEXT: vmov r3, s2
1475 ; CHECK-NEXT: sxtb r2, r2
1476 ; CHECK-NEXT: sxtb r3, r3
1477 ; CHECK-NEXT: smull r2, r12, r3, r2
1478 ; CHECK-NEXT: vmov r3, s4
1479 ; CHECK-NEXT: sxtb.w lr, r3
1480 ; CHECK-NEXT: vmov r3, s0
1481 ; CHECK-NEXT: sxtb r3, r3
1482 ; CHECK-NEXT: smlal r2, r12, r3, lr
1483 ; CHECK-NEXT: adds r0, r0, r2
1484 ; CHECK-NEXT: adc.w r1, r1, r12
1485 ; CHECK-NEXT: pop {r7, pc}
1491 %r = add i64 %z, %a
1492 ret i64 %r
1496 ; CHECK-LABEL: add_v2i64_v2i64_acc:
1498 ; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
1499 ; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, lr}
1500 ; CHECK-NEXT: vmov r2, r12, d3
1501 ; CHECK-NEXT: vmov r3, lr, d1
1502 ; CHECK-NEXT: vmov r4, r6, d0
1503 ; CHECK-NEXT: umull r8, r5, r3, r2
1504 ; CHECK-NEXT: mla r3, r3, r12, r5
1505 ; CHECK-NEXT: mla r12, lr, r2, r3
1506 ; CHECK-NEXT: vmov r3, r5, d2
1507 ; CHECK-NEXT: umull r7, r2, r4, r3
1508 ; CHECK-NEXT: mla r2, r4, r5, r2
1509 ; CHECK-NEXT: mla r2, r6, r3, r2
1510 ; CHECK-NEXT: adds.w r3, r7, r8
1511 ; CHECK-NEXT: adc.w r2, r2, r12
1512 ; CHECK-NEXT: adds r0, r0, r3
1513 ; CHECK-NEXT: adcs r1, r2
1514 ; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, pc}
1518 %r = add i64 %z, %a
1519 ret i64 %r