1 ; RUN: llc < %s -march=arm64 -arm64-neon-syntax=apple -enable-misched=false | FileCheck %s
3 define <8 x i8> @sqshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
6 %tmp1 = load <8 x i8>* %A
7 %tmp2 = load <8 x i8>* %B
8 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
12 define <4 x i16> @sqshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
13 ;CHECK-LABEL: sqshl4h:
15 %tmp1 = load <4 x i16>* %A
16 %tmp2 = load <4 x i16>* %B
17 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
21 define <2 x i32> @sqshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
22 ;CHECK-LABEL: sqshl2s:
24 %tmp1 = load <2 x i32>* %A
25 %tmp2 = load <2 x i32>* %B
26 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
30 define <8 x i8> @uqshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
31 ;CHECK-LABEL: uqshl8b:
33 %tmp1 = load <8 x i8>* %A
34 %tmp2 = load <8 x i8>* %B
35 %tmp3 = call <8 x i8> @llvm.arm64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
39 define <4 x i16> @uqshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
40 ;CHECK-LABEL: uqshl4h:
42 %tmp1 = load <4 x i16>* %A
43 %tmp2 = load <4 x i16>* %B
44 %tmp3 = call <4 x i16> @llvm.arm64.neon.uqshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
48 define <2 x i32> @uqshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
49 ;CHECK-LABEL: uqshl2s:
51 %tmp1 = load <2 x i32>* %A
52 %tmp2 = load <2 x i32>* %B
53 %tmp3 = call <2 x i32> @llvm.arm64.neon.uqshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
57 define <16 x i8> @sqshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
58 ;CHECK-LABEL: sqshl16b:
60 %tmp1 = load <16 x i8>* %A
61 %tmp2 = load <16 x i8>* %B
62 %tmp3 = call <16 x i8> @llvm.arm64.neon.sqshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
66 define <8 x i16> @sqshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
67 ;CHECK-LABEL: sqshl8h:
69 %tmp1 = load <8 x i16>* %A
70 %tmp2 = load <8 x i16>* %B
71 %tmp3 = call <8 x i16> @llvm.arm64.neon.sqshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
75 define <4 x i32> @sqshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
76 ;CHECK-LABEL: sqshl4s:
78 %tmp1 = load <4 x i32>* %A
79 %tmp2 = load <4 x i32>* %B
80 %tmp3 = call <4 x i32> @llvm.arm64.neon.sqshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
84 define <2 x i64> @sqshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
85 ;CHECK-LABEL: sqshl2d:
87 %tmp1 = load <2 x i64>* %A
88 %tmp2 = load <2 x i64>* %B
89 %tmp3 = call <2 x i64> @llvm.arm64.neon.sqshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
93 define <16 x i8> @uqshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
94 ;CHECK-LABEL: uqshl16b:
96 %tmp1 = load <16 x i8>* %A
97 %tmp2 = load <16 x i8>* %B
98 %tmp3 = call <16 x i8> @llvm.arm64.neon.uqshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
102 define <8 x i16> @uqshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
103 ;CHECK-LABEL: uqshl8h:
105 %tmp1 = load <8 x i16>* %A
106 %tmp2 = load <8 x i16>* %B
107 %tmp3 = call <8 x i16> @llvm.arm64.neon.uqshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
111 define <4 x i32> @uqshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
112 ;CHECK-LABEL: uqshl4s:
114 %tmp1 = load <4 x i32>* %A
115 %tmp2 = load <4 x i32>* %B
116 %tmp3 = call <4 x i32> @llvm.arm64.neon.uqshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
120 define <2 x i64> @uqshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
121 ;CHECK-LABEL: uqshl2d:
123 %tmp1 = load <2 x i64>* %A
124 %tmp2 = load <2 x i64>* %B
125 %tmp3 = call <2 x i64> @llvm.arm64.neon.uqshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
129 declare <8 x i8> @llvm.arm64.neon.sqshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
130 declare <4 x i16> @llvm.arm64.neon.sqshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
131 declare <2 x i32> @llvm.arm64.neon.sqshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
132 declare <1 x i64> @llvm.arm64.neon.sqshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
134 declare <8 x i8> @llvm.arm64.neon.uqshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
135 declare <4 x i16> @llvm.arm64.neon.uqshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
136 declare <2 x i32> @llvm.arm64.neon.uqshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
137 declare <1 x i64> @llvm.arm64.neon.uqshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
139 declare <16 x i8> @llvm.arm64.neon.sqshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
140 declare <8 x i16> @llvm.arm64.neon.sqshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
141 declare <4 x i32> @llvm.arm64.neon.sqshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
142 declare <2 x i64> @llvm.arm64.neon.sqshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
144 declare <16 x i8> @llvm.arm64.neon.uqshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
145 declare <8 x i16> @llvm.arm64.neon.uqshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
146 declare <4 x i32> @llvm.arm64.neon.uqshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
147 declare <2 x i64> @llvm.arm64.neon.uqshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
149 define <8 x i8> @srshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
150 ;CHECK-LABEL: srshl8b:
152 %tmp1 = load <8 x i8>* %A
153 %tmp2 = load <8 x i8>* %B
154 %tmp3 = call <8 x i8> @llvm.arm64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
158 define <4 x i16> @srshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
159 ;CHECK-LABEL: srshl4h:
161 %tmp1 = load <4 x i16>* %A
162 %tmp2 = load <4 x i16>* %B
163 %tmp3 = call <4 x i16> @llvm.arm64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
167 define <2 x i32> @srshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
168 ;CHECK-LABEL: srshl2s:
170 %tmp1 = load <2 x i32>* %A
171 %tmp2 = load <2 x i32>* %B
172 %tmp3 = call <2 x i32> @llvm.arm64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
176 define <8 x i8> @urshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
177 ;CHECK-LABEL: urshl8b:
179 %tmp1 = load <8 x i8>* %A
180 %tmp2 = load <8 x i8>* %B
181 %tmp3 = call <8 x i8> @llvm.arm64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
185 define <4 x i16> @urshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
186 ;CHECK-LABEL: urshl4h:
188 %tmp1 = load <4 x i16>* %A
189 %tmp2 = load <4 x i16>* %B
190 %tmp3 = call <4 x i16> @llvm.arm64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
194 define <2 x i32> @urshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
195 ;CHECK-LABEL: urshl2s:
197 %tmp1 = load <2 x i32>* %A
198 %tmp2 = load <2 x i32>* %B
199 %tmp3 = call <2 x i32> @llvm.arm64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
203 define <16 x i8> @srshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
204 ;CHECK-LABEL: srshl16b:
206 %tmp1 = load <16 x i8>* %A
207 %tmp2 = load <16 x i8>* %B
208 %tmp3 = call <16 x i8> @llvm.arm64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
212 define <8 x i16> @srshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
213 ;CHECK-LABEL: srshl8h:
215 %tmp1 = load <8 x i16>* %A
216 %tmp2 = load <8 x i16>* %B
217 %tmp3 = call <8 x i16> @llvm.arm64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
221 define <4 x i32> @srshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
222 ;CHECK-LABEL: srshl4s:
224 %tmp1 = load <4 x i32>* %A
225 %tmp2 = load <4 x i32>* %B
226 %tmp3 = call <4 x i32> @llvm.arm64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
230 define <2 x i64> @srshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
231 ;CHECK-LABEL: srshl2d:
233 %tmp1 = load <2 x i64>* %A
234 %tmp2 = load <2 x i64>* %B
235 %tmp3 = call <2 x i64> @llvm.arm64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
239 define <16 x i8> @urshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
240 ;CHECK-LABEL: urshl16b:
242 %tmp1 = load <16 x i8>* %A
243 %tmp2 = load <16 x i8>* %B
244 %tmp3 = call <16 x i8> @llvm.arm64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
248 define <8 x i16> @urshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
249 ;CHECK-LABEL: urshl8h:
251 %tmp1 = load <8 x i16>* %A
252 %tmp2 = load <8 x i16>* %B
253 %tmp3 = call <8 x i16> @llvm.arm64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
257 define <4 x i32> @urshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
258 ;CHECK-LABEL: urshl4s:
260 %tmp1 = load <4 x i32>* %A
261 %tmp2 = load <4 x i32>* %B
262 %tmp3 = call <4 x i32> @llvm.arm64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
266 define <2 x i64> @urshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
267 ;CHECK-LABEL: urshl2d:
269 %tmp1 = load <2 x i64>* %A
270 %tmp2 = load <2 x i64>* %B
271 %tmp3 = call <2 x i64> @llvm.arm64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
275 declare <8 x i8> @llvm.arm64.neon.srshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
276 declare <4 x i16> @llvm.arm64.neon.srshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
277 declare <2 x i32> @llvm.arm64.neon.srshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
278 declare <1 x i64> @llvm.arm64.neon.srshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
280 declare <8 x i8> @llvm.arm64.neon.urshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
281 declare <4 x i16> @llvm.arm64.neon.urshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
282 declare <2 x i32> @llvm.arm64.neon.urshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
283 declare <1 x i64> @llvm.arm64.neon.urshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
285 declare <16 x i8> @llvm.arm64.neon.srshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
286 declare <8 x i16> @llvm.arm64.neon.srshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
287 declare <4 x i32> @llvm.arm64.neon.srshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
288 declare <2 x i64> @llvm.arm64.neon.srshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
290 declare <16 x i8> @llvm.arm64.neon.urshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
291 declare <8 x i16> @llvm.arm64.neon.urshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
292 declare <4 x i32> @llvm.arm64.neon.urshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
293 declare <2 x i64> @llvm.arm64.neon.urshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
295 define <8 x i8> @sqrshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
296 ;CHECK-LABEL: sqrshl8b:
298 %tmp1 = load <8 x i8>* %A
299 %tmp2 = load <8 x i8>* %B
300 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqrshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
304 define <4 x i16> @sqrshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
305 ;CHECK-LABEL: sqrshl4h:
307 %tmp1 = load <4 x i16>* %A
308 %tmp2 = load <4 x i16>* %B
309 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqrshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
313 define <2 x i32> @sqrshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
314 ;CHECK-LABEL: sqrshl2s:
316 %tmp1 = load <2 x i32>* %A
317 %tmp2 = load <2 x i32>* %B
318 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqrshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
322 define <8 x i8> @uqrshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
323 ;CHECK-LABEL: uqrshl8b:
325 %tmp1 = load <8 x i8>* %A
326 %tmp2 = load <8 x i8>* %B
327 %tmp3 = call <8 x i8> @llvm.arm64.neon.uqrshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
331 define <4 x i16> @uqrshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
332 ;CHECK-LABEL: uqrshl4h:
334 %tmp1 = load <4 x i16>* %A
335 %tmp2 = load <4 x i16>* %B
336 %tmp3 = call <4 x i16> @llvm.arm64.neon.uqrshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
340 define <2 x i32> @uqrshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
341 ;CHECK-LABEL: uqrshl2s:
343 %tmp1 = load <2 x i32>* %A
344 %tmp2 = load <2 x i32>* %B
345 %tmp3 = call <2 x i32> @llvm.arm64.neon.uqrshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
349 define <16 x i8> @sqrshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
350 ;CHECK-LABEL: sqrshl16b:
352 %tmp1 = load <16 x i8>* %A
353 %tmp2 = load <16 x i8>* %B
354 %tmp3 = call <16 x i8> @llvm.arm64.neon.sqrshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
358 define <8 x i16> @sqrshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
359 ;CHECK-LABEL: sqrshl8h:
361 %tmp1 = load <8 x i16>* %A
362 %tmp2 = load <8 x i16>* %B
363 %tmp3 = call <8 x i16> @llvm.arm64.neon.sqrshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
367 define <4 x i32> @sqrshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
368 ;CHECK-LABEL: sqrshl4s:
370 %tmp1 = load <4 x i32>* %A
371 %tmp2 = load <4 x i32>* %B
372 %tmp3 = call <4 x i32> @llvm.arm64.neon.sqrshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
376 define <2 x i64> @sqrshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
377 ;CHECK-LABEL: sqrshl2d:
379 %tmp1 = load <2 x i64>* %A
380 %tmp2 = load <2 x i64>* %B
381 %tmp3 = call <2 x i64> @llvm.arm64.neon.sqrshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
385 define <16 x i8> @uqrshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
386 ;CHECK-LABEL: uqrshl16b:
388 %tmp1 = load <16 x i8>* %A
389 %tmp2 = load <16 x i8>* %B
390 %tmp3 = call <16 x i8> @llvm.arm64.neon.uqrshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
394 define <8 x i16> @uqrshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
395 ;CHECK-LABEL: uqrshl8h:
397 %tmp1 = load <8 x i16>* %A
398 %tmp2 = load <8 x i16>* %B
399 %tmp3 = call <8 x i16> @llvm.arm64.neon.uqrshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
403 define <4 x i32> @uqrshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
404 ;CHECK-LABEL: uqrshl4s:
406 %tmp1 = load <4 x i32>* %A
407 %tmp2 = load <4 x i32>* %B
408 %tmp3 = call <4 x i32> @llvm.arm64.neon.uqrshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
412 define <2 x i64> @uqrshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
413 ;CHECK-LABEL: uqrshl2d:
415 %tmp1 = load <2 x i64>* %A
416 %tmp2 = load <2 x i64>* %B
417 %tmp3 = call <2 x i64> @llvm.arm64.neon.uqrshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
421 declare <8 x i8> @llvm.arm64.neon.sqrshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
422 declare <4 x i16> @llvm.arm64.neon.sqrshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
423 declare <2 x i32> @llvm.arm64.neon.sqrshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
424 declare <1 x i64> @llvm.arm64.neon.sqrshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
426 declare <8 x i8> @llvm.arm64.neon.uqrshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
427 declare <4 x i16> @llvm.arm64.neon.uqrshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
428 declare <2 x i32> @llvm.arm64.neon.uqrshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
429 declare <1 x i64> @llvm.arm64.neon.uqrshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
431 declare <16 x i8> @llvm.arm64.neon.sqrshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
432 declare <8 x i16> @llvm.arm64.neon.sqrshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
433 declare <4 x i32> @llvm.arm64.neon.sqrshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
434 declare <2 x i64> @llvm.arm64.neon.sqrshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
436 declare <16 x i8> @llvm.arm64.neon.uqrshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
437 declare <8 x i16> @llvm.arm64.neon.uqrshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
438 declare <4 x i32> @llvm.arm64.neon.uqrshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
439 declare <2 x i64> @llvm.arm64.neon.uqrshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
441 define <8 x i8> @urshr8b(<8 x i8>* %A) nounwind {
442 ;CHECK-LABEL: urshr8b:
444 %tmp1 = load <8 x i8>* %A
445 %tmp3 = call <8 x i8> @llvm.arm64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
449 define <4 x i16> @urshr4h(<4 x i16>* %A) nounwind {
450 ;CHECK-LABEL: urshr4h:
452 %tmp1 = load <4 x i16>* %A
453 %tmp3 = call <4 x i16> @llvm.arm64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
457 define <2 x i32> @urshr2s(<2 x i32>* %A) nounwind {
458 ;CHECK-LABEL: urshr2s:
460 %tmp1 = load <2 x i32>* %A
461 %tmp3 = call <2 x i32> @llvm.arm64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
465 define <16 x i8> @urshr16b(<16 x i8>* %A) nounwind {
466 ;CHECK-LABEL: urshr16b:
468 %tmp1 = load <16 x i8>* %A
469 %tmp3 = call <16 x i8> @llvm.arm64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
473 define <8 x i16> @urshr8h(<8 x i16>* %A) nounwind {
474 ;CHECK-LABEL: urshr8h:
476 %tmp1 = load <8 x i16>* %A
477 %tmp3 = call <8 x i16> @llvm.arm64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
481 define <4 x i32> @urshr4s(<4 x i32>* %A) nounwind {
482 ;CHECK-LABEL: urshr4s:
484 %tmp1 = load <4 x i32>* %A
485 %tmp3 = call <4 x i32> @llvm.arm64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
489 define <2 x i64> @urshr2d(<2 x i64>* %A) nounwind {
490 ;CHECK-LABEL: urshr2d:
492 %tmp1 = load <2 x i64>* %A
493 %tmp3 = call <2 x i64> @llvm.arm64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
497 define <8 x i8> @srshr8b(<8 x i8>* %A) nounwind {
498 ;CHECK-LABEL: srshr8b:
500 %tmp1 = load <8 x i8>* %A
501 %tmp3 = call <8 x i8> @llvm.arm64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
505 define <4 x i16> @srshr4h(<4 x i16>* %A) nounwind {
506 ;CHECK-LABEL: srshr4h:
508 %tmp1 = load <4 x i16>* %A
509 %tmp3 = call <4 x i16> @llvm.arm64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
513 define <2 x i32> @srshr2s(<2 x i32>* %A) nounwind {
514 ;CHECK-LABEL: srshr2s:
516 %tmp1 = load <2 x i32>* %A
517 %tmp3 = call <2 x i32> @llvm.arm64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
521 define <16 x i8> @srshr16b(<16 x i8>* %A) nounwind {
522 ;CHECK-LABEL: srshr16b:
524 %tmp1 = load <16 x i8>* %A
525 %tmp3 = call <16 x i8> @llvm.arm64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
529 define <8 x i16> @srshr8h(<8 x i16>* %A) nounwind {
530 ;CHECK-LABEL: srshr8h:
532 %tmp1 = load <8 x i16>* %A
533 %tmp3 = call <8 x i16> @llvm.arm64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
537 define <4 x i32> @srshr4s(<4 x i32>* %A) nounwind {
538 ;CHECK-LABEL: srshr4s:
540 %tmp1 = load <4 x i32>* %A
541 %tmp3 = call <4 x i32> @llvm.arm64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
545 define <2 x i64> @srshr2d(<2 x i64>* %A) nounwind {
546 ;CHECK-LABEL: srshr2d:
548 %tmp1 = load <2 x i64>* %A
549 %tmp3 = call <2 x i64> @llvm.arm64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
553 define <8 x i8> @sqshlu8b(<8 x i8>* %A) nounwind {
554 ;CHECK-LABEL: sqshlu8b:
555 ;CHECK: sqshlu.8b v0, {{v[0-9]+}}, #1
556 %tmp1 = load <8 x i8>* %A
557 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqshlu.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
561 define <4 x i16> @sqshlu4h(<4 x i16>* %A) nounwind {
562 ;CHECK-LABEL: sqshlu4h:
563 ;CHECK: sqshlu.4h v0, {{v[0-9]+}}, #1
564 %tmp1 = load <4 x i16>* %A
565 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqshlu.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
569 define <2 x i32> @sqshlu2s(<2 x i32>* %A) nounwind {
570 ;CHECK-LABEL: sqshlu2s:
571 ;CHECK: sqshlu.2s v0, {{v[0-9]+}}, #1
572 %tmp1 = load <2 x i32>* %A
573 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqshlu.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
577 define <16 x i8> @sqshlu16b(<16 x i8>* %A) nounwind {
578 ;CHECK-LABEL: sqshlu16b:
579 ;CHECK: sqshlu.16b v0, {{v[0-9]+}}, #1
580 %tmp1 = load <16 x i8>* %A
581 %tmp3 = call <16 x i8> @llvm.arm64.neon.sqshlu.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
585 define <8 x i16> @sqshlu8h(<8 x i16>* %A) nounwind {
586 ;CHECK-LABEL: sqshlu8h:
587 ;CHECK: sqshlu.8h v0, {{v[0-9]+}}, #1
588 %tmp1 = load <8 x i16>* %A
589 %tmp3 = call <8 x i16> @llvm.arm64.neon.sqshlu.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
593 define <4 x i32> @sqshlu4s(<4 x i32>* %A) nounwind {
594 ;CHECK-LABEL: sqshlu4s:
595 ;CHECK: sqshlu.4s v0, {{v[0-9]+}}, #1
596 %tmp1 = load <4 x i32>* %A
597 %tmp3 = call <4 x i32> @llvm.arm64.neon.sqshlu.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
601 define <2 x i64> @sqshlu2d(<2 x i64>* %A) nounwind {
602 ;CHECK-LABEL: sqshlu2d:
603 ;CHECK: sqshlu.2d v0, {{v[0-9]+}}, #1
604 %tmp1 = load <2 x i64>* %A
605 %tmp3 = call <2 x i64> @llvm.arm64.neon.sqshlu.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
609 declare <8 x i8> @llvm.arm64.neon.sqshlu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
610 declare <4 x i16> @llvm.arm64.neon.sqshlu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
611 declare <2 x i32> @llvm.arm64.neon.sqshlu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
612 declare <1 x i64> @llvm.arm64.neon.sqshlu.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
614 declare <16 x i8> @llvm.arm64.neon.sqshlu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
615 declare <8 x i16> @llvm.arm64.neon.sqshlu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
616 declare <4 x i32> @llvm.arm64.neon.sqshlu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
617 declare <2 x i64> @llvm.arm64.neon.sqshlu.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
619 define <8 x i8> @rshrn8b(<8 x i16>* %A) nounwind {
620 ;CHECK-LABEL: rshrn8b:
621 ;CHECK: rshrn.8b v0, {{v[0-9]+}}, #1
622 %tmp1 = load <8 x i16>* %A
623 %tmp3 = call <8 x i8> @llvm.arm64.neon.rshrn.v8i8(<8 x i16> %tmp1, i32 1)
627 define <4 x i16> @rshrn4h(<4 x i32>* %A) nounwind {
628 ;CHECK-LABEL: rshrn4h:
629 ;CHECK: rshrn.4h v0, {{v[0-9]+}}, #1
630 %tmp1 = load <4 x i32>* %A
631 %tmp3 = call <4 x i16> @llvm.arm64.neon.rshrn.v4i16(<4 x i32> %tmp1, i32 1)
635 define <2 x i32> @rshrn2s(<2 x i64>* %A) nounwind {
636 ;CHECK-LABEL: rshrn2s:
637 ;CHECK: rshrn.2s v0, {{v[0-9]+}}, #1
638 %tmp1 = load <2 x i64>* %A
639 %tmp3 = call <2 x i32> @llvm.arm64.neon.rshrn.v2i32(<2 x i64> %tmp1, i32 1)
643 define <16 x i8> @rshrn16b(<8 x i8> *%ret, <8 x i16>* %A) nounwind {
644 ;CHECK-LABEL: rshrn16b:
645 ;CHECK: rshrn2.16b v0, {{v[0-9]+}}, #1
646 %out = load <8 x i8>* %ret
647 %tmp1 = load <8 x i16>* %A
648 %tmp3 = call <8 x i8> @llvm.arm64.neon.rshrn.v8i8(<8 x i16> %tmp1, i32 1)
649 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
653 define <8 x i16> @rshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
654 ;CHECK-LABEL: rshrn8h:
655 ;CHECK: rshrn2.8h v0, {{v[0-9]+}}, #1
656 %out = load <4 x i16>* %ret
657 %tmp1 = load <4 x i32>* %A
658 %tmp3 = call <4 x i16> @llvm.arm64.neon.rshrn.v4i16(<4 x i32> %tmp1, i32 1)
659 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
663 define <4 x i32> @rshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
664 ;CHECK-LABEL: rshrn4s:
665 ;CHECK: rshrn2.4s v0, {{v[0-9]+}}, #1
666 %out = load <2 x i32>* %ret
667 %tmp1 = load <2 x i64>* %A
668 %tmp3 = call <2 x i32> @llvm.arm64.neon.rshrn.v2i32(<2 x i64> %tmp1, i32 1)
669 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
673 declare <8 x i8> @llvm.arm64.neon.rshrn.v8i8(<8 x i16>, i32) nounwind readnone
674 declare <4 x i16> @llvm.arm64.neon.rshrn.v4i16(<4 x i32>, i32) nounwind readnone
675 declare <2 x i32> @llvm.arm64.neon.rshrn.v2i32(<2 x i64>, i32) nounwind readnone
677 define <8 x i8> @shrn8b(<8 x i16>* %A) nounwind {
678 ;CHECK-LABEL: shrn8b:
679 ;CHECK: shrn.8b v0, {{v[0-9]+}}, #1
680 %tmp1 = load <8 x i16>* %A
681 %tmp2 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
682 %tmp3 = trunc <8 x i16> %tmp2 to <8 x i8>
686 define <4 x i16> @shrn4h(<4 x i32>* %A) nounwind {
687 ;CHECK-LABEL: shrn4h:
688 ;CHECK: shrn.4h v0, {{v[0-9]+}}, #1
689 %tmp1 = load <4 x i32>* %A
690 %tmp2 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
691 %tmp3 = trunc <4 x i32> %tmp2 to <4 x i16>
695 define <2 x i32> @shrn2s(<2 x i64>* %A) nounwind {
696 ;CHECK-LABEL: shrn2s:
697 ;CHECK: shrn.2s v0, {{v[0-9]+}}, #1
698 %tmp1 = load <2 x i64>* %A
699 %tmp2 = lshr <2 x i64> %tmp1, <i64 1, i64 1>
700 %tmp3 = trunc <2 x i64> %tmp2 to <2 x i32>
704 define <16 x i8> @shrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
705 ;CHECK-LABEL: shrn16b:
706 ;CHECK: shrn2.16b v0, {{v[0-9]+}}, #1
707 %out = load <8 x i8>* %ret
708 %tmp1 = load <8 x i16>* %A
709 %tmp2 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
710 %tmp3 = trunc <8 x i16> %tmp2 to <8 x i8>
711 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
715 define <8 x i16> @shrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
716 ;CHECK-LABEL: shrn8h:
717 ;CHECK: shrn2.8h v0, {{v[0-9]+}}, #1
718 %out = load <4 x i16>* %ret
719 %tmp1 = load <4 x i32>* %A
720 %tmp2 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
721 %tmp3 = trunc <4 x i32> %tmp2 to <4 x i16>
722 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
726 define <4 x i32> @shrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
727 ;CHECK-LABEL: shrn4s:
728 ;CHECK: shrn2.4s v0, {{v[0-9]+}}, #1
729 %out = load <2 x i32>* %ret
730 %tmp1 = load <2 x i64>* %A
731 %tmp2 = lshr <2 x i64> %tmp1, <i64 1, i64 1>
732 %tmp3 = trunc <2 x i64> %tmp2 to <2 x i32>
733 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
737 declare <8 x i8> @llvm.arm64.neon.shrn.v8i8(<8 x i16>, i32) nounwind readnone
738 declare <4 x i16> @llvm.arm64.neon.shrn.v4i16(<4 x i32>, i32) nounwind readnone
739 declare <2 x i32> @llvm.arm64.neon.shrn.v2i32(<2 x i64>, i32) nounwind readnone
741 define i32 @sqshrn1s(i64 %A) nounwind {
742 ; CHECK-LABEL: sqshrn1s:
743 ; CHECK: sqshrn {{s[0-9]+}}, d0, #1
744 %tmp = call i32 @llvm.arm64.neon.sqshrn.i32(i64 %A, i32 1)
748 define <8 x i8> @sqshrn8b(<8 x i16>* %A) nounwind {
749 ;CHECK-LABEL: sqshrn8b:
750 ;CHECK: sqshrn.8b v0, {{v[0-9]+}}, #1
751 %tmp1 = load <8 x i16>* %A
752 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqshrn.v8i8(<8 x i16> %tmp1, i32 1)
756 define <4 x i16> @sqshrn4h(<4 x i32>* %A) nounwind {
757 ;CHECK-LABEL: sqshrn4h:
758 ;CHECK: sqshrn.4h v0, {{v[0-9]+}}, #1
759 %tmp1 = load <4 x i32>* %A
760 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqshrn.v4i16(<4 x i32> %tmp1, i32 1)
764 define <2 x i32> @sqshrn2s(<2 x i64>* %A) nounwind {
765 ;CHECK-LABEL: sqshrn2s:
766 ;CHECK: sqshrn.2s v0, {{v[0-9]+}}, #1
767 %tmp1 = load <2 x i64>* %A
768 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqshrn.v2i32(<2 x i64> %tmp1, i32 1)
773 define <16 x i8> @sqshrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
774 ;CHECK-LABEL: sqshrn16b:
775 ;CHECK: sqshrn2.16b v0, {{v[0-9]+}}, #1
776 %out = load <8 x i8>* %ret
777 %tmp1 = load <8 x i16>* %A
778 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqshrn.v8i8(<8 x i16> %tmp1, i32 1)
779 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
783 define <8 x i16> @sqshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
784 ;CHECK-LABEL: sqshrn8h:
785 ;CHECK: sqshrn2.8h v0, {{v[0-9]+}}, #1
786 %out = load <4 x i16>* %ret
787 %tmp1 = load <4 x i32>* %A
788 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqshrn.v4i16(<4 x i32> %tmp1, i32 1)
789 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
793 define <4 x i32> @sqshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
794 ;CHECK-LABEL: sqshrn4s:
795 ;CHECK: sqshrn2.4s v0, {{v[0-9]+}}, #1
796 %out = load <2 x i32>* %ret
797 %tmp1 = load <2 x i64>* %A
798 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqshrn.v2i32(<2 x i64> %tmp1, i32 1)
799 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
803 declare i32 @llvm.arm64.neon.sqshrn.i32(i64, i32) nounwind readnone
804 declare <8 x i8> @llvm.arm64.neon.sqshrn.v8i8(<8 x i16>, i32) nounwind readnone
805 declare <4 x i16> @llvm.arm64.neon.sqshrn.v4i16(<4 x i32>, i32) nounwind readnone
806 declare <2 x i32> @llvm.arm64.neon.sqshrn.v2i32(<2 x i64>, i32) nounwind readnone
808 define i32 @sqshrun1s(i64 %A) nounwind {
809 ; CHECK-LABEL: sqshrun1s:
810 ; CHECK: sqshrun {{s[0-9]+}}, d0, #1
811 %tmp = call i32 @llvm.arm64.neon.sqshrun.i32(i64 %A, i32 1)
815 define <8 x i8> @sqshrun8b(<8 x i16>* %A) nounwind {
816 ;CHECK-LABEL: sqshrun8b:
817 ;CHECK: sqshrun.8b v0, {{v[0-9]+}}, #1
818 %tmp1 = load <8 x i16>* %A
819 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqshrun.v8i8(<8 x i16> %tmp1, i32 1)
823 define <4 x i16> @sqshrun4h(<4 x i32>* %A) nounwind {
824 ;CHECK-LABEL: sqshrun4h:
825 ;CHECK: sqshrun.4h v0, {{v[0-9]+}}, #1
826 %tmp1 = load <4 x i32>* %A
827 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqshrun.v4i16(<4 x i32> %tmp1, i32 1)
831 define <2 x i32> @sqshrun2s(<2 x i64>* %A) nounwind {
832 ;CHECK-LABEL: sqshrun2s:
833 ;CHECK: sqshrun.2s v0, {{v[0-9]+}}, #1
834 %tmp1 = load <2 x i64>* %A
835 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqshrun.v2i32(<2 x i64> %tmp1, i32 1)
839 define <16 x i8> @sqshrun16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
840 ;CHECK-LABEL: sqshrun16b:
841 ;CHECK: sqshrun2.16b v0, {{v[0-9]+}}, #1
842 %out = load <8 x i8>* %ret
843 %tmp1 = load <8 x i16>* %A
844 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqshrun.v8i8(<8 x i16> %tmp1, i32 1)
845 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
849 define <8 x i16> @sqshrun8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
850 ;CHECK-LABEL: sqshrun8h:
851 ;CHECK: sqshrun2.8h v0, {{v[0-9]+}}, #1
852 %out = load <4 x i16>* %ret
853 %tmp1 = load <4 x i32>* %A
854 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqshrun.v4i16(<4 x i32> %tmp1, i32 1)
855 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
859 define <4 x i32> @sqshrun4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
860 ;CHECK-LABEL: sqshrun4s:
861 ;CHECK: sqshrun2.4s v0, {{v[0-9]+}}, #1
862 %out = load <2 x i32>* %ret
863 %tmp1 = load <2 x i64>* %A
864 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqshrun.v2i32(<2 x i64> %tmp1, i32 1)
865 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
869 declare i32 @llvm.arm64.neon.sqshrun.i32(i64, i32) nounwind readnone
870 declare <8 x i8> @llvm.arm64.neon.sqshrun.v8i8(<8 x i16>, i32) nounwind readnone
871 declare <4 x i16> @llvm.arm64.neon.sqshrun.v4i16(<4 x i32>, i32) nounwind readnone
872 declare <2 x i32> @llvm.arm64.neon.sqshrun.v2i32(<2 x i64>, i32) nounwind readnone
874 define i32 @sqrshrn1s(i64 %A) nounwind {
875 ; CHECK-LABEL: sqrshrn1s:
876 ; CHECK: sqrshrn {{s[0-9]+}}, d0, #1
877 %tmp = call i32 @llvm.arm64.neon.sqrshrn.i32(i64 %A, i32 1)
881 define <8 x i8> @sqrshrn8b(<8 x i16>* %A) nounwind {
882 ;CHECK-LABEL: sqrshrn8b:
883 ;CHECK: sqrshrn.8b v0, {{v[0-9]+}}, #1
884 %tmp1 = load <8 x i16>* %A
885 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
889 define <4 x i16> @sqrshrn4h(<4 x i32>* %A) nounwind {
890 ;CHECK-LABEL: sqrshrn4h:
891 ;CHECK: sqrshrn.4h v0, {{v[0-9]+}}, #1
892 %tmp1 = load <4 x i32>* %A
893 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
897 define <2 x i32> @sqrshrn2s(<2 x i64>* %A) nounwind {
898 ;CHECK-LABEL: sqrshrn2s:
899 ;CHECK: sqrshrn.2s v0, {{v[0-9]+}}, #1
900 %tmp1 = load <2 x i64>* %A
901 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
905 define <16 x i8> @sqrshrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
906 ;CHECK-LABEL: sqrshrn16b:
907 ;CHECK: sqrshrn2.16b v0, {{v[0-9]+}}, #1
908 %out = load <8 x i8>* %ret
909 %tmp1 = load <8 x i16>* %A
910 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
911 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
915 define <8 x i16> @sqrshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
916 ;CHECK-LABEL: sqrshrn8h:
917 ;CHECK: sqrshrn2.8h v0, {{v[0-9]+}}, #1
918 %out = load <4 x i16>* %ret
919 %tmp1 = load <4 x i32>* %A
920 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
921 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
925 define <4 x i32> @sqrshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
926 ;CHECK-LABEL: sqrshrn4s:
927 ;CHECK: sqrshrn2.4s v0, {{v[0-9]+}}, #1
928 %out = load <2 x i32>* %ret
929 %tmp1 = load <2 x i64>* %A
930 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
931 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
935 declare i32 @llvm.arm64.neon.sqrshrn.i32(i64, i32) nounwind readnone
936 declare <8 x i8> @llvm.arm64.neon.sqrshrn.v8i8(<8 x i16>, i32) nounwind readnone
937 declare <4 x i16> @llvm.arm64.neon.sqrshrn.v4i16(<4 x i32>, i32) nounwind readnone
938 declare <2 x i32> @llvm.arm64.neon.sqrshrn.v2i32(<2 x i64>, i32) nounwind readnone
940 define i32 @sqrshrun1s(i64 %A) nounwind {
941 ; CHECK-LABEL: sqrshrun1s:
942 ; CHECK: sqrshrun {{s[0-9]+}}, d0, #1
943 %tmp = call i32 @llvm.arm64.neon.sqrshrun.i32(i64 %A, i32 1)
947 define <8 x i8> @sqrshrun8b(<8 x i16>* %A) nounwind {
948 ;CHECK-LABEL: sqrshrun8b:
949 ;CHECK: sqrshrun.8b v0, {{v[0-9]+}}, #1
950 %tmp1 = load <8 x i16>* %A
951 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqrshrun.v8i8(<8 x i16> %tmp1, i32 1)
955 define <4 x i16> @sqrshrun4h(<4 x i32>* %A) nounwind {
956 ;CHECK-LABEL: sqrshrun4h:
957 ;CHECK: sqrshrun.4h v0, {{v[0-9]+}}, #1
958 %tmp1 = load <4 x i32>* %A
959 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqrshrun.v4i16(<4 x i32> %tmp1, i32 1)
963 define <2 x i32> @sqrshrun2s(<2 x i64>* %A) nounwind {
964 ;CHECK-LABEL: sqrshrun2s:
965 ;CHECK: sqrshrun.2s v0, {{v[0-9]+}}, #1
966 %tmp1 = load <2 x i64>* %A
967 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqrshrun.v2i32(<2 x i64> %tmp1, i32 1)
971 define <16 x i8> @sqrshrun16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
972 ;CHECK-LABEL: sqrshrun16b:
973 ;CHECK: sqrshrun2.16b v0, {{v[0-9]+}}, #1
974 %out = load <8 x i8>* %ret
975 %tmp1 = load <8 x i16>* %A
976 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqrshrun.v8i8(<8 x i16> %tmp1, i32 1)
977 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
981 define <8 x i16> @sqrshrun8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
982 ;CHECK-LABEL: sqrshrun8h:
983 ;CHECK: sqrshrun2.8h v0, {{v[0-9]+}}, #1
984 %out = load <4 x i16>* %ret
985 %tmp1 = load <4 x i32>* %A
986 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqrshrun.v4i16(<4 x i32> %tmp1, i32 1)
987 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
991 define <4 x i32> @sqrshrun4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
992 ;CHECK-LABEL: sqrshrun4s:
993 ;CHECK: sqrshrun2.4s v0, {{v[0-9]+}}, #1
994 %out = load <2 x i32>* %ret
995 %tmp1 = load <2 x i64>* %A
996 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqrshrun.v2i32(<2 x i64> %tmp1, i32 1)
997 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1001 declare i32 @llvm.arm64.neon.sqrshrun.i32(i64, i32) nounwind readnone
1002 declare <8 x i8> @llvm.arm64.neon.sqrshrun.v8i8(<8 x i16>, i32) nounwind readnone
1003 declare <4 x i16> @llvm.arm64.neon.sqrshrun.v4i16(<4 x i32>, i32) nounwind readnone
1004 declare <2 x i32> @llvm.arm64.neon.sqrshrun.v2i32(<2 x i64>, i32) nounwind readnone
1006 define i32 @uqrshrn1s(i64 %A) nounwind {
1007 ; CHECK-LABEL: uqrshrn1s:
1008 ; CHECK: uqrshrn {{s[0-9]+}}, d0, #1
1009 %tmp = call i32 @llvm.arm64.neon.uqrshrn.i32(i64 %A, i32 1)
1013 define <8 x i8> @uqrshrn8b(<8 x i16>* %A) nounwind {
1014 ;CHECK-LABEL: uqrshrn8b:
1015 ;CHECK: uqrshrn.8b v0, {{v[0-9]+}}, #1
1016 %tmp1 = load <8 x i16>* %A
1017 %tmp3 = call <8 x i8> @llvm.arm64.neon.uqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
1021 define <4 x i16> @uqrshrn4h(<4 x i32>* %A) nounwind {
1022 ;CHECK-LABEL: uqrshrn4h:
1023 ;CHECK: uqrshrn.4h v0, {{v[0-9]+}}, #1
1024 %tmp1 = load <4 x i32>* %A
1025 %tmp3 = call <4 x i16> @llvm.arm64.neon.uqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
1029 define <2 x i32> @uqrshrn2s(<2 x i64>* %A) nounwind {
1030 ;CHECK-LABEL: uqrshrn2s:
1031 ;CHECK: uqrshrn.2s v0, {{v[0-9]+}}, #1
1032 %tmp1 = load <2 x i64>* %A
1033 %tmp3 = call <2 x i32> @llvm.arm64.neon.uqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
1037 define <16 x i8> @uqrshrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
1038 ;CHECK-LABEL: uqrshrn16b:
1039 ;CHECK: uqrshrn2.16b v0, {{v[0-9]+}}, #1
1040 %out = load <8 x i8>* %ret
1041 %tmp1 = load <8 x i16>* %A
1042 %tmp3 = call <8 x i8> @llvm.arm64.neon.uqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
1043 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1047 define <8 x i16> @uqrshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
1048 ;CHECK-LABEL: uqrshrn8h:
1049 ;CHECK: uqrshrn2.8h v0, {{v[0-9]+}}, #1
1050 %out = load <4 x i16>* %ret
1051 %tmp1 = load <4 x i32>* %A
1052 %tmp3 = call <4 x i16> @llvm.arm64.neon.uqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
1053 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1057 define <4 x i32> @uqrshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
1058 ;CHECK-LABEL: uqrshrn4s:
1059 ;CHECK: uqrshrn2.4s v0, {{v[0-9]+}}, #1
1060 %out = load <2 x i32>* %ret
1061 %tmp1 = load <2 x i64>* %A
1062 %tmp3 = call <2 x i32> @llvm.arm64.neon.uqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
1063 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1067 declare i32 @llvm.arm64.neon.uqrshrn.i32(i64, i32) nounwind readnone
1068 declare <8 x i8> @llvm.arm64.neon.uqrshrn.v8i8(<8 x i16>, i32) nounwind readnone
1069 declare <4 x i16> @llvm.arm64.neon.uqrshrn.v4i16(<4 x i32>, i32) nounwind readnone
1070 declare <2 x i32> @llvm.arm64.neon.uqrshrn.v2i32(<2 x i64>, i32) nounwind readnone
1072 define i32 @uqshrn1s(i64 %A) nounwind {
1073 ; CHECK-LABEL: uqshrn1s:
1074 ; CHECK: uqshrn {{s[0-9]+}}, d0, #1
1075 %tmp = call i32 @llvm.arm64.neon.uqshrn.i32(i64 %A, i32 1)
1079 define <8 x i8> @uqshrn8b(<8 x i16>* %A) nounwind {
1080 ;CHECK-LABEL: uqshrn8b:
1081 ;CHECK: uqshrn.8b v0, {{v[0-9]+}}, #1
1082 %tmp1 = load <8 x i16>* %A
1083 %tmp3 = call <8 x i8> @llvm.arm64.neon.uqshrn.v8i8(<8 x i16> %tmp1, i32 1)
1087 define <4 x i16> @uqshrn4h(<4 x i32>* %A) nounwind {
1088 ;CHECK-LABEL: uqshrn4h:
1089 ;CHECK: uqshrn.4h v0, {{v[0-9]+}}, #1
1090 %tmp1 = load <4 x i32>* %A
1091 %tmp3 = call <4 x i16> @llvm.arm64.neon.uqshrn.v4i16(<4 x i32> %tmp1, i32 1)
1095 define <2 x i32> @uqshrn2s(<2 x i64>* %A) nounwind {
1096 ;CHECK-LABEL: uqshrn2s:
1097 ;CHECK: uqshrn.2s v0, {{v[0-9]+}}, #1
1098 %tmp1 = load <2 x i64>* %A
1099 %tmp3 = call <2 x i32> @llvm.arm64.neon.uqshrn.v2i32(<2 x i64> %tmp1, i32 1)
1103 define <16 x i8> @uqshrn16b(<8 x i8>* %ret, <8 x i16>* %A) nounwind {
1104 ;CHECK-LABEL: uqshrn16b:
1105 ;CHECK: uqshrn2.16b v0, {{v[0-9]+}}, #1
1106 %out = load <8 x i8>* %ret
1107 %tmp1 = load <8 x i16>* %A
1108 %tmp3 = call <8 x i8> @llvm.arm64.neon.uqshrn.v8i8(<8 x i16> %tmp1, i32 1)
1109 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1113 define <8 x i16> @uqshrn8h(<4 x i16>* %ret, <4 x i32>* %A) nounwind {
1114 ;CHECK-LABEL: uqshrn8h:
1115 ;CHECK: uqshrn2.8h v0, {{v[0-9]+}}, #1
1116 %out = load <4 x i16>* %ret
1117 %tmp1 = load <4 x i32>* %A
1118 %tmp3 = call <4 x i16> @llvm.arm64.neon.uqshrn.v4i16(<4 x i32> %tmp1, i32 1)
1119 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1123 define <4 x i32> @uqshrn4s(<2 x i32>* %ret, <2 x i64>* %A) nounwind {
1124 ;CHECK-LABEL: uqshrn4s:
1125 ;CHECK: uqshrn2.4s v0, {{v[0-9]+}}, #1
1126 %out = load <2 x i32>* %ret
1127 %tmp1 = load <2 x i64>* %A
1128 %tmp3 = call <2 x i32> @llvm.arm64.neon.uqshrn.v2i32(<2 x i64> %tmp1, i32 1)
1129 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1133 declare i32 @llvm.arm64.neon.uqshrn.i32(i64, i32) nounwind readnone
1134 declare <8 x i8> @llvm.arm64.neon.uqshrn.v8i8(<8 x i16>, i32) nounwind readnone
1135 declare <4 x i16> @llvm.arm64.neon.uqshrn.v4i16(<4 x i32>, i32) nounwind readnone
1136 declare <2 x i32> @llvm.arm64.neon.uqshrn.v2i32(<2 x i64>, i32) nounwind readnone
1138 define <8 x i16> @ushll8h(<8 x i8>* %A) nounwind {
1139 ;CHECK-LABEL: ushll8h:
1140 ;CHECK: ushll.8h v0, {{v[0-9]+}}, #1
1141 %tmp1 = load <8 x i8>* %A
1142 %tmp2 = zext <8 x i8> %tmp1 to <8 x i16>
1143 %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1147 define <4 x i32> @ushll4s(<4 x i16>* %A) nounwind {
1148 ;CHECK-LABEL: ushll4s:
1149 ;CHECK: ushll.4s v0, {{v[0-9]+}}, #1
1150 %tmp1 = load <4 x i16>* %A
1151 %tmp2 = zext <4 x i16> %tmp1 to <4 x i32>
1152 %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>
1156 define <2 x i64> @ushll2d(<2 x i32>* %A) nounwind {
1157 ;CHECK-LABEL: ushll2d:
1158 ;CHECK: ushll.2d v0, {{v[0-9]+}}, #1
1159 %tmp1 = load <2 x i32>* %A
1160 %tmp2 = zext <2 x i32> %tmp1 to <2 x i64>
1161 %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>
1165 define <8 x i16> @ushll2_8h(<16 x i8>* %A) nounwind {
1166 ;CHECK-LABEL: ushll2_8h:
1167 ;CHECK: ushll2.8h v0, {{v[0-9]+}}, #1
1168 %load1 = load <16 x i8>* %A
1169 %tmp1 = shufflevector <16 x i8> %load1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1170 %tmp2 = zext <8 x i8> %tmp1 to <8 x i16>
1171 %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1175 define <4 x i32> @ushll2_4s(<8 x i16>* %A) nounwind {
1176 ;CHECK-LABEL: ushll2_4s:
1177 ;CHECK: ushll2.4s v0, {{v[0-9]+}}, #1
1178 %load1 = load <8 x i16>* %A
1179 %tmp1 = shufflevector <8 x i16> %load1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1180 %tmp2 = zext <4 x i16> %tmp1 to <4 x i32>
1181 %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>
1185 define <2 x i64> @ushll2_2d(<4 x i32>* %A) nounwind {
1186 ;CHECK-LABEL: ushll2_2d:
1187 ;CHECK: ushll2.2d v0, {{v[0-9]+}}, #1
1188 %load1 = load <4 x i32>* %A
1189 %tmp1 = shufflevector <4 x i32> %load1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1190 %tmp2 = zext <2 x i32> %tmp1 to <2 x i64>
1191 %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>
1195 define <8 x i16> @sshll8h(<8 x i8>* %A) nounwind {
1196 ;CHECK-LABEL: sshll8h:
1197 ;CHECK: sshll.8h v0, {{v[0-9]+}}, #1
1198 %tmp1 = load <8 x i8>* %A
1199 %tmp2 = sext <8 x i8> %tmp1 to <8 x i16>
1200 %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1204 define <4 x i32> @sshll4s(<4 x i16>* %A) nounwind {
1205 ;CHECK-LABEL: sshll4s:
1206 ;CHECK: sshll.4s v0, {{v[0-9]+}}, #1
1207 %tmp1 = load <4 x i16>* %A
1208 %tmp2 = sext <4 x i16> %tmp1 to <4 x i32>
1209 %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>
1213 define <2 x i64> @sshll2d(<2 x i32>* %A) nounwind {
1214 ;CHECK-LABEL: sshll2d:
1215 ;CHECK: sshll.2d v0, {{v[0-9]+}}, #1
1216 %tmp1 = load <2 x i32>* %A
1217 %tmp2 = sext <2 x i32> %tmp1 to <2 x i64>
1218 %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>
1222 define <8 x i16> @sshll2_8h(<16 x i8>* %A) nounwind {
1223 ;CHECK-LABEL: sshll2_8h:
1224 ;CHECK: sshll2.8h v0, {{v[0-9]+}}, #1
1225 %load1 = load <16 x i8>* %A
1226 %tmp1 = shufflevector <16 x i8> %load1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1227 %tmp2 = sext <8 x i8> %tmp1 to <8 x i16>
1228 %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1232 define <4 x i32> @sshll2_4s(<8 x i16>* %A) nounwind {
1233 ;CHECK-LABEL: sshll2_4s:
1234 ;CHECK: sshll2.4s v0, {{v[0-9]+}}, #1
1235 %load1 = load <8 x i16>* %A
1236 %tmp1 = shufflevector <8 x i16> %load1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1237 %tmp2 = sext <4 x i16> %tmp1 to <4 x i32>
1238 %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>
1242 define <2 x i64> @sshll2_2d(<4 x i32>* %A) nounwind {
1243 ;CHECK-LABEL: sshll2_2d:
1244 ;CHECK: sshll2.2d v0, {{v[0-9]+}}, #1
1245 %load1 = load <4 x i32>* %A
1246 %tmp1 = shufflevector <4 x i32> %load1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1247 %tmp2 = sext <2 x i32> %tmp1 to <2 x i64>
1248 %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>
1252 define <8 x i8> @sqshli8b(<8 x i8>* %A) nounwind {
1253 ;CHECK-LABEL: sqshli8b:
1254 ;CHECK: sqshl.8b v0, {{v[0-9]+}}, #1
1255 %tmp1 = load <8 x i8>* %A
1256 %tmp3 = call <8 x i8> @llvm.arm64.neon.sqshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
1260 define <4 x i16> @sqshli4h(<4 x i16>* %A) nounwind {
1261 ;CHECK-LABEL: sqshli4h:
1262 ;CHECK: sqshl.4h v0, {{v[0-9]+}}, #1
1263 %tmp1 = load <4 x i16>* %A
1264 %tmp3 = call <4 x i16> @llvm.arm64.neon.sqshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
1268 define <2 x i32> @sqshli2s(<2 x i32>* %A) nounwind {
1269 ;CHECK-LABEL: sqshli2s:
1270 ;CHECK: sqshl.2s v0, {{v[0-9]+}}, #1
1271 %tmp1 = load <2 x i32>* %A
1272 %tmp3 = call <2 x i32> @llvm.arm64.neon.sqshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
1276 define <16 x i8> @sqshli16b(<16 x i8>* %A) nounwind {
1277 ;CHECK-LABEL: sqshli16b:
1278 ;CHECK: sqshl.16b v0, {{v[0-9]+}}, #1
1279 %tmp1 = load <16 x i8>* %A
1280 %tmp3 = call <16 x i8> @llvm.arm64.neon.sqshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
1284 define <8 x i16> @sqshli8h(<8 x i16>* %A) nounwind {
1285 ;CHECK-LABEL: sqshli8h:
1286 ;CHECK: sqshl.8h v0, {{v[0-9]+}}, #1
1287 %tmp1 = load <8 x i16>* %A
1288 %tmp3 = call <8 x i16> @llvm.arm64.neon.sqshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
1292 define <4 x i32> @sqshli4s(<4 x i32>* %A) nounwind {
1293 ;CHECK-LABEL: sqshli4s:
1294 ;CHECK: sqshl.4s v0, {{v[0-9]+}}, #1
1295 %tmp1 = load <4 x i32>* %A
1296 %tmp3 = call <4 x i32> @llvm.arm64.neon.sqshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
1300 define <2 x i64> @sqshli2d(<2 x i64>* %A) nounwind {
1301 ;CHECK-LABEL: sqshli2d:
1302 ;CHECK: sqshl.2d v0, {{v[0-9]+}}, #1
1303 %tmp1 = load <2 x i64>* %A
1304 %tmp3 = call <2 x i64> @llvm.arm64.neon.sqshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
1308 define <8 x i8> @uqshli8b(<8 x i8>* %A) nounwind {
1309 ;CHECK-LABEL: uqshli8b:
1310 ;CHECK: uqshl.8b v0, {{v[0-9]+}}, #1
1311 %tmp1 = load <8 x i8>* %A
1312 %tmp3 = call <8 x i8> @llvm.arm64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
1316 define <4 x i16> @uqshli4h(<4 x i16>* %A) nounwind {
1317 ;CHECK-LABEL: uqshli4h:
1318 ;CHECK: uqshl.4h v0, {{v[0-9]+}}, #1
1319 %tmp1 = load <4 x i16>* %A
1320 %tmp3 = call <4 x i16> @llvm.arm64.neon.uqshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
1324 define <2 x i32> @uqshli2s(<2 x i32>* %A) nounwind {
1325 ;CHECK-LABEL: uqshli2s:
1326 ;CHECK: uqshl.2s v0, {{v[0-9]+}}, #1
1327 %tmp1 = load <2 x i32>* %A
1328 %tmp3 = call <2 x i32> @llvm.arm64.neon.uqshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
1332 define <16 x i8> @uqshli16b(<16 x i8>* %A) nounwind {
1333 ;CHECK-LABEL: uqshli16b:
1335 %tmp1 = load <16 x i8>* %A
1336 %tmp3 = call <16 x i8> @llvm.arm64.neon.uqshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
1340 define <8 x i16> @uqshli8h(<8 x i16>* %A) nounwind {
1341 ;CHECK-LABEL: uqshli8h:
1342 ;CHECK: uqshl.8h v0, {{v[0-9]+}}, #1
1343 %tmp1 = load <8 x i16>* %A
1344 %tmp3 = call <8 x i16> @llvm.arm64.neon.uqshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
1348 define <4 x i32> @uqshli4s(<4 x i32>* %A) nounwind {
1349 ;CHECK-LABEL: uqshli4s:
1350 ;CHECK: uqshl.4s v0, {{v[0-9]+}}, #1
1351 %tmp1 = load <4 x i32>* %A
1352 %tmp3 = call <4 x i32> @llvm.arm64.neon.uqshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
1356 define <2 x i64> @uqshli2d(<2 x i64>* %A) nounwind {
1357 ;CHECK-LABEL: uqshli2d:
1358 ;CHECK: uqshl.2d v0, {{v[0-9]+}}, #1
1359 %tmp1 = load <2 x i64>* %A
1360 %tmp3 = call <2 x i64> @llvm.arm64.neon.uqshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
1364 define <8 x i8> @ursra8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
1365 ;CHECK-LABEL: ursra8b:
1366 ;CHECK: ursra.8b v0, {{v[0-9]+}}, #1
1367 %tmp1 = load <8 x i8>* %A
1368 %tmp3 = call <8 x i8> @llvm.arm64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
1369 %tmp4 = load <8 x i8>* %B
1370 %tmp5 = add <8 x i8> %tmp3, %tmp4
1374 define <4 x i16> @ursra4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
1375 ;CHECK-LABEL: ursra4h:
1376 ;CHECK: ursra.4h v0, {{v[0-9]+}}, #1
1377 %tmp1 = load <4 x i16>* %A
1378 %tmp3 = call <4 x i16> @llvm.arm64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
1379 %tmp4 = load <4 x i16>* %B
1380 %tmp5 = add <4 x i16> %tmp3, %tmp4
1384 define <2 x i32> @ursra2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
1385 ;CHECK-LABEL: ursra2s:
1386 ;CHECK: ursra.2s v0, {{v[0-9]+}}, #1
1387 %tmp1 = load <2 x i32>* %A
1388 %tmp3 = call <2 x i32> @llvm.arm64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
1389 %tmp4 = load <2 x i32>* %B
1390 %tmp5 = add <2 x i32> %tmp3, %tmp4
1394 define <16 x i8> @ursra16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
1395 ;CHECK-LABEL: ursra16b:
1396 ;CHECK: ursra.16b v0, {{v[0-9]+}}, #1
1397 %tmp1 = load <16 x i8>* %A
1398 %tmp3 = call <16 x i8> @llvm.arm64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
1399 %tmp4 = load <16 x i8>* %B
1400 %tmp5 = add <16 x i8> %tmp3, %tmp4
1404 define <8 x i16> @ursra8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
1405 ;CHECK-LABEL: ursra8h:
1406 ;CHECK: ursra.8h v0, {{v[0-9]+}}, #1
1407 %tmp1 = load <8 x i16>* %A
1408 %tmp3 = call <8 x i16> @llvm.arm64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
1409 %tmp4 = load <8 x i16>* %B
1410 %tmp5 = add <8 x i16> %tmp3, %tmp4
1414 define <4 x i32> @ursra4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
1415 ;CHECK-LABEL: ursra4s:
1416 ;CHECK: ursra.4s v0, {{v[0-9]+}}, #1
1417 %tmp1 = load <4 x i32>* %A
1418 %tmp3 = call <4 x i32> @llvm.arm64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
1419 %tmp4 = load <4 x i32>* %B
1420 %tmp5 = add <4 x i32> %tmp3, %tmp4
1424 define <2 x i64> @ursra2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
1425 ;CHECK-LABEL: ursra2d:
1426 ;CHECK: ursra.2d v0, {{v[0-9]+}}, #1
1427 %tmp1 = load <2 x i64>* %A
1428 %tmp3 = call <2 x i64> @llvm.arm64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
1429 %tmp4 = load <2 x i64>* %B
1430 %tmp5 = add <2 x i64> %tmp3, %tmp4
1434 define <8 x i8> @srsra8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
1435 ;CHECK-LABEL: srsra8b:
1436 ;CHECK: srsra.8b v0, {{v[0-9]+}}, #1
1437 %tmp1 = load <8 x i8>* %A
1438 %tmp3 = call <8 x i8> @llvm.arm64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
1439 %tmp4 = load <8 x i8>* %B
1440 %tmp5 = add <8 x i8> %tmp3, %tmp4
1444 define <4 x i16> @srsra4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
1445 ;CHECK-LABEL: srsra4h:
1446 ;CHECK: srsra.4h v0, {{v[0-9]+}}, #1
1447 %tmp1 = load <4 x i16>* %A
1448 %tmp3 = call <4 x i16> @llvm.arm64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
1449 %tmp4 = load <4 x i16>* %B
1450 %tmp5 = add <4 x i16> %tmp3, %tmp4
1454 define <2 x i32> @srsra2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
1455 ;CHECK-LABEL: srsra2s:
1456 ;CHECK: srsra.2s v0, {{v[0-9]+}}, #1
1457 %tmp1 = load <2 x i32>* %A
1458 %tmp3 = call <2 x i32> @llvm.arm64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
1459 %tmp4 = load <2 x i32>* %B
1460 %tmp5 = add <2 x i32> %tmp3, %tmp4
1464 define <16 x i8> @srsra16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
1465 ;CHECK-LABEL: srsra16b:
1466 ;CHECK: srsra.16b v0, {{v[0-9]+}}, #1
1467 %tmp1 = load <16 x i8>* %A
1468 %tmp3 = call <16 x i8> @llvm.arm64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
1469 %tmp4 = load <16 x i8>* %B
1470 %tmp5 = add <16 x i8> %tmp3, %tmp4
1474 define <8 x i16> @srsra8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
1475 ;CHECK-LABEL: srsra8h:
1476 ;CHECK: srsra.8h v0, {{v[0-9]+}}, #1
1477 %tmp1 = load <8 x i16>* %A
1478 %tmp3 = call <8 x i16> @llvm.arm64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
1479 %tmp4 = load <8 x i16>* %B
1480 %tmp5 = add <8 x i16> %tmp3, %tmp4
1484 define <4 x i32> @srsra4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
1485 ;CHECK-LABEL: srsra4s:
1486 ;CHECK: srsra.4s v0, {{v[0-9]+}}, #1
1487 %tmp1 = load <4 x i32>* %A
1488 %tmp3 = call <4 x i32> @llvm.arm64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
1489 %tmp4 = load <4 x i32>* %B
1490 %tmp5 = add <4 x i32> %tmp3, %tmp4
1494 define <2 x i64> @srsra2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
1495 ;CHECK-LABEL: srsra2d:
1496 ;CHECK: srsra.2d v0, {{v[0-9]+}}, #1
1497 %tmp1 = load <2 x i64>* %A
1498 %tmp3 = call <2 x i64> @llvm.arm64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
1499 %tmp4 = load <2 x i64>* %B
1500 %tmp5 = add <2 x i64> %tmp3, %tmp4
1504 define <8 x i8> @usra8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
1505 ;CHECK-LABEL: usra8b:
1506 ;CHECK: usra.8b v0, {{v[0-9]+}}, #1
1507 %tmp1 = load <8 x i8>* %A
1508 %tmp3 = lshr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1509 %tmp4 = load <8 x i8>* %B
1510 %tmp5 = add <8 x i8> %tmp3, %tmp4
1514 define <4 x i16> @usra4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
1515 ;CHECK-LABEL: usra4h:
1516 ;CHECK: usra.4h v0, {{v[0-9]+}}, #1
1517 %tmp1 = load <4 x i16>* %A
1518 %tmp3 = lshr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>
1519 %tmp4 = load <4 x i16>* %B
1520 %tmp5 = add <4 x i16> %tmp3, %tmp4
1524 define <2 x i32> @usra2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
1525 ;CHECK-LABEL: usra2s:
1526 ;CHECK: usra.2s v0, {{v[0-9]+}}, #1
1527 %tmp1 = load <2 x i32>* %A
1528 %tmp3 = lshr <2 x i32> %tmp1, <i32 1, i32 1>
1529 %tmp4 = load <2 x i32>* %B
1530 %tmp5 = add <2 x i32> %tmp3, %tmp4
1534 define <16 x i8> @usra16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
1535 ;CHECK-LABEL: usra16b:
1536 ;CHECK: usra.16b v0, {{v[0-9]+}}, #1
1537 %tmp1 = load <16 x i8>* %A
1538 %tmp3 = lshr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1539 %tmp4 = load <16 x i8>* %B
1540 %tmp5 = add <16 x i8> %tmp3, %tmp4
1544 define <8 x i16> @usra8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
1545 ;CHECK-LABEL: usra8h:
1546 ;CHECK: usra.8h v0, {{v[0-9]+}}, #1
1547 %tmp1 = load <8 x i16>* %A
1548 %tmp3 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1549 %tmp4 = load <8 x i16>* %B
1550 %tmp5 = add <8 x i16> %tmp3, %tmp4
1554 define <4 x i32> @usra4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
1555 ;CHECK-LABEL: usra4s:
1556 ;CHECK: usra.4s v0, {{v[0-9]+}}, #1
1557 %tmp1 = load <4 x i32>* %A
1558 %tmp3 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
1559 %tmp4 = load <4 x i32>* %B
1560 %tmp5 = add <4 x i32> %tmp3, %tmp4
1564 define <2 x i64> @usra2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
1565 ;CHECK-LABEL: usra2d:
1566 ;CHECK: usra.2d v0, {{v[0-9]+}}, #1
1567 %tmp1 = load <2 x i64>* %A
1568 %tmp3 = lshr <2 x i64> %tmp1, <i64 1, i64 1>
1569 %tmp4 = load <2 x i64>* %B
1570 %tmp5 = add <2 x i64> %tmp3, %tmp4
1574 define <8 x i8> @ssra8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
1575 ;CHECK-LABEL: ssra8b:
1576 ;CHECK: ssra.8b v0, {{v[0-9]+}}, #1
1577 %tmp1 = load <8 x i8>* %A
1578 %tmp3 = ashr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1579 %tmp4 = load <8 x i8>* %B
1580 %tmp5 = add <8 x i8> %tmp3, %tmp4
1584 define <4 x i16> @ssra4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
1585 ;CHECK-LABEL: ssra4h:
1586 ;CHECK: ssra.4h v0, {{v[0-9]+}}, #1
1587 %tmp1 = load <4 x i16>* %A
1588 %tmp3 = ashr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>
1589 %tmp4 = load <4 x i16>* %B
1590 %tmp5 = add <4 x i16> %tmp3, %tmp4
1594 define <2 x i32> @ssra2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
1595 ;CHECK-LABEL: ssra2s:
1596 ;CHECK: ssra.2s v0, {{v[0-9]+}}, #1
1597 %tmp1 = load <2 x i32>* %A
1598 %tmp3 = ashr <2 x i32> %tmp1, <i32 1, i32 1>
1599 %tmp4 = load <2 x i32>* %B
1600 %tmp5 = add <2 x i32> %tmp3, %tmp4
1604 define <16 x i8> @ssra16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
1605 ;CHECK-LABEL: ssra16b:
1606 ;CHECK: ssra.16b v0, {{v[0-9]+}}, #1
1607 %tmp1 = load <16 x i8>* %A
1608 %tmp3 = ashr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1609 %tmp4 = load <16 x i8>* %B
1610 %tmp5 = add <16 x i8> %tmp3, %tmp4
1614 define <8 x i16> @ssra8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
1615 ;CHECK-LABEL: ssra8h:
1616 ;CHECK: ssra.8h v0, {{v[0-9]+}}, #1
1617 %tmp1 = load <8 x i16>* %A
1618 %tmp3 = ashr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1619 %tmp4 = load <8 x i16>* %B
1620 %tmp5 = add <8 x i16> %tmp3, %tmp4
1624 define <4 x i32> @ssra4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
1625 ;CHECK-LABEL: ssra4s:
1626 ;CHECK: ssra.4s v0, {{v[0-9]+}}, #1
1627 %tmp1 = load <4 x i32>* %A
1628 %tmp3 = ashr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
1629 %tmp4 = load <4 x i32>* %B
1630 %tmp5 = add <4 x i32> %tmp3, %tmp4
1634 define <2 x i64> @ssra2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
1635 ;CHECK-LABEL: ssra2d:
1636 ;CHECK: ssra.2d v0, {{v[0-9]+}}, #1
1637 %tmp1 = load <2 x i64>* %A
1638 %tmp3 = ashr <2 x i64> %tmp1, <i64 1, i64 1>
1639 %tmp4 = load <2 x i64>* %B
1640 %tmp5 = add <2 x i64> %tmp3, %tmp4
1644 define <8 x i8> @shr_orr8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
1645 ;CHECK-LABEL: shr_orr8b:
1646 ;CHECK: shr.8b v0, {{v[0-9]+}}, #1
1649 %tmp1 = load <8 x i8>* %A
1650 %tmp4 = load <8 x i8>* %B
1651 %tmp3 = lshr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1652 %tmp5 = or <8 x i8> %tmp3, %tmp4
1656 define <4 x i16> @shr_orr4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
1657 ;CHECK-LABEL: shr_orr4h:
1658 ;CHECK: shr.4h v0, {{v[0-9]+}}, #1
1661 %tmp1 = load <4 x i16>* %A
1662 %tmp4 = load <4 x i16>* %B
1663 %tmp3 = lshr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>
1664 %tmp5 = or <4 x i16> %tmp3, %tmp4
1668 define <2 x i32> @shr_orr2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
1669 ;CHECK-LABEL: shr_orr2s:
1670 ;CHECK: shr.2s v0, {{v[0-9]+}}, #1
1673 %tmp1 = load <2 x i32>* %A
1674 %tmp4 = load <2 x i32>* %B
1675 %tmp3 = lshr <2 x i32> %tmp1, <i32 1, i32 1>
1676 %tmp5 = or <2 x i32> %tmp3, %tmp4
1680 define <16 x i8> @shr_orr16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
1681 ;CHECK-LABEL: shr_orr16b:
1682 ;CHECK: shr.16b v0, {{v[0-9]+}}, #1
1683 ;CHECK-NEXT: orr.16b
1685 %tmp1 = load <16 x i8>* %A
1686 %tmp4 = load <16 x i8>* %B
1687 %tmp3 = lshr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1688 %tmp5 = or <16 x i8> %tmp3, %tmp4
1692 define <8 x i16> @shr_orr8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
1693 ;CHECK-LABEL: shr_orr8h:
1694 ;CHECK: shr.8h v0, {{v[0-9]+}}, #1
1695 ;CHECK-NEXT: orr.16b
1697 %tmp1 = load <8 x i16>* %A
1698 %tmp4 = load <8 x i16>* %B
1699 %tmp3 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1700 %tmp5 = or <8 x i16> %tmp3, %tmp4
1704 define <4 x i32> @shr_orr4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
1705 ;CHECK-LABEL: shr_orr4s:
1706 ;CHECK: shr.4s v0, {{v[0-9]+}}, #1
1707 ;CHECK-NEXT: orr.16b
1709 %tmp1 = load <4 x i32>* %A
1710 %tmp4 = load <4 x i32>* %B
1711 %tmp3 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
1712 %tmp5 = or <4 x i32> %tmp3, %tmp4
1716 define <2 x i64> @shr_orr2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
1717 ;CHECK-LABEL: shr_orr2d:
1718 ;CHECK: shr.2d v0, {{v[0-9]+}}, #1
1719 ;CHECK-NEXT: orr.16b
1721 %tmp1 = load <2 x i64>* %A
1722 %tmp4 = load <2 x i64>* %B
1723 %tmp3 = lshr <2 x i64> %tmp1, <i64 1, i64 1>
1724 %tmp5 = or <2 x i64> %tmp3, %tmp4
1728 define <8 x i8> @shl_orr8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
1729 ;CHECK-LABEL: shl_orr8b:
1730 ;CHECK: shl.8b v0, {{v[0-9]+}}, #1
1733 %tmp1 = load <8 x i8>* %A
1734 %tmp4 = load <8 x i8>* %B
1735 %tmp3 = shl <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1736 %tmp5 = or <8 x i8> %tmp3, %tmp4
1740 define <4 x i16> @shl_orr4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
1741 ;CHECK-LABEL: shl_orr4h:
1742 ;CHECK: shl.4h v0, {{v[0-9]+}}, #1
1745 %tmp1 = load <4 x i16>* %A
1746 %tmp4 = load <4 x i16>* %B
1747 %tmp3 = shl <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>
1748 %tmp5 = or <4 x i16> %tmp3, %tmp4
1752 define <2 x i32> @shl_orr2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
1753 ;CHECK-LABEL: shl_orr2s:
1754 ;CHECK: shl.2s v0, {{v[0-9]+}}, #1
1757 %tmp1 = load <2 x i32>* %A
1758 %tmp4 = load <2 x i32>* %B
1759 %tmp3 = shl <2 x i32> %tmp1, <i32 1, i32 1>
1760 %tmp5 = or <2 x i32> %tmp3, %tmp4
1764 define <16 x i8> @shl_orr16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
1765 ;CHECK-LABEL: shl_orr16b:
1766 ;CHECK: shl.16b v0, {{v[0-9]+}}, #1
1767 ;CHECK-NEXT: orr.16b
1769 %tmp1 = load <16 x i8>* %A
1770 %tmp4 = load <16 x i8>* %B
1771 %tmp3 = shl <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1772 %tmp5 = or <16 x i8> %tmp3, %tmp4
1776 define <8 x i16> @shl_orr8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
1777 ;CHECK-LABEL: shl_orr8h:
1778 ;CHECK: shl.8h v0, {{v[0-9]+}}, #1
1779 ;CHECK-NEXT: orr.16b
1781 %tmp1 = load <8 x i16>* %A
1782 %tmp4 = load <8 x i16>* %B
1783 %tmp3 = shl <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1784 %tmp5 = or <8 x i16> %tmp3, %tmp4
1788 define <4 x i32> @shl_orr4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
1789 ;CHECK-LABEL: shl_orr4s:
1790 ;CHECK: shl.4s v0, {{v[0-9]+}}, #1
1791 ;CHECK-NEXT: orr.16b
1793 %tmp1 = load <4 x i32>* %A
1794 %tmp4 = load <4 x i32>* %B
1795 %tmp3 = shl <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>
1796 %tmp5 = or <4 x i32> %tmp3, %tmp4
1800 define <2 x i64> @shl_orr2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
1801 ;CHECK-LABEL: shl_orr2d:
1802 ;CHECK: shl.2d v0, {{v[0-9]+}}, #1
1803 ;CHECK-NEXT: orr.16b
1805 %tmp1 = load <2 x i64>* %A
1806 %tmp4 = load <2 x i64>* %B
1807 %tmp3 = shl <2 x i64> %tmp1, <i64 1, i64 1>
1808 %tmp5 = or <2 x i64> %tmp3, %tmp4
1812 define <8 x i16> @shll(<8 x i8> %in) {
1813 ; CHECK-LABEL: shll:
1814 ; CHECK: shll.8h v0, {{v[0-9]+}}, #8
1815 %ext = zext <8 x i8> %in to <8 x i16>
1816 %res = shl <8 x i16> %ext, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1820 define <4 x i32> @shll_high(<8 x i16> %in) {
1821 ; CHECK-LABEL: shll_high
1822 ; CHECK: shll2.4s v0, {{v[0-9]+}}, #16
1823 %extract = shufflevector <8 x i16> %in, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1824 %ext = zext <4 x i16> %extract to <4 x i32>
1825 %res = shl <4 x i32> %ext, <i32 16, i32 16, i32 16, i32 16>
1829 define <8 x i8> @sli8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
1830 ;CHECK-LABEL: sli8b:
1831 ;CHECK: sli.8b v0, {{v[0-9]+}}, #1
1832 %tmp1 = load <8 x i8>* %A
1833 %tmp2 = load <8 x i8>* %B
1834 %tmp3 = call <8 x i8> @llvm.arm64.neon.vsli.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2, i32 1)
1838 define <4 x i16> @sli4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
1839 ;CHECK-LABEL: sli4h:
1840 ;CHECK: sli.4h v0, {{v[0-9]+}}, #1
1841 %tmp1 = load <4 x i16>* %A
1842 %tmp2 = load <4 x i16>* %B
1843 %tmp3 = call <4 x i16> @llvm.arm64.neon.vsli.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2, i32 1)
1847 define <2 x i32> @sli2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
1848 ;CHECK-LABEL: sli2s:
1849 ;CHECK: sli.2s v0, {{v[0-9]+}}, #1
1850 %tmp1 = load <2 x i32>* %A
1851 %tmp2 = load <2 x i32>* %B
1852 %tmp3 = call <2 x i32> @llvm.arm64.neon.vsli.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2, i32 1)
1856 define <1 x i64> @sli1d(<1 x i64>* %A, <1 x i64>* %B) nounwind {
1857 ;CHECK-LABEL: sli1d:
1858 ;CHECK: sli d0, {{d[0-9]+}}, #1
1859 %tmp1 = load <1 x i64>* %A
1860 %tmp2 = load <1 x i64>* %B
1861 %tmp3 = call <1 x i64> @llvm.arm64.neon.vsli.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2, i32 1)
1865 define <16 x i8> @sli16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
1866 ;CHECK-LABEL: sli16b:
1867 ;CHECK: sli.16b v0, {{v[0-9]+}}, #1
1868 %tmp1 = load <16 x i8>* %A
1869 %tmp2 = load <16 x i8>* %B
1870 %tmp3 = call <16 x i8> @llvm.arm64.neon.vsli.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2, i32 1)
1874 define <8 x i16> @sli8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
1875 ;CHECK-LABEL: sli8h:
1876 ;CHECK: sli.8h v0, {{v[0-9]+}}, #1
1877 %tmp1 = load <8 x i16>* %A
1878 %tmp2 = load <8 x i16>* %B
1879 %tmp3 = call <8 x i16> @llvm.arm64.neon.vsli.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2, i32 1)
1883 define <4 x i32> @sli4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
1884 ;CHECK-LABEL: sli4s:
1885 ;CHECK: sli.4s v0, {{v[0-9]+}}, #1
1886 %tmp1 = load <4 x i32>* %A
1887 %tmp2 = load <4 x i32>* %B
1888 %tmp3 = call <4 x i32> @llvm.arm64.neon.vsli.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2, i32 1)
1892 define <2 x i64> @sli2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
1893 ;CHECK-LABEL: sli2d:
1894 ;CHECK: sli.2d v0, {{v[0-9]+}}, #1
1895 %tmp1 = load <2 x i64>* %A
1896 %tmp2 = load <2 x i64>* %B
1897 %tmp3 = call <2 x i64> @llvm.arm64.neon.vsli.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2, i32 1)
1901 declare <8 x i8> @llvm.arm64.neon.vsli.v8i8(<8 x i8>, <8 x i8>, i32) nounwind readnone
1902 declare <4 x i16> @llvm.arm64.neon.vsli.v4i16(<4 x i16>, <4 x i16>, i32) nounwind readnone
1903 declare <2 x i32> @llvm.arm64.neon.vsli.v2i32(<2 x i32>, <2 x i32>, i32) nounwind readnone
1904 declare <1 x i64> @llvm.arm64.neon.vsli.v1i64(<1 x i64>, <1 x i64>, i32) nounwind readnone
1906 declare <16 x i8> @llvm.arm64.neon.vsli.v16i8(<16 x i8>, <16 x i8>, i32) nounwind readnone
1907 declare <8 x i16> @llvm.arm64.neon.vsli.v8i16(<8 x i16>, <8 x i16>, i32) nounwind readnone
1908 declare <4 x i32> @llvm.arm64.neon.vsli.v4i32(<4 x i32>, <4 x i32>, i32) nounwind readnone
1909 declare <2 x i64> @llvm.arm64.neon.vsli.v2i64(<2 x i64>, <2 x i64>, i32) nounwind readnone
1911 define <1 x i64> @ashr_v1i64(<1 x i64> %a, <1 x i64> %b) {
1912 ; CHECK-LABEL: ashr_v1i64:
1913 ; CHECK: neg d{{[0-9]+}}, d{{[0-9]+}}
1914 ; CHECK: sshl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}
1915 %c = ashr <1 x i64> %a, %b