AArch64/ARM64: move ARM64 into AArch64's place
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-vshift.ll
1 ; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -enable-misched=false | FileCheck %s
2
3 define <8 x i8> @sqshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
4 ;CHECK-LABEL: sqshl8b:
5 ;CHECK: sqshl.8b
6         %tmp1 = load <8 x i8>* %A
7         %tmp2 = load <8 x i8>* %B
8         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
9         ret <8 x i8> %tmp3
10 }
11
12 define <4 x i16> @sqshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
13 ;CHECK-LABEL: sqshl4h:
14 ;CHECK: sqshl.4h
15         %tmp1 = load <4 x i16>* %A
16         %tmp2 = load <4 x i16>* %B
17         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
18         ret <4 x i16> %tmp3
19 }
20
21 define <2 x i32> @sqshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
22 ;CHECK-LABEL: sqshl2s:
23 ;CHECK: sqshl.2s
24         %tmp1 = load <2 x i32>* %A
25         %tmp2 = load <2 x i32>* %B
26         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
27         ret <2 x i32> %tmp3
28 }
29
30 define <8 x i8> @uqshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
31 ;CHECK-LABEL: uqshl8b:
32 ;CHECK: uqshl.8b
33         %tmp1 = load <8 x i8>* %A
34         %tmp2 = load <8 x i8>* %B
35         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
36         ret <8 x i8> %tmp3
37 }
38
39 define <4 x i16> @uqshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
40 ;CHECK-LABEL: uqshl4h:
41 ;CHECK: uqshl.4h
42         %tmp1 = load <4 x i16>* %A
43         %tmp2 = load <4 x i16>* %B
44         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
45         ret <4 x i16> %tmp3
46 }
47
48 define <2 x i32> @uqshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
49 ;CHECK-LABEL: uqshl2s:
50 ;CHECK: uqshl.2s
51         %tmp1 = load <2 x i32>* %A
52         %tmp2 = load <2 x i32>* %B
53         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
54         ret <2 x i32> %tmp3
55 }
56
57 define <16 x i8> @sqshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
58 ;CHECK-LABEL: sqshl16b:
59 ;CHECK: sqshl.16b
60         %tmp1 = load <16 x i8>* %A
61         %tmp2 = load <16 x i8>* %B
62         %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
63         ret <16 x i8> %tmp3
64 }
65
66 define <8 x i16> @sqshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
67 ;CHECK-LABEL: sqshl8h:
68 ;CHECK: sqshl.8h
69         %tmp1 = load <8 x i16>* %A
70         %tmp2 = load <8 x i16>* %B
71         %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
72         ret <8 x i16> %tmp3
73 }
74
75 define <4 x i32> @sqshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
76 ;CHECK-LABEL: sqshl4s:
77 ;CHECK: sqshl.4s
78         %tmp1 = load <4 x i32>* %A
79         %tmp2 = load <4 x i32>* %B
80         %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
81         ret <4 x i32> %tmp3
82 }
83
84 define <2 x i64> @sqshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
85 ;CHECK-LABEL: sqshl2d:
86 ;CHECK: sqshl.2d
87         %tmp1 = load <2 x i64>* %A
88         %tmp2 = load <2 x i64>* %B
89         %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
90         ret <2 x i64> %tmp3
91 }
92
93 define <16 x i8> @uqshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
94 ;CHECK-LABEL: uqshl16b:
95 ;CHECK: uqshl.16b
96         %tmp1 = load <16 x i8>* %A
97         %tmp2 = load <16 x i8>* %B
98         %tmp3 = call <16 x i8> @llvm.aarch64.neon.uqshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
99         ret <16 x i8> %tmp3
100 }
101
102 define <8 x i16> @uqshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
103 ;CHECK-LABEL: uqshl8h:
104 ;CHECK: uqshl.8h
105         %tmp1 = load <8 x i16>* %A
106         %tmp2 = load <8 x i16>* %B
107         %tmp3 = call <8 x i16> @llvm.aarch64.neon.uqshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
108         ret <8 x i16> %tmp3
109 }
110
111 define <4 x i32> @uqshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
112 ;CHECK-LABEL: uqshl4s:
113 ;CHECK: uqshl.4s
114         %tmp1 = load <4 x i32>* %A
115         %tmp2 = load <4 x i32>* %B
116         %tmp3 = call <4 x i32> @llvm.aarch64.neon.uqshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
117         ret <4 x i32> %tmp3
118 }
119
120 define <2 x i64> @uqshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
121 ;CHECK-LABEL: uqshl2d:
122 ;CHECK: uqshl.2d
123         %tmp1 = load <2 x i64>* %A
124         %tmp2 = load <2 x i64>* %B
125         %tmp3 = call <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
126         ret <2 x i64> %tmp3
127 }
128
129 declare <8 x i8>  @llvm.aarch64.neon.sqshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
130 declare <4 x i16> @llvm.aarch64.neon.sqshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
131 declare <2 x i32> @llvm.aarch64.neon.sqshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
132 declare <1 x i64> @llvm.aarch64.neon.sqshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
133
134 declare <8 x i8>  @llvm.aarch64.neon.uqshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
135 declare <4 x i16> @llvm.aarch64.neon.uqshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
136 declare <2 x i32> @llvm.aarch64.neon.uqshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
137 declare <1 x i64> @llvm.aarch64.neon.uqshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
138
139 declare <16 x i8> @llvm.aarch64.neon.sqshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
140 declare <8 x i16> @llvm.aarch64.neon.sqshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
141 declare <4 x i32> @llvm.aarch64.neon.sqshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
142 declare <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
143
144 declare <16 x i8> @llvm.aarch64.neon.uqshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
145 declare <8 x i16> @llvm.aarch64.neon.uqshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
146 declare <4 x i32> @llvm.aarch64.neon.uqshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
147 declare <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
148
149 define <8 x i8> @srshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
150 ;CHECK-LABEL: srshl8b:
151 ;CHECK: srshl.8b
152         %tmp1 = load <8 x i8>* %A
153         %tmp2 = load <8 x i8>* %B
154         %tmp3 = call <8 x i8> @llvm.aarch64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
155         ret <8 x i8> %tmp3
156 }
157
158 define <4 x i16> @srshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
159 ;CHECK-LABEL: srshl4h:
160 ;CHECK: srshl.4h
161         %tmp1 = load <4 x i16>* %A
162         %tmp2 = load <4 x i16>* %B
163         %tmp3 = call <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
164         ret <4 x i16> %tmp3
165 }
166
167 define <2 x i32> @srshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
168 ;CHECK-LABEL: srshl2s:
169 ;CHECK: srshl.2s
170         %tmp1 = load <2 x i32>* %A
171         %tmp2 = load <2 x i32>* %B
172         %tmp3 = call <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
173         ret <2 x i32> %tmp3
174 }
175
176 define <8 x i8> @urshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
177 ;CHECK-LABEL: urshl8b:
178 ;CHECK: urshl.8b
179         %tmp1 = load <8 x i8>* %A
180         %tmp2 = load <8 x i8>* %B
181         %tmp3 = call <8 x i8> @llvm.aarch64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
182         ret <8 x i8> %tmp3
183 }
184
185 define <4 x i16> @urshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
186 ;CHECK-LABEL: urshl4h:
187 ;CHECK: urshl.4h
188         %tmp1 = load <4 x i16>* %A
189         %tmp2 = load <4 x i16>* %B
190         %tmp3 = call <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
191         ret <4 x i16> %tmp3
192 }
193
194 define <2 x i32> @urshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
195 ;CHECK-LABEL: urshl2s:
196 ;CHECK: urshl.2s
197         %tmp1 = load <2 x i32>* %A
198         %tmp2 = load <2 x i32>* %B
199         %tmp3 = call <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
200         ret <2 x i32> %tmp3
201 }
202
203 define <16 x i8> @srshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
204 ;CHECK-LABEL: srshl16b:
205 ;CHECK: srshl.16b
206         %tmp1 = load <16 x i8>* %A
207         %tmp2 = load <16 x i8>* %B
208         %tmp3 = call <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
209         ret <16 x i8> %tmp3
210 }
211
212 define <8 x i16> @srshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
213 ;CHECK-LABEL: srshl8h:
214 ;CHECK: srshl.8h
215         %tmp1 = load <8 x i16>* %A
216         %tmp2 = load <8 x i16>* %B
217         %tmp3 = call <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
218         ret <8 x i16> %tmp3
219 }
220
221 define <4 x i32> @srshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
222 ;CHECK-LABEL: srshl4s:
223 ;CHECK: srshl.4s
224         %tmp1 = load <4 x i32>* %A
225         %tmp2 = load <4 x i32>* %B
226         %tmp3 = call <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
227         ret <4 x i32> %tmp3
228 }
229
230 define <2 x i64> @srshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
231 ;CHECK-LABEL: srshl2d:
232 ;CHECK: srshl.2d
233         %tmp1 = load <2 x i64>* %A
234         %tmp2 = load <2 x i64>* %B
235         %tmp3 = call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
236         ret <2 x i64> %tmp3
237 }
238
239 define <16 x i8> @urshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
240 ;CHECK-LABEL: urshl16b:
241 ;CHECK: urshl.16b
242         %tmp1 = load <16 x i8>* %A
243         %tmp2 = load <16 x i8>* %B
244         %tmp3 = call <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
245         ret <16 x i8> %tmp3
246 }
247
248 define <8 x i16> @urshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
249 ;CHECK-LABEL: urshl8h:
250 ;CHECK: urshl.8h
251         %tmp1 = load <8 x i16>* %A
252         %tmp2 = load <8 x i16>* %B
253         %tmp3 = call <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
254         ret <8 x i16> %tmp3
255 }
256
257 define <4 x i32> @urshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
258 ;CHECK-LABEL: urshl4s:
259 ;CHECK: urshl.4s
260         %tmp1 = load <4 x i32>* %A
261         %tmp2 = load <4 x i32>* %B
262         %tmp3 = call <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
263         ret <4 x i32> %tmp3
264 }
265
266 define <2 x i64> @urshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
267 ;CHECK-LABEL: urshl2d:
268 ;CHECK: urshl.2d
269         %tmp1 = load <2 x i64>* %A
270         %tmp2 = load <2 x i64>* %B
271         %tmp3 = call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
272         ret <2 x i64> %tmp3
273 }
274
275 declare <8 x i8>  @llvm.aarch64.neon.srshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
276 declare <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
277 declare <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
278 declare <1 x i64> @llvm.aarch64.neon.srshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
279
280 declare <8 x i8>  @llvm.aarch64.neon.urshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
281 declare <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
282 declare <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
283 declare <1 x i64> @llvm.aarch64.neon.urshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
284
285 declare <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
286 declare <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
287 declare <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
288 declare <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
289
290 declare <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
291 declare <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
292 declare <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
293 declare <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
294
295 define <8 x i8> @sqrshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
296 ;CHECK-LABEL: sqrshl8b:
297 ;CHECK: sqrshl.8b
298         %tmp1 = load <8 x i8>* %A
299         %tmp2 = load <8 x i8>* %B
300         %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
301         ret <8 x i8> %tmp3
302 }
303
304 define <4 x i16> @sqrshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
305 ;CHECK-LABEL: sqrshl4h:
306 ;CHECK: sqrshl.4h
307         %tmp1 = load <4 x i16>* %A
308         %tmp2 = load <4 x i16>* %B
309         %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
310         ret <4 x i16> %tmp3
311 }
312
313 define <2 x i32> @sqrshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
314 ;CHECK-LABEL: sqrshl2s:
315 ;CHECK: sqrshl.2s
316         %tmp1 = load <2 x i32>* %A
317         %tmp2 = load <2 x i32>* %B
318         %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
319         ret <2 x i32> %tmp3
320 }
321
322 define <8 x i8> @uqrshl8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
323 ;CHECK-LABEL: uqrshl8b:
324 ;CHECK: uqrshl.8b
325         %tmp1 = load <8 x i8>* %A
326         %tmp2 = load <8 x i8>* %B
327         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqrshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
328         ret <8 x i8> %tmp3
329 }
330
331 define <4 x i16> @uqrshl4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
332 ;CHECK-LABEL: uqrshl4h:
333 ;CHECK: uqrshl.4h
334         %tmp1 = load <4 x i16>* %A
335         %tmp2 = load <4 x i16>* %B
336         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqrshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
337         ret <4 x i16> %tmp3
338 }
339
340 define <2 x i32> @uqrshl2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
341 ;CHECK-LABEL: uqrshl2s:
342 ;CHECK: uqrshl.2s
343         %tmp1 = load <2 x i32>* %A
344         %tmp2 = load <2 x i32>* %B
345         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqrshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
346         ret <2 x i32> %tmp3
347 }
348
349 define <16 x i8> @sqrshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
350 ;CHECK-LABEL: sqrshl16b:
351 ;CHECK: sqrshl.16b
352         %tmp1 = load <16 x i8>* %A
353         %tmp2 = load <16 x i8>* %B
354         %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqrshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
355         ret <16 x i8> %tmp3
356 }
357
358 define <8 x i16> @sqrshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
359 ;CHECK-LABEL: sqrshl8h:
360 ;CHECK: sqrshl.8h
361         %tmp1 = load <8 x i16>* %A
362         %tmp2 = load <8 x i16>* %B
363         %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqrshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
364         ret <8 x i16> %tmp3
365 }
366
367 define <4 x i32> @sqrshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
368 ;CHECK-LABEL: sqrshl4s:
369 ;CHECK: sqrshl.4s
370         %tmp1 = load <4 x i32>* %A
371         %tmp2 = load <4 x i32>* %B
372         %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqrshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
373         ret <4 x i32> %tmp3
374 }
375
376 define <2 x i64> @sqrshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
377 ;CHECK-LABEL: sqrshl2d:
378 ;CHECK: sqrshl.2d
379         %tmp1 = load <2 x i64>* %A
380         %tmp2 = load <2 x i64>* %B
381         %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqrshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
382         ret <2 x i64> %tmp3
383 }
384
385 define <16 x i8> @uqrshl16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
386 ;CHECK-LABEL: uqrshl16b:
387 ;CHECK: uqrshl.16b
388         %tmp1 = load <16 x i8>* %A
389         %tmp2 = load <16 x i8>* %B
390         %tmp3 = call <16 x i8> @llvm.aarch64.neon.uqrshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
391         ret <16 x i8> %tmp3
392 }
393
394 define <8 x i16> @uqrshl8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
395 ;CHECK-LABEL: uqrshl8h:
396 ;CHECK: uqrshl.8h
397         %tmp1 = load <8 x i16>* %A
398         %tmp2 = load <8 x i16>* %B
399         %tmp3 = call <8 x i16> @llvm.aarch64.neon.uqrshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
400         ret <8 x i16> %tmp3
401 }
402
403 define <4 x i32> @uqrshl4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
404 ;CHECK-LABEL: uqrshl4s:
405 ;CHECK: uqrshl.4s
406         %tmp1 = load <4 x i32>* %A
407         %tmp2 = load <4 x i32>* %B
408         %tmp3 = call <4 x i32> @llvm.aarch64.neon.uqrshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
409         ret <4 x i32> %tmp3
410 }
411
412 define <2 x i64> @uqrshl2d(<2 x i64>* %A, <2 x i64>* %B) nounwind {
413 ;CHECK-LABEL: uqrshl2d:
414 ;CHECK: uqrshl.2d
415         %tmp1 = load <2 x i64>* %A
416         %tmp2 = load <2 x i64>* %B
417         %tmp3 = call <2 x i64> @llvm.aarch64.neon.uqrshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
418         ret <2 x i64> %tmp3
419 }
420
421 declare <8 x i8>  @llvm.aarch64.neon.sqrshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
422 declare <4 x i16> @llvm.aarch64.neon.sqrshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
423 declare <2 x i32> @llvm.aarch64.neon.sqrshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
424 declare <1 x i64> @llvm.aarch64.neon.sqrshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
425
426 declare <8 x i8>  @llvm.aarch64.neon.uqrshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
427 declare <4 x i16> @llvm.aarch64.neon.uqrshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
428 declare <2 x i32> @llvm.aarch64.neon.uqrshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
429 declare <1 x i64> @llvm.aarch64.neon.uqrshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
430
431 declare <16 x i8> @llvm.aarch64.neon.sqrshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
432 declare <8 x i16> @llvm.aarch64.neon.sqrshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
433 declare <4 x i32> @llvm.aarch64.neon.sqrshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
434 declare <2 x i64> @llvm.aarch64.neon.sqrshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
435
436 declare <16 x i8> @llvm.aarch64.neon.uqrshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
437 declare <8 x i16> @llvm.aarch64.neon.uqrshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
438 declare <4 x i32> @llvm.aarch64.neon.uqrshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
439 declare <2 x i64> @llvm.aarch64.neon.uqrshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
440
441 define <8 x i8> @urshr8b(<8 x i8>* %A) nounwind {
442 ;CHECK-LABEL: urshr8b:
443 ;CHECK: urshr.8b
444         %tmp1 = load <8 x i8>* %A
445         %tmp3 = call <8 x i8> @llvm.aarch64.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>)
446         ret <8 x i8> %tmp3
447 }
448
449 define <4 x i16> @urshr4h(<4 x i16>* %A) nounwind {
450 ;CHECK-LABEL: urshr4h:
451 ;CHECK: urshr.4h
452         %tmp1 = load <4 x i16>* %A
453         %tmp3 = call <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
454         ret <4 x i16> %tmp3
455 }
456
457 define <2 x i32> @urshr2s(<2 x i32>* %A) nounwind {
458 ;CHECK-LABEL: urshr2s:
459 ;CHECK: urshr.2s
460         %tmp1 = load <2 x i32>* %A
461         %tmp3 = call <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
462         ret <2 x i32> %tmp3
463 }
464
465 define <16 x i8> @urshr16b(<16 x i8>* %A) nounwind {
466 ;CHECK-LABEL: urshr16b:
467 ;CHECK: urshr.16b
468         %tmp1 = load <16 x i8>* %A
469         %tmp3 = call <16 x i8> @llvm.aarch64.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>)
470         ret <16 x i8> %tmp3
471 }
472
473 define <8 x i16> @urshr8h(<8 x i16>* %A) nounwind {
474 ;CHECK-LABEL: urshr8h:
475 ;CHECK: urshr.8h
476         %tmp1 = load <8 x i16>* %A
477         %tmp3 = call <8 x i16> @llvm.aarch64.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>)
478         ret <8 x i16> %tmp3
479 }
480
481 define <4 x i32> @urshr4s(<4 x i32>* %A) nounwind {
482 ;CHECK-LABEL: urshr4s:
483 ;CHECK: urshr.4s
484         %tmp1 = load <4 x i32>* %A
485         %tmp3 = call <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
486         ret <4 x i32> %tmp3
487 }
488
489 define <2 x i64> @urshr2d(<2 x i64>* %A) nounwind {
490 ;CHECK-LABEL: urshr2d:
491 ;CHECK: urshr.2d
492         %tmp1 = load <2 x i64>* %A
493         %tmp3 = call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
494         ret <2 x i64> %tmp3
495 }
496
497 define <8 x i8> @srshr8b(<8 x i8>* %A) nounwind {
498 ;CHECK-LABEL: srshr8b:
499 ;CHECK: srshr.8b
500         %tmp1 = load <8 x i8>* %A
501         %tmp3 = call <8 x i8> @llvm.aarch64.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>)
502         ret <8 x i8> %tmp3
503 }
504
505 define <4 x i16> @srshr4h(<4 x i16>* %A) nounwind {
506 ;CHECK-LABEL: srshr4h:
507 ;CHECK: srshr.4h
508         %tmp1 = load <4 x i16>* %A
509         %tmp3 = call <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)
510         ret <4 x i16> %tmp3
511 }
512
513 define <2 x i32> @srshr2s(<2 x i32>* %A) nounwind {
514 ;CHECK-LABEL: srshr2s:
515 ;CHECK: srshr.2s
516         %tmp1 = load <2 x i32>* %A
517         %tmp3 = call <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)
518         ret <2 x i32> %tmp3
519 }
520
521 define <16 x i8> @srshr16b(<16 x i8>* %A) nounwind {
522 ;CHECK-LABEL: srshr16b:
523 ;CHECK: srshr.16b
524         %tmp1 = load <16 x i8>* %A
525         %tmp3 = call <16 x i8> @llvm.aarch64.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>)
526         ret <16 x i8> %tmp3
527 }
528
529 define <8 x i16> @srshr8h(<8 x i16>* %A) nounwind {
530 ;CHECK-LABEL: srshr8h:
531 ;CHECK: srshr.8h
532         %tmp1 = load <8 x i16>* %A
533         %tmp3 = call <8 x i16> @llvm.aarch64.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>)
534         ret <8 x i16> %tmp3
535 }
536
537 define <4 x i32> @srshr4s(<4 x i32>* %A) nounwind {
538 ;CHECK-LABEL: srshr4s:
539 ;CHECK: srshr.4s
540         %tmp1 = load <4 x i32>* %A
541         %tmp3 = call <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
542         ret <4 x i32> %tmp3
543 }
544
545 define <2 x i64> @srshr2d(<2 x i64>* %A) nounwind {
546 ;CHECK-LABEL: srshr2d:
547 ;CHECK: srshr.2d
548         %tmp1 = load <2 x i64>* %A
549         %tmp3 = call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)
550         ret <2 x i64> %tmp3
551 }
552
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.aarch64.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>)
558         ret <8 x i8> %tmp3
559 }
560
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.aarch64.neon.sqshlu.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
566         ret <4 x i16> %tmp3
567 }
568
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.aarch64.neon.sqshlu.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
574         ret <2 x i32> %tmp3
575 }
576
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.aarch64.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>)
582         ret <16 x i8> %tmp3
583 }
584
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.aarch64.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>)
590         ret <8 x i16> %tmp3
591 }
592
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.aarch64.neon.sqshlu.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
598         ret <4 x i32> %tmp3
599 }
600
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.aarch64.neon.sqshlu.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
606         ret <2 x i64> %tmp3
607 }
608
609 declare <8 x i8>  @llvm.aarch64.neon.sqshlu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
610 declare <4 x i16> @llvm.aarch64.neon.sqshlu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
611 declare <2 x i32> @llvm.aarch64.neon.sqshlu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
612 declare <1 x i64> @llvm.aarch64.neon.sqshlu.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
613
614 declare <16 x i8> @llvm.aarch64.neon.sqshlu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
615 declare <8 x i16> @llvm.aarch64.neon.sqshlu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
616 declare <4 x i32> @llvm.aarch64.neon.sqshlu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
617 declare <2 x i64> @llvm.aarch64.neon.sqshlu.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
618
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.aarch64.neon.rshrn.v8i8(<8 x i16> %tmp1, i32 1)
624         ret <8 x i8> %tmp3
625 }
626
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.aarch64.neon.rshrn.v4i16(<4 x i32> %tmp1, i32 1)
632         ret <4 x i16> %tmp3
633 }
634
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.aarch64.neon.rshrn.v2i32(<2 x i64> %tmp1, i32 1)
640         ret <2 x i32> %tmp3
641 }
642
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.aarch64.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>
650         ret <16 x i8> %tmp4
651 }
652
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.aarch64.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>
660         ret <8 x i16> %tmp4
661 }
662
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.aarch64.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>
670         ret <4 x i32> %tmp4
671 }
672
673 declare <8 x i8>  @llvm.aarch64.neon.rshrn.v8i8(<8 x i16>, i32) nounwind readnone
674 declare <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32>, i32) nounwind readnone
675 declare <2 x i32> @llvm.aarch64.neon.rshrn.v2i32(<2 x i64>, i32) nounwind readnone
676
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>
683         ret <8 x i8> %tmp3
684 }
685
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>
692         ret <4 x i16> %tmp3
693 }
694
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>
701         ret <2 x i32> %tmp3
702 }
703
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>
712         ret <16 x i8> %tmp4
713 }
714
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>
723         ret <8 x i16> %tmp4
724 }
725
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>
734         ret <4 x i32> %tmp4
735 }
736
737 declare <8 x i8>  @llvm.aarch64.neon.shrn.v8i8(<8 x i16>, i32) nounwind readnone
738 declare <4 x i16> @llvm.aarch64.neon.shrn.v4i16(<4 x i32>, i32) nounwind readnone
739 declare <2 x i32> @llvm.aarch64.neon.shrn.v2i32(<2 x i64>, i32) nounwind readnone
740
741 define i32 @sqshrn1s(i64 %A) nounwind {
742 ; CHECK-LABEL: sqshrn1s:
743 ; CHECK: sqshrn {{s[0-9]+}}, d0, #1
744   %tmp = call i32 @llvm.aarch64.neon.sqshrn.i32(i64 %A, i32 1)
745   ret i32 %tmp
746 }
747
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.aarch64.neon.sqshrn.v8i8(<8 x i16> %tmp1, i32 1)
753         ret <8 x i8> %tmp3
754 }
755
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.aarch64.neon.sqshrn.v4i16(<4 x i32> %tmp1, i32 1)
761         ret <4 x i16> %tmp3
762 }
763
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.aarch64.neon.sqshrn.v2i32(<2 x i64> %tmp1, i32 1)
769         ret <2 x i32> %tmp3
770 }
771
772
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.aarch64.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>
780         ret <16 x i8> %tmp4
781 }
782
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.aarch64.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>
790         ret <8 x i16> %tmp4
791 }
792
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.aarch64.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>
800         ret <4 x i32> %tmp4
801 }
802
803 declare i32  @llvm.aarch64.neon.sqshrn.i32(i64, i32) nounwind readnone
804 declare <8 x i8>  @llvm.aarch64.neon.sqshrn.v8i8(<8 x i16>, i32) nounwind readnone
805 declare <4 x i16> @llvm.aarch64.neon.sqshrn.v4i16(<4 x i32>, i32) nounwind readnone
806 declare <2 x i32> @llvm.aarch64.neon.sqshrn.v2i32(<2 x i64>, i32) nounwind readnone
807
808 define i32 @sqshrun1s(i64 %A) nounwind {
809 ; CHECK-LABEL: sqshrun1s:
810 ; CHECK: sqshrun {{s[0-9]+}}, d0, #1
811   %tmp = call i32 @llvm.aarch64.neon.sqshrun.i32(i64 %A, i32 1)
812   ret i32 %tmp
813 }
814
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.aarch64.neon.sqshrun.v8i8(<8 x i16> %tmp1, i32 1)
820         ret <8 x i8> %tmp3
821 }
822
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.aarch64.neon.sqshrun.v4i16(<4 x i32> %tmp1, i32 1)
828         ret <4 x i16> %tmp3
829 }
830
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.aarch64.neon.sqshrun.v2i32(<2 x i64> %tmp1, i32 1)
836         ret <2 x i32> %tmp3
837 }
838
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.aarch64.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>
846         ret <16 x i8> %tmp4
847 }
848
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.aarch64.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>
856         ret <8 x i16> %tmp4
857 }
858
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.aarch64.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>
866         ret <4 x i32> %tmp4
867 }
868
869 declare i32  @llvm.aarch64.neon.sqshrun.i32(i64, i32) nounwind readnone
870 declare <8 x i8>  @llvm.aarch64.neon.sqshrun.v8i8(<8 x i16>, i32) nounwind readnone
871 declare <4 x i16> @llvm.aarch64.neon.sqshrun.v4i16(<4 x i32>, i32) nounwind readnone
872 declare <2 x i32> @llvm.aarch64.neon.sqshrun.v2i32(<2 x i64>, i32) nounwind readnone
873
874 define i32 @sqrshrn1s(i64 %A) nounwind {
875 ; CHECK-LABEL: sqrshrn1s:
876 ; CHECK: sqrshrn {{s[0-9]+}}, d0, #1
877   %tmp = call i32 @llvm.aarch64.neon.sqrshrn.i32(i64 %A, i32 1)
878   ret i32 %tmp
879 }
880
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.aarch64.neon.sqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
886         ret <8 x i8> %tmp3
887 }
888
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.aarch64.neon.sqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
894         ret <4 x i16> %tmp3
895 }
896
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.aarch64.neon.sqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
902         ret <2 x i32> %tmp3
903 }
904
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.aarch64.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>
912         ret <16 x i8> %tmp4
913 }
914
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.aarch64.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>
922         ret <8 x i16> %tmp4
923 }
924
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.aarch64.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>
932         ret <4 x i32> %tmp4
933 }
934
935 declare i32  @llvm.aarch64.neon.sqrshrn.i32(i64, i32) nounwind readnone
936 declare <8 x i8>  @llvm.aarch64.neon.sqrshrn.v8i8(<8 x i16>, i32) nounwind readnone
937 declare <4 x i16> @llvm.aarch64.neon.sqrshrn.v4i16(<4 x i32>, i32) nounwind readnone
938 declare <2 x i32> @llvm.aarch64.neon.sqrshrn.v2i32(<2 x i64>, i32) nounwind readnone
939
940 define i32 @sqrshrun1s(i64 %A) nounwind {
941 ; CHECK-LABEL: sqrshrun1s:
942 ; CHECK: sqrshrun {{s[0-9]+}}, d0, #1
943   %tmp = call i32 @llvm.aarch64.neon.sqrshrun.i32(i64 %A, i32 1)
944   ret i32 %tmp
945 }
946
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.aarch64.neon.sqrshrun.v8i8(<8 x i16> %tmp1, i32 1)
952         ret <8 x i8> %tmp3
953 }
954
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.aarch64.neon.sqrshrun.v4i16(<4 x i32> %tmp1, i32 1)
960         ret <4 x i16> %tmp3
961 }
962
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.aarch64.neon.sqrshrun.v2i32(<2 x i64> %tmp1, i32 1)
968         ret <2 x i32> %tmp3
969 }
970
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.aarch64.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>
978         ret <16 x i8> %tmp4
979 }
980
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.aarch64.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>
988         ret <8 x i16> %tmp4
989 }
990
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.aarch64.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>
998         ret <4 x i32> %tmp4
999 }
1000
1001 declare i32  @llvm.aarch64.neon.sqrshrun.i32(i64, i32) nounwind readnone
1002 declare <8 x i8>  @llvm.aarch64.neon.sqrshrun.v8i8(<8 x i16>, i32) nounwind readnone
1003 declare <4 x i16> @llvm.aarch64.neon.sqrshrun.v4i16(<4 x i32>, i32) nounwind readnone
1004 declare <2 x i32> @llvm.aarch64.neon.sqrshrun.v2i32(<2 x i64>, i32) nounwind readnone
1005
1006 define i32 @uqrshrn1s(i64 %A) nounwind {
1007 ; CHECK-LABEL: uqrshrn1s:
1008 ; CHECK: uqrshrn {{s[0-9]+}}, d0, #1
1009   %tmp = call i32 @llvm.aarch64.neon.uqrshrn.i32(i64 %A, i32 1)
1010   ret i32 %tmp
1011 }
1012
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.aarch64.neon.uqrshrn.v8i8(<8 x i16> %tmp1, i32 1)
1018         ret <8 x i8> %tmp3
1019 }
1020
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.aarch64.neon.uqrshrn.v4i16(<4 x i32> %tmp1, i32 1)
1026         ret <4 x i16> %tmp3
1027 }
1028
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.aarch64.neon.uqrshrn.v2i32(<2 x i64> %tmp1, i32 1)
1034         ret <2 x i32> %tmp3
1035 }
1036
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.aarch64.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>
1044         ret <16 x i8> %tmp4
1045 }
1046
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.aarch64.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>
1054         ret <8 x i16> %tmp4
1055 }
1056
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.aarch64.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>
1064         ret <4 x i32> %tmp4
1065 }
1066
1067 declare i32  @llvm.aarch64.neon.uqrshrn.i32(i64, i32) nounwind readnone
1068 declare <8 x i8>  @llvm.aarch64.neon.uqrshrn.v8i8(<8 x i16>, i32) nounwind readnone
1069 declare <4 x i16> @llvm.aarch64.neon.uqrshrn.v4i16(<4 x i32>, i32) nounwind readnone
1070 declare <2 x i32> @llvm.aarch64.neon.uqrshrn.v2i32(<2 x i64>, i32) nounwind readnone
1071
1072 define i32 @uqshrn1s(i64 %A) nounwind {
1073 ; CHECK-LABEL: uqshrn1s:
1074 ; CHECK: uqshrn {{s[0-9]+}}, d0, #1
1075   %tmp = call i32 @llvm.aarch64.neon.uqshrn.i32(i64 %A, i32 1)
1076   ret i32 %tmp
1077 }
1078
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.aarch64.neon.uqshrn.v8i8(<8 x i16> %tmp1, i32 1)
1084         ret <8 x i8> %tmp3
1085 }
1086
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.aarch64.neon.uqshrn.v4i16(<4 x i32> %tmp1, i32 1)
1092         ret <4 x i16> %tmp3
1093 }
1094
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.aarch64.neon.uqshrn.v2i32(<2 x i64> %tmp1, i32 1)
1100         ret <2 x i32> %tmp3
1101 }
1102
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.aarch64.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>
1110         ret <16 x i8> %tmp4
1111 }
1112
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.aarch64.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>
1120   ret <8 x i16> %tmp4
1121 }
1122
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.aarch64.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>
1130   ret <4 x i32> %tmp4
1131 }
1132
1133 declare i32  @llvm.aarch64.neon.uqshrn.i32(i64, i32) nounwind readnone
1134 declare <8 x i8>  @llvm.aarch64.neon.uqshrn.v8i8(<8 x i16>, i32) nounwind readnone
1135 declare <4 x i16> @llvm.aarch64.neon.uqshrn.v4i16(<4 x i32>, i32) nounwind readnone
1136 declare <2 x i32> @llvm.aarch64.neon.uqshrn.v2i32(<2 x i64>, i32) nounwind readnone
1137
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>
1144         ret <8 x i16> %tmp3
1145 }
1146
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>
1153         ret <4 x i32> %tmp3
1154 }
1155
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>
1162         ret <2 x i64> %tmp3
1163 }
1164
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>
1172         ret <8 x i16> %tmp3
1173 }
1174
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>
1182         ret <4 x i32> %tmp3
1183 }
1184
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>
1192         ret <2 x i64> %tmp3
1193 }
1194
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>
1201         ret <8 x i16> %tmp3
1202 }
1203
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>
1210         ret <4 x i32> %tmp3
1211 }
1212
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>
1219         ret <2 x i64> %tmp3
1220 }
1221
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>
1229         ret <8 x i16> %tmp3
1230 }
1231
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>
1239         ret <4 x i32> %tmp3
1240 }
1241
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>
1249         ret <2 x i64> %tmp3
1250 }
1251
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.aarch64.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>)
1257         ret <8 x i8> %tmp3
1258 }
1259
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.aarch64.neon.sqshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
1265         ret <4 x i16> %tmp3
1266 }
1267
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.aarch64.neon.sqshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
1273         ret <2 x i32> %tmp3
1274 }
1275
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.aarch64.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>)
1281         ret <16 x i8> %tmp3
1282 }
1283
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.aarch64.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>)
1289         ret <8 x i16> %tmp3
1290 }
1291
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.aarch64.neon.sqshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
1297         ret <4 x i32> %tmp3
1298 }
1299
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.aarch64.neon.sqshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
1305         ret <2 x i64> %tmp3
1306 }
1307
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.aarch64.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>)
1313         ret <8 x i8> %tmp3
1314 }
1315
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.aarch64.neon.uqshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)
1321         ret <4 x i16> %tmp3
1322 }
1323
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.aarch64.neon.uqshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)
1329         ret <2 x i32> %tmp3
1330 }
1331
1332 define <16 x i8> @uqshli16b(<16 x i8>* %A) nounwind {
1333 ;CHECK-LABEL: uqshli16b:
1334 ;CHECK: uqshl.16b
1335         %tmp1 = load <16 x i8>* %A
1336         %tmp3 = call <16 x i8> @llvm.aarch64.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>)
1337         ret <16 x i8> %tmp3
1338 }
1339
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.aarch64.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>)
1345         ret <8 x i16> %tmp3
1346 }
1347
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.aarch64.neon.uqshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)
1353         ret <4 x i32> %tmp3
1354 }
1355
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.aarch64.neon.uqshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)
1361         ret <2 x i64> %tmp3
1362 }
1363
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.aarch64.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
1371         ret <8 x i8> %tmp5
1372 }
1373
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.aarch64.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
1381         ret <4 x i16> %tmp5
1382 }
1383
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.aarch64.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
1391         ret <2 x i32> %tmp5
1392 }
1393
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.aarch64.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
1401          ret <16 x i8> %tmp5
1402 }
1403
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.aarch64.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
1411          ret <8 x i16> %tmp5
1412 }
1413
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.aarch64.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
1421          ret <4 x i32> %tmp5
1422 }
1423
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.aarch64.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
1431          ret <2 x i64> %tmp5
1432 }
1433
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.aarch64.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
1441         ret <8 x i8> %tmp5
1442 }
1443
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.aarch64.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
1451         ret <4 x i16> %tmp5
1452 }
1453
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.aarch64.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
1461         ret <2 x i32> %tmp5
1462 }
1463
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.aarch64.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
1471          ret <16 x i8> %tmp5
1472 }
1473
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.aarch64.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
1481          ret <8 x i16> %tmp5
1482 }
1483
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.aarch64.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
1491          ret <4 x i32> %tmp5
1492 }
1493
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.aarch64.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
1501          ret <2 x i64> %tmp5
1502 }
1503
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
1511         ret <8 x i8> %tmp5
1512 }
1513
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
1521         ret <4 x i16> %tmp5
1522 }
1523
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
1531         ret <2 x i32> %tmp5
1532 }
1533
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
1541          ret <16 x i8> %tmp5
1542 }
1543
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
1551          ret <8 x i16> %tmp5
1552 }
1553
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
1561          ret <4 x i32> %tmp5
1562 }
1563
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
1571          ret <2 x i64> %tmp5
1572 }
1573
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
1581         ret <8 x i8> %tmp5
1582 }
1583
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
1591         ret <4 x i16> %tmp5
1592 }
1593
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
1601         ret <2 x i32> %tmp5
1602 }
1603
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
1611          ret <16 x i8> %tmp5
1612 }
1613
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
1621          ret <8 x i16> %tmp5
1622 }
1623
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
1631          ret <4 x i32> %tmp5
1632 }
1633
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
1641          ret <2 x i64> %tmp5
1642 }
1643
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
1647 ;CHECK-NEXT: orr.8b
1648 ;CHECK-NEXT: ret
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
1653         ret <8 x i8> %tmp5
1654 }
1655
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
1659 ;CHECK-NEXT: orr.8b
1660 ;CHECK-NEXT: ret
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
1665         ret <4 x i16> %tmp5
1666 }
1667
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
1671 ;CHECK-NEXT: orr.8b
1672 ;CHECK-NEXT: ret
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
1677         ret <2 x i32> %tmp5
1678 }
1679
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
1684 ;CHECK-NEXT: ret
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
1689          ret <16 x i8> %tmp5
1690 }
1691
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
1696 ;CHECK-NEXT: ret
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
1701          ret <8 x i16> %tmp5
1702 }
1703
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
1708 ;CHECK-NEXT: ret
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
1713          ret <4 x i32> %tmp5
1714 }
1715
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
1720 ;CHECK-NEXT: ret
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
1725          ret <2 x i64> %tmp5
1726 }
1727
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
1731 ;CHECK-NEXT: orr.8b
1732 ;CHECK-NEXT: ret
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
1737         ret <8 x i8> %tmp5
1738 }
1739
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
1743 ;CHECK-NEXT: orr.8b
1744 ;CHECK-NEXT: ret
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
1749         ret <4 x i16> %tmp5
1750 }
1751
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
1755 ;CHECK-NEXT: orr.8b
1756 ;CHECK-NEXT: ret
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
1761         ret <2 x i32> %tmp5
1762 }
1763
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
1768 ;CHECK-NEXT: ret
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
1773          ret <16 x i8> %tmp5
1774 }
1775
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
1780 ;CHECK-NEXT: ret
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
1785          ret <8 x i16> %tmp5
1786 }
1787
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
1792 ;CHECK-NEXT: ret
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
1797          ret <4 x i32> %tmp5
1798 }
1799
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
1804 ;CHECK-NEXT: ret
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
1809          ret <2 x i64> %tmp5
1810 }
1811
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>
1817   ret <8 x i16> %res
1818 }
1819
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>
1826   ret <4 x i32> %res
1827 }
1828
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.aarch64.neon.vsli.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2, i32 1)
1835         ret <8 x i8> %tmp3
1836 }
1837
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.aarch64.neon.vsli.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2, i32 1)
1844         ret <4 x i16> %tmp3
1845 }
1846
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.aarch64.neon.vsli.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2, i32 1)
1853         ret <2 x i32> %tmp3
1854 }
1855
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.aarch64.neon.vsli.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2, i32 1)
1862         ret <1 x i64> %tmp3
1863 }
1864
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.aarch64.neon.vsli.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2, i32 1)
1871         ret <16 x i8> %tmp3
1872 }
1873
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.aarch64.neon.vsli.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2, i32 1)
1880         ret <8 x i16> %tmp3
1881 }
1882
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.aarch64.neon.vsli.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2, i32 1)
1889         ret <4 x i32> %tmp3
1890 }
1891
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.aarch64.neon.vsli.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2, i32 1)
1898         ret <2 x i64> %tmp3
1899 }
1900
1901 declare <8 x i8>  @llvm.aarch64.neon.vsli.v8i8(<8 x i8>, <8 x i8>, i32) nounwind readnone
1902 declare <4 x i16> @llvm.aarch64.neon.vsli.v4i16(<4 x i16>, <4 x i16>, i32) nounwind readnone
1903 declare <2 x i32> @llvm.aarch64.neon.vsli.v2i32(<2 x i32>, <2 x i32>, i32) nounwind readnone
1904 declare <1 x i64> @llvm.aarch64.neon.vsli.v1i64(<1 x i64>, <1 x i64>, i32) nounwind readnone
1905
1906 declare <16 x i8> @llvm.aarch64.neon.vsli.v16i8(<16 x i8>, <16 x i8>, i32) nounwind readnone
1907 declare <8 x i16> @llvm.aarch64.neon.vsli.v8i16(<8 x i16>, <8 x i16>, i32) nounwind readnone
1908 declare <4 x i32> @llvm.aarch64.neon.vsli.v4i32(<4 x i32>, <4 x i32>, i32) nounwind readnone
1909 declare <2 x i64> @llvm.aarch64.neon.vsli.v2i64(<2 x i64>, <2 x i64>, i32) nounwind readnone
1910
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
1916   ret <1 x i64> %c
1917 }