11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2- ; RUN: llc -mtriple=aarch64 < %s | FileCheck %s
2+ ; RUN: llc < %s -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+ ; RUN: llc < %s -mtriple=aarch64 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
34
45declare <8 x i16 > @llvm.aarch64.neon.uhadd.v8i16 (<8 x i16 >, <8 x i16 >)
56declare <8 x i16 > @llvm.aarch64.neon.urhadd.v8i16 (<8 x i16 >, <8 x i16 >)
67declare <8 x i16 > @llvm.aarch64.neon.shadd.v8i16 (<8 x i16 >, <8 x i16 >)
78declare <8 x i16 > @llvm.aarch64.neon.srhadd.v8i16 (<8 x i16 >, <8 x i16 >)
89
910define <8 x i16 > @haddu_zext (<8 x i8 > %a0 , <8 x i8 > %a1 ) {
10- ; CHECK-LABEL: haddu_zext:
11- ; CHECK: // %bb.0:
12- ; CHECK-NEXT: uhadd v0.8b, v0.8b, v1.8b
13- ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
14- ; CHECK-NEXT: ret
11+ ; CHECK-SD-LABEL: haddu_zext:
12+ ; CHECK-SD: // %bb.0:
13+ ; CHECK-SD-NEXT: uhadd v0.8b, v0.8b, v1.8b
14+ ; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #0
15+ ; CHECK-SD-NEXT: ret
16+ ;
17+ ; CHECK-GI-LABEL: haddu_zext:
18+ ; CHECK-GI: // %bb.0:
19+ ; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
20+ ; CHECK-GI-NEXT: ushll v1.8h, v1.8b, #0
21+ ; CHECK-GI-NEXT: mvni v2.8h, #254, lsl #8
22+ ; CHECK-GI-NEXT: uhadd v0.8h, v0.8h, v1.8h
23+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
24+ ; CHECK-GI-NEXT: ret
1525 %x0 = zext <8 x i8 > %a0 to <8 x i16 >
1626 %x1 = zext <8 x i8 > %a1 to <8 x i16 >
1727 %hadd = call <8 x i16 > @llvm.aarch64.neon.uhadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
@@ -20,11 +30,20 @@ define <8 x i16> @haddu_zext(<8 x i8> %a0, <8 x i8> %a1) {
2030}
2131
2232define <8 x i16 > @rhaddu_zext (<8 x i8 > %a0 , <8 x i8 > %a1 ) {
23- ; CHECK-LABEL: rhaddu_zext:
24- ; CHECK: // %bb.0:
25- ; CHECK-NEXT: urhadd v0.8b, v0.8b, v1.8b
26- ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
27- ; CHECK-NEXT: ret
33+ ; CHECK-SD-LABEL: rhaddu_zext:
34+ ; CHECK-SD: // %bb.0:
35+ ; CHECK-SD-NEXT: urhadd v0.8b, v0.8b, v1.8b
36+ ; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #0
37+ ; CHECK-SD-NEXT: ret
38+ ;
39+ ; CHECK-GI-LABEL: rhaddu_zext:
40+ ; CHECK-GI: // %bb.0:
41+ ; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
42+ ; CHECK-GI-NEXT: ushll v1.8h, v1.8b, #0
43+ ; CHECK-GI-NEXT: mvni v2.8h, #254, lsl #8
44+ ; CHECK-GI-NEXT: urhadd v0.8h, v0.8h, v1.8h
45+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
46+ ; CHECK-GI-NEXT: ret
2847 %x0 = zext <8 x i8 > %a0 to <8 x i16 >
2948 %x1 = zext <8 x i8 > %a1 to <8 x i16 >
3049 %hadd = call <8 x i16 > @llvm.aarch64.neon.urhadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
@@ -33,11 +52,20 @@ define <8 x i16> @rhaddu_zext(<8 x i8> %a0, <8 x i8> %a1) {
3352}
3453
3554define <8 x i16 > @hadds_zext (<8 x i8 > %a0 , <8 x i8 > %a1 ) {
36- ; CHECK-LABEL: hadds_zext:
37- ; CHECK: // %bb.0:
38- ; CHECK-NEXT: uhadd v0.8b, v0.8b, v1.8b
39- ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
40- ; CHECK-NEXT: ret
55+ ; CHECK-SD-LABEL: hadds_zext:
56+ ; CHECK-SD: // %bb.0:
57+ ; CHECK-SD-NEXT: uhadd v0.8b, v0.8b, v1.8b
58+ ; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #0
59+ ; CHECK-SD-NEXT: ret
60+ ;
61+ ; CHECK-GI-LABEL: hadds_zext:
62+ ; CHECK-GI: // %bb.0:
63+ ; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
64+ ; CHECK-GI-NEXT: ushll v1.8h, v1.8b, #0
65+ ; CHECK-GI-NEXT: mvni v2.8h, #254, lsl #8
66+ ; CHECK-GI-NEXT: shadd v0.8h, v0.8h, v1.8h
67+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
68+ ; CHECK-GI-NEXT: ret
4169 %x0 = zext <8 x i8 > %a0 to <8 x i16 >
4270 %x1 = zext <8 x i8 > %a1 to <8 x i16 >
4371 %hadd = call <8 x i16 > @llvm.aarch64.neon.shadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
@@ -46,12 +74,21 @@ define <8 x i16> @hadds_zext(<8 x i8> %a0, <8 x i8> %a1) {
4674}
4775
4876define <8 x i16 > @shaddu_zext (<8 x i8 > %a0 , <8 x i8 > %a1 ) {
49- ; CHECK-LABEL: shaddu_zext:
50- ; CHECK: // %bb.0:
51- ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
52- ; CHECK-NEXT: ushll v1.8h, v1.8b, #0
53- ; CHECK-NEXT: srhadd v0.8h, v0.8h, v1.8h
54- ; CHECK-NEXT: ret
77+ ; CHECK-SD-LABEL: shaddu_zext:
78+ ; CHECK-SD: // %bb.0:
79+ ; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #0
80+ ; CHECK-SD-NEXT: ushll v1.8h, v1.8b, #0
81+ ; CHECK-SD-NEXT: srhadd v0.8h, v0.8h, v1.8h
82+ ; CHECK-SD-NEXT: ret
83+ ;
84+ ; CHECK-GI-LABEL: shaddu_zext:
85+ ; CHECK-GI: // %bb.0:
86+ ; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
87+ ; CHECK-GI-NEXT: ushll v1.8h, v1.8b, #0
88+ ; CHECK-GI-NEXT: mvni v2.8h, #254, lsl #8
89+ ; CHECK-GI-NEXT: srhadd v0.8h, v0.8h, v1.8h
90+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
91+ ; CHECK-GI-NEXT: ret
5592 %x0 = zext <8 x i8 > %a0 to <8 x i16 >
5693 %x1 = zext <8 x i8 > %a1 to <8 x i16 >
5794 %hadd = call <8 x i16 > @llvm.aarch64.neon.srhadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
@@ -62,13 +99,22 @@ define <8 x i16> @shaddu_zext(<8 x i8> %a0, <8 x i8> %a1) {
6299; ; negative tests
63100
64101define <8 x i16 > @haddu_sext (<8 x i8 > %a0 , <8 x i8 > %a1 ) {
65- ; CHECK-LABEL: haddu_sext:
66- ; CHECK: // %bb.0:
67- ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
68- ; CHECK-NEXT: sshll v1.8h, v1.8b, #0
69- ; CHECK-NEXT: uhadd v0.8h, v0.8h, v1.8h
70- ; CHECK-NEXT: bic v0.8h, #254, lsl #8
71- ; CHECK-NEXT: ret
102+ ; CHECK-SD-LABEL: haddu_sext:
103+ ; CHECK-SD: // %bb.0:
104+ ; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0
105+ ; CHECK-SD-NEXT: sshll v1.8h, v1.8b, #0
106+ ; CHECK-SD-NEXT: uhadd v0.8h, v0.8h, v1.8h
107+ ; CHECK-SD-NEXT: bic v0.8h, #254, lsl #8
108+ ; CHECK-SD-NEXT: ret
109+ ;
110+ ; CHECK-GI-LABEL: haddu_sext:
111+ ; CHECK-GI: // %bb.0:
112+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
113+ ; CHECK-GI-NEXT: sshll v1.8h, v1.8b, #0
114+ ; CHECK-GI-NEXT: mvni v2.8h, #254, lsl #8
115+ ; CHECK-GI-NEXT: uhadd v0.8h, v0.8h, v1.8h
116+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
117+ ; CHECK-GI-NEXT: ret
72118 %x0 = sext <8 x i8 > %a0 to <8 x i16 >
73119 %x1 = sext <8 x i8 > %a1 to <8 x i16 >
74120 %hadd = call <8 x i16 > @llvm.aarch64.neon.uhadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
@@ -77,13 +123,22 @@ define <8 x i16> @haddu_sext(<8 x i8> %a0, <8 x i8> %a1) {
77123}
78124
79125define <8 x i16 > @urhadd_sext (<8 x i8 > %a0 , <8 x i8 > %a1 ) {
80- ; CHECK-LABEL: urhadd_sext:
81- ; CHECK: // %bb.0:
82- ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
83- ; CHECK-NEXT: sshll v1.8h, v1.8b, #0
84- ; CHECK-NEXT: urhadd v0.8h, v0.8h, v1.8h
85- ; CHECK-NEXT: bic v0.8h, #254, lsl #8
86- ; CHECK-NEXT: ret
126+ ; CHECK-SD-LABEL: urhadd_sext:
127+ ; CHECK-SD: // %bb.0:
128+ ; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0
129+ ; CHECK-SD-NEXT: sshll v1.8h, v1.8b, #0
130+ ; CHECK-SD-NEXT: urhadd v0.8h, v0.8h, v1.8h
131+ ; CHECK-SD-NEXT: bic v0.8h, #254, lsl #8
132+ ; CHECK-SD-NEXT: ret
133+ ;
134+ ; CHECK-GI-LABEL: urhadd_sext:
135+ ; CHECK-GI: // %bb.0:
136+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
137+ ; CHECK-GI-NEXT: sshll v1.8h, v1.8b, #0
138+ ; CHECK-GI-NEXT: mvni v2.8h, #254, lsl #8
139+ ; CHECK-GI-NEXT: urhadd v0.8h, v0.8h, v1.8h
140+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
141+ ; CHECK-GI-NEXT: ret
87142 %x0 = sext <8 x i8 > %a0 to <8 x i16 >
88143 %x1 = sext <8 x i8 > %a1 to <8 x i16 >
89144 %hadd = call <8 x i16 > @llvm.aarch64.neon.urhadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
@@ -92,12 +147,21 @@ define <8 x i16> @urhadd_sext(<8 x i8> %a0, <8 x i8> %a1) {
92147}
93148
94149define <8 x i16 > @hadds_sext (<8 x i8 > %a0 , <8 x i8 > %a1 ) {
95- ; CHECK-LABEL: hadds_sext:
96- ; CHECK: // %bb.0:
97- ; CHECK-NEXT: shadd v0.8b, v0.8b, v1.8b
98- ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
99- ; CHECK-NEXT: bic v0.8h, #254, lsl #8
100- ; CHECK-NEXT: ret
150+ ; CHECK-SD-LABEL: hadds_sext:
151+ ; CHECK-SD: // %bb.0:
152+ ; CHECK-SD-NEXT: shadd v0.8b, v0.8b, v1.8b
153+ ; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0
154+ ; CHECK-SD-NEXT: bic v0.8h, #254, lsl #8
155+ ; CHECK-SD-NEXT: ret
156+ ;
157+ ; CHECK-GI-LABEL: hadds_sext:
158+ ; CHECK-GI: // %bb.0:
159+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
160+ ; CHECK-GI-NEXT: sshll v1.8h, v1.8b, #0
161+ ; CHECK-GI-NEXT: mvni v2.8h, #254, lsl #8
162+ ; CHECK-GI-NEXT: shadd v0.8h, v0.8h, v1.8h
163+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
164+ ; CHECK-GI-NEXT: ret
101165 %x0 = sext <8 x i8 > %a0 to <8 x i16 >
102166 %x1 = sext <8 x i8 > %a1 to <8 x i16 >
103167 %hadd = call <8 x i16 > @llvm.aarch64.neon.shadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
@@ -106,15 +170,26 @@ define <8 x i16> @hadds_sext(<8 x i8> %a0, <8 x i8> %a1) {
106170}
107171
108172define <8 x i16 > @shaddu_sext (<8 x i8 > %a0 , <8 x i8 > %a1 ) {
109- ; CHECK-LABEL: shaddu_sext:
110- ; CHECK: // %bb.0:
111- ; CHECK-NEXT: srhadd v0.8b, v0.8b, v1.8b
112- ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
113- ; CHECK-NEXT: bic v0.8h, #254, lsl #8
114- ; CHECK-NEXT: ret
173+ ; CHECK-SD-LABEL: shaddu_sext:
174+ ; CHECK-SD: // %bb.0:
175+ ; CHECK-SD-NEXT: srhadd v0.8b, v0.8b, v1.8b
176+ ; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0
177+ ; CHECK-SD-NEXT: bic v0.8h, #254, lsl #8
178+ ; CHECK-SD-NEXT: ret
179+ ;
180+ ; CHECK-GI-LABEL: shaddu_sext:
181+ ; CHECK-GI: // %bb.0:
182+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
183+ ; CHECK-GI-NEXT: sshll v1.8h, v1.8b, #0
184+ ; CHECK-GI-NEXT: mvni v2.8h, #254, lsl #8
185+ ; CHECK-GI-NEXT: srhadd v0.8h, v0.8h, v1.8h
186+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
187+ ; CHECK-GI-NEXT: ret
115188 %x0 = sext <8 x i8 > %a0 to <8 x i16 >
116189 %x1 = sext <8 x i8 > %a1 to <8 x i16 >
117190 %hadd = call <8 x i16 > @llvm.aarch64.neon.srhadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
118191 %res = and <8 x i16 > %hadd , <i16 511 , i16 511 , i16 511 , i16 511 , i16 511 , i16 511 , i16 511 , i16 511 >
119192 ret <8 x i16 > %res
120193}
194+ ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
195+ ; CHECK: {{.*}}
0 commit comments