llvm/test/Object/ar-error.test: Don't check the message "No such file or directory".
[oota-llvm.git] / test / CodeGen / AArch64 / neon-scalar-shift-imm.ll
1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
2 ; Intrinsic wrangling & arm64 does it differently.
3
4 define i64 @test_vshrd_n_s64(i64 %a) {
5 ; CHECK: test_vshrd_n_s64
6 ; CHECK: sshr {{d[0-9]+}}, {{d[0-9]+}}, #63
7 entry:
8   %vsshr = insertelement <1 x i64> undef, i64 %a, i32 0
9   %vsshr1 = call <1 x i64> @llvm.aarch64.neon.vshrds.n(<1 x i64> %vsshr, i32 63)
10   %0 = extractelement <1 x i64> %vsshr1, i32 0
11   ret i64 %0
12 }
13
14 declare <1 x i64> @llvm.aarch64.neon.vshrds.n(<1 x i64>, i32)
15
16 define i64 @test_vshrd_n_u64(i64 %a) {
17 ; CHECK: test_vshrd_n_u64
18 ; CHECK: ushr {{d[0-9]+}}, {{d[0-9]+}}, #63
19 entry:
20   %vushr = insertelement <1 x i64> undef, i64 %a, i32 0
21   %vushr1 = call <1 x i64> @llvm.aarch64.neon.vshrdu.n(<1 x i64> %vushr, i32 63)
22   %0 = extractelement <1 x i64> %vushr1, i32 0
23   ret i64 %0
24 }
25
26 declare <1 x i64> @llvm.aarch64.neon.vshrdu.n(<1 x i64>, i32)
27
28 define i64 @test_vrshrd_n_s64(i64 %a) {
29 ; CHECK: test_vrshrd_n_s64
30 ; CHECK: srshr {{d[0-9]+}}, {{d[0-9]+}}, #63
31 entry:
32   %vsrshr = insertelement <1 x i64> undef, i64 %a, i32 0
33   %vsrshr1 = call <1 x i64> @llvm.aarch64.neon.vsrshr.v1i64(<1 x i64> %vsrshr, i32 63)
34   %0 = extractelement <1 x i64> %vsrshr1, i32 0
35   ret i64 %0
36 }
37
38 declare <1 x i64> @llvm.aarch64.neon.vsrshr.v1i64(<1 x i64>, i32)
39
40 define i64 @test_vrshrd_n_u64(i64 %a) {
41 ; CHECK: test_vrshrd_n_u64
42 ; CHECK: urshr {{d[0-9]+}}, {{d[0-9]+}}, #63
43 entry:
44   %vurshr = insertelement <1 x i64> undef, i64 %a, i32 0
45   %vurshr1 = call <1 x i64> @llvm.aarch64.neon.vurshr.v1i64(<1 x i64> %vurshr, i32 63)
46   %0 = extractelement <1 x i64> %vurshr1, i32 0
47   ret i64 %0
48 }
49
50 declare <1 x i64> @llvm.aarch64.neon.vurshr.v1i64(<1 x i64>, i32)
51
52 define i64 @test_vsrad_n_s64(i64 %a, i64 %b) {
53 ; CHECK: test_vsrad_n_s64
54 ; CHECK: ssra {{d[0-9]+}}, {{d[0-9]+}}, #63
55 entry:
56   %vssra = insertelement <1 x i64> undef, i64 %a, i32 0
57   %vssra1 = insertelement <1 x i64> undef, i64 %b, i32 0
58   %vssra2 = call <1 x i64> @llvm.aarch64.neon.vsrads.n(<1 x i64> %vssra, <1 x i64> %vssra1, i32 63)
59   %0 = extractelement <1 x i64> %vssra2, i32 0
60   ret i64 %0
61 }
62
63 declare <1 x i64> @llvm.aarch64.neon.vsrads.n(<1 x i64>, <1 x i64>, i32)
64
65 define i64 @test_vsrad_n_u64(i64 %a, i64 %b) {
66 ; CHECK: test_vsrad_n_u64
67 ; CHECK: usra {{d[0-9]+}}, {{d[0-9]+}}, #63
68 entry:
69   %vusra = insertelement <1 x i64> undef, i64 %a, i32 0
70   %vusra1 = insertelement <1 x i64> undef, i64 %b, i32 0
71   %vusra2 = call <1 x i64> @llvm.aarch64.neon.vsradu.n(<1 x i64> %vusra, <1 x i64> %vusra1, i32 63)
72   %0 = extractelement <1 x i64> %vusra2, i32 0
73   ret i64 %0
74 }
75
76 declare <1 x i64> @llvm.aarch64.neon.vsradu.n(<1 x i64>, <1 x i64>, i32)
77
78 define i64 @test_vrsrad_n_s64(i64 %a, i64 %b) {
79 ; CHECK: test_vrsrad_n_s64
80 ; CHECK: srsra {{d[0-9]+}}, {{d[0-9]+}}, #63
81 entry:
82   %vsrsra = insertelement <1 x i64> undef, i64 %a, i32 0
83   %vsrsra1 = insertelement <1 x i64> undef, i64 %b, i32 0
84   %vsrsra2 = call <1 x i64> @llvm.aarch64.neon.vrsrads.n(<1 x i64> %vsrsra, <1 x i64> %vsrsra1, i32 63)
85   %0 = extractelement <1 x i64> %vsrsra2, i32 0
86   ret i64 %0
87 }
88
89 declare <1 x i64> @llvm.aarch64.neon.vrsrads.n(<1 x i64>, <1 x i64>, i32)
90
91 define i64 @test_vrsrad_n_u64(i64 %a, i64 %b) {
92 ; CHECK: test_vrsrad_n_u64
93 ; CHECK: ursra {{d[0-9]+}}, {{d[0-9]+}}, #63
94 entry:
95   %vursra = insertelement <1 x i64> undef, i64 %a, i32 0
96   %vursra1 = insertelement <1 x i64> undef, i64 %b, i32 0
97   %vursra2 = call <1 x i64> @llvm.aarch64.neon.vrsradu.n(<1 x i64> %vursra, <1 x i64> %vursra1, i32 63)
98   %0 = extractelement <1 x i64> %vursra2, i32 0
99   ret i64 %0
100 }
101
102 declare <1 x i64> @llvm.aarch64.neon.vrsradu.n(<1 x i64>, <1 x i64>, i32)
103
104 define i64 @test_vshld_n_s64(i64 %a) {
105 ; CHECK: test_vshld_n_s64
106 ; CHECK: shl {{d[0-9]+}}, {{d[0-9]+}}, #63
107 entry:
108   %vshl = insertelement <1 x i64> undef, i64 %a, i32 0
109   %vshl1 = call <1 x i64> @llvm.aarch64.neon.vshld.n(<1 x i64> %vshl, i32 63)
110   %0 = extractelement <1 x i64> %vshl1, i32 0
111   ret i64 %0
112 }
113
114 declare <1 x i64> @llvm.aarch64.neon.vshld.n(<1 x i64>, i32)
115
116 define i64 @test_vshld_n_u64(i64 %a) {
117 ; CHECK: test_vshld_n_u64
118 ; CHECK: shl {{d[0-9]+}}, {{d[0-9]+}}, #63
119 entry:
120   %vshl = insertelement <1 x i64> undef, i64 %a, i32 0
121   %vshl1 = call <1 x i64> @llvm.aarch64.neon.vshld.n(<1 x i64> %vshl, i32 63)
122   %0 = extractelement <1 x i64> %vshl1, i32 0
123   ret i64 %0
124 }
125
126 define i8 @test_vqshlb_n_s8(i8 %a) {
127 ; CHECK: test_vqshlb_n_s8
128 ; CHECK: sqshl {{b[0-9]+}}, {{b[0-9]+}}, #7
129 entry:
130   %vsqshl = insertelement <1 x i8> undef, i8 %a, i32 0
131   %vsqshl1 = call <1 x i8> @llvm.aarch64.neon.vqshls.n.v1i8(<1 x i8> %vsqshl, i32 7)
132   %0 = extractelement <1 x i8> %vsqshl1, i32 0
133   ret i8 %0
134 }
135
136 declare <1 x i8> @llvm.aarch64.neon.vqshls.n.v1i8(<1 x i8>, i32)
137
138 define i16 @test_vqshlh_n_s16(i16 %a) {
139 ; CHECK: test_vqshlh_n_s16
140 ; CHECK: sqshl {{h[0-9]+}}, {{h[0-9]+}}, #15
141 entry:
142   %vsqshl = insertelement <1 x i16> undef, i16 %a, i32 0
143   %vsqshl1 = call <1 x i16> @llvm.aarch64.neon.vqshls.n.v1i16(<1 x i16> %vsqshl, i32 15)
144   %0 = extractelement <1 x i16> %vsqshl1, i32 0
145   ret i16 %0
146 }
147
148 declare <1 x i16> @llvm.aarch64.neon.vqshls.n.v1i16(<1 x i16>, i32)
149
150 define i32 @test_vqshls_n_s32(i32 %a) {
151 ; CHECK: test_vqshls_n_s32
152 ; CHECK: sqshl {{s[0-9]+}}, {{s[0-9]+}}, #31
153 entry:
154   %vsqshl = insertelement <1 x i32> undef, i32 %a, i32 0
155   %vsqshl1 = call <1 x i32> @llvm.aarch64.neon.vqshls.n.v1i32(<1 x i32> %vsqshl, i32 31)
156   %0 = extractelement <1 x i32> %vsqshl1, i32 0
157   ret i32 %0
158 }
159
160 declare <1 x i32> @llvm.aarch64.neon.vqshls.n.v1i32(<1 x i32>, i32)
161
162 define i64 @test_vqshld_n_s64(i64 %a) {
163 ; CHECK: test_vqshld_n_s64
164 ; CHECK: sqshl {{d[0-9]+}}, {{d[0-9]+}}, #63
165 entry:
166   %vsqshl = insertelement <1 x i64> undef, i64 %a, i32 0
167   %vsqshl1 = call <1 x i64> @llvm.aarch64.neon.vqshls.n.v1i64(<1 x i64> %vsqshl, i32 63)
168   %0 = extractelement <1 x i64> %vsqshl1, i32 0
169   ret i64 %0
170 }
171
172 declare <1 x i64> @llvm.aarch64.neon.vqshls.n.v1i64(<1 x i64>, i32)
173
174 define i8 @test_vqshlb_n_u8(i8 %a) {
175 ; CHECK: test_vqshlb_n_u8
176 ; CHECK: uqshl {{b[0-9]+}}, {{b[0-9]+}}, #7
177 entry:
178   %vuqshl = insertelement <1 x i8> undef, i8 %a, i32 0
179   %vuqshl1 = call <1 x i8> @llvm.aarch64.neon.vqshlu.n.v1i8(<1 x i8> %vuqshl, i32 7)
180   %0 = extractelement <1 x i8> %vuqshl1, i32 0
181   ret i8 %0
182 }
183
184 declare <1 x i8> @llvm.aarch64.neon.vqshlu.n.v1i8(<1 x i8>, i32)
185
186 define i16 @test_vqshlh_n_u16(i16 %a) {
187 ; CHECK: test_vqshlh_n_u16
188 ; CHECK: uqshl {{h[0-9]+}}, {{h[0-9]+}}, #15
189 entry:
190   %vuqshl = insertelement <1 x i16> undef, i16 %a, i32 0
191   %vuqshl1 = call <1 x i16> @llvm.aarch64.neon.vqshlu.n.v1i16(<1 x i16> %vuqshl, i32 15)
192   %0 = extractelement <1 x i16> %vuqshl1, i32 0
193   ret i16 %0
194 }
195
196 declare <1 x i16> @llvm.aarch64.neon.vqshlu.n.v1i16(<1 x i16>, i32)
197
198 define i32 @test_vqshls_n_u32(i32 %a) {
199 ; CHECK: test_vqshls_n_u32
200 ; CHECK: uqshl {{s[0-9]+}}, {{s[0-9]+}}, #31
201 entry:
202   %vuqshl = insertelement <1 x i32> undef, i32 %a, i32 0
203   %vuqshl1 = call <1 x i32> @llvm.aarch64.neon.vqshlu.n.v1i32(<1 x i32> %vuqshl, i32 31)
204   %0 = extractelement <1 x i32> %vuqshl1, i32 0
205   ret i32 %0
206 }
207
208 declare <1 x i32> @llvm.aarch64.neon.vqshlu.n.v1i32(<1 x i32>, i32)
209
210 define i64 @test_vqshld_n_u64(i64 %a) {
211 ; CHECK: test_vqshld_n_u64
212 ; CHECK: uqshl {{d[0-9]+}}, {{d[0-9]+}}, #63
213 entry:
214   %vuqshl = insertelement <1 x i64> undef, i64 %a, i32 0
215   %vuqshl1 = call <1 x i64> @llvm.aarch64.neon.vqshlu.n.v1i64(<1 x i64> %vuqshl, i32 63)
216   %0 = extractelement <1 x i64> %vuqshl1, i32 0
217   ret i64 %0
218 }
219
220 declare <1 x i64> @llvm.aarch64.neon.vqshlu.n.v1i64(<1 x i64>, i32)
221
222 define i8 @test_vqshlub_n_s8(i8 %a) {
223 ; CHECK: test_vqshlub_n_s8
224 ; CHECK: sqshlu {{b[0-9]+}}, {{b[0-9]+}}, #7
225 entry:
226   %vsqshlu = insertelement <1 x i8> undef, i8 %a, i32 0
227   %vsqshlu1 = call <1 x i8> @llvm.aarch64.neon.vsqshlu.v1i8(<1 x i8> %vsqshlu, i32 7)
228   %0 = extractelement <1 x i8> %vsqshlu1, i32 0
229   ret i8 %0
230 }
231
232 declare <1 x i8> @llvm.aarch64.neon.vsqshlu.v1i8(<1 x i8>, i32)
233
234 define i16 @test_vqshluh_n_s16(i16 %a) {
235 ; CHECK: test_vqshluh_n_s16
236 ; CHECK: sqshlu {{h[0-9]+}}, {{h[0-9]+}}, #15
237 entry:
238   %vsqshlu = insertelement <1 x i16> undef, i16 %a, i32 0
239   %vsqshlu1 = call <1 x i16> @llvm.aarch64.neon.vsqshlu.v1i16(<1 x i16> %vsqshlu, i32 15)
240   %0 = extractelement <1 x i16> %vsqshlu1, i32 0
241   ret i16 %0
242 }
243
244 declare <1 x i16> @llvm.aarch64.neon.vsqshlu.v1i16(<1 x i16>, i32)
245
246 define i32 @test_vqshlus_n_s32(i32 %a) {
247 ; CHECK: test_vqshlus_n_s32
248 ; CHECK: sqshlu {{s[0-9]+}}, {{s[0-9]+}}, #31
249 entry:
250   %vsqshlu = insertelement <1 x i32> undef, i32 %a, i32 0
251   %vsqshlu1 = call <1 x i32> @llvm.aarch64.neon.vsqshlu.v1i32(<1 x i32> %vsqshlu, i32 31)
252   %0 = extractelement <1 x i32> %vsqshlu1, i32 0
253   ret i32 %0
254 }
255
256 declare <1 x i32> @llvm.aarch64.neon.vsqshlu.v1i32(<1 x i32>, i32)
257
258 define i64 @test_vqshlud_n_s64(i64 %a) {
259 ; CHECK: test_vqshlud_n_s64
260 ; CHECK: sqshlu {{d[0-9]+}}, {{d[0-9]+}}, #63
261 entry:
262   %vsqshlu = insertelement <1 x i64> undef, i64 %a, i32 0
263   %vsqshlu1 = call <1 x i64> @llvm.aarch64.neon.vsqshlu.v1i64(<1 x i64> %vsqshlu, i32 63)
264   %0 = extractelement <1 x i64> %vsqshlu1, i32 0
265   ret i64 %0
266 }
267
268 declare <1 x i64> @llvm.aarch64.neon.vsqshlu.v1i64(<1 x i64>, i32)
269
270 define i64 @test_vsrid_n_s64(i64 %a, i64 %b) {
271 ; CHECK: test_vsrid_n_s64
272 ; CHECK: sri {{d[0-9]+}}, {{d[0-9]+}}, #63
273 entry:
274   %vsri = insertelement <1 x i64> undef, i64 %a, i32 0
275   %vsri1 = insertelement <1 x i64> undef, i64 %b, i32 0
276   %vsri2 = call <1 x i64> @llvm.aarch64.neon.vsri.v1i64(<1 x i64> %vsri, <1 x i64> %vsri1, i32 63)
277   %0 = extractelement <1 x i64> %vsri2, i32 0
278   ret i64 %0
279 }
280
281 declare <1 x i64> @llvm.aarch64.neon.vsri.v1i64(<1 x i64>, <1 x i64>, i32)
282
283 define i64 @test_vsrid_n_u64(i64 %a, i64 %b) {
284 ; CHECK: test_vsrid_n_u64
285 ; CHECK: sri {{d[0-9]+}}, {{d[0-9]+}}, #63
286 entry:
287   %vsri = insertelement <1 x i64> undef, i64 %a, i32 0
288   %vsri1 = insertelement <1 x i64> undef, i64 %b, i32 0
289   %vsri2 = call <1 x i64> @llvm.aarch64.neon.vsri.v1i64(<1 x i64> %vsri, <1 x i64> %vsri1, i32 63)
290   %0 = extractelement <1 x i64> %vsri2, i32 0
291   ret i64 %0
292 }
293
294 define i64 @test_vslid_n_s64(i64 %a, i64 %b) {
295 ; CHECK: test_vslid_n_s64
296 ; CHECK: sli {{d[0-9]+}}, {{d[0-9]+}}, #63
297 entry:
298   %vsli = insertelement <1 x i64> undef, i64 %a, i32 0
299   %vsli1 = insertelement <1 x i64> undef, i64 %b, i32 0
300   %vsli2 = call <1 x i64> @llvm.aarch64.neon.vsli.v1i64(<1 x i64> %vsli, <1 x i64> %vsli1, i32 63)
301   %0 = extractelement <1 x i64> %vsli2, i32 0
302   ret i64 %0
303 }
304
305 declare <1 x i64> @llvm.aarch64.neon.vsli.v1i64(<1 x i64>, <1 x i64>, i32)
306
307 define i64 @test_vslid_n_u64(i64 %a, i64 %b) {
308 ; CHECK: test_vslid_n_u64
309 ; CHECK: sli {{d[0-9]+}}, {{d[0-9]+}}, #63
310 entry:
311   %vsli = insertelement <1 x i64> undef, i64 %a, i32 0
312   %vsli1 = insertelement <1 x i64> undef, i64 %b, i32 0
313   %vsli2 = call <1 x i64> @llvm.aarch64.neon.vsli.v1i64(<1 x i64> %vsli, <1 x i64> %vsli1, i32 63)
314   %0 = extractelement <1 x i64> %vsli2, i32 0
315   ret i64 %0
316 }
317
318 define i8 @test_vqshrnh_n_s16(i16 %a) {
319 ; CHECK: test_vqshrnh_n_s16
320 ; CHECK: sqshrn {{b[0-9]+}}, {{h[0-9]+}}, #8
321 entry:
322   %vsqshrn = insertelement <1 x i16> undef, i16 %a, i32 0
323   %vsqshrn1 = call <1 x i8> @llvm.aarch64.neon.vsqshrn.v1i8(<1 x i16> %vsqshrn, i32 8)
324   %0 = extractelement <1 x i8> %vsqshrn1, i32 0
325   ret i8 %0
326 }
327
328 declare <1 x i8> @llvm.aarch64.neon.vsqshrn.v1i8(<1 x i16>, i32)
329
330 define i16 @test_vqshrns_n_s32(i32 %a) {
331 ; CHECK: test_vqshrns_n_s32
332 ; CHECK: sqshrn {{h[0-9]+}}, {{s[0-9]+}}, #16
333 entry:
334   %vsqshrn = insertelement <1 x i32> undef, i32 %a, i32 0
335   %vsqshrn1 = call <1 x i16> @llvm.aarch64.neon.vsqshrn.v1i16(<1 x i32> %vsqshrn, i32 16)
336   %0 = extractelement <1 x i16> %vsqshrn1, i32 0
337   ret i16 %0
338 }
339
340 declare <1 x i16> @llvm.aarch64.neon.vsqshrn.v1i16(<1 x i32>, i32)
341
342 define i32 @test_vqshrnd_n_s64(i64 %a) {
343 ; CHECK: test_vqshrnd_n_s64
344 ; CHECK: sqshrn {{s[0-9]+}}, {{d[0-9]+}}, #32
345 entry:
346   %vsqshrn = insertelement <1 x i64> undef, i64 %a, i32 0
347   %vsqshrn1 = call <1 x i32> @llvm.aarch64.neon.vsqshrn.v1i32(<1 x i64> %vsqshrn, i32 32)
348   %0 = extractelement <1 x i32> %vsqshrn1, i32 0
349   ret i32 %0
350 }
351
352 declare <1 x i32> @llvm.aarch64.neon.vsqshrn.v1i32(<1 x i64>, i32)
353
354 define i8 @test_vqshrnh_n_u16(i16 %a) {
355 ; CHECK: test_vqshrnh_n_u16
356 ; CHECK: uqshrn {{b[0-9]+}}, {{h[0-9]+}}, #8
357 entry:
358   %vuqshrn = insertelement <1 x i16> undef, i16 %a, i32 0
359   %vuqshrn1 = call <1 x i8> @llvm.aarch64.neon.vuqshrn.v1i8(<1 x i16> %vuqshrn, i32 8)
360   %0 = extractelement <1 x i8> %vuqshrn1, i32 0
361   ret i8 %0
362 }
363
364 declare <1 x i8> @llvm.aarch64.neon.vuqshrn.v1i8(<1 x i16>, i32)
365
366 define i16 @test_vqshrns_n_u32(i32 %a) {
367 ; CHECK: test_vqshrns_n_u32
368 ; CHECK: uqshrn {{h[0-9]+}}, {{s[0-9]+}}, #16
369 entry:
370   %vuqshrn = insertelement <1 x i32> undef, i32 %a, i32 0
371   %vuqshrn1 = call <1 x i16> @llvm.aarch64.neon.vuqshrn.v1i16(<1 x i32> %vuqshrn, i32 16)
372   %0 = extractelement <1 x i16> %vuqshrn1, i32 0
373   ret i16 %0
374 }
375
376 declare <1 x i16> @llvm.aarch64.neon.vuqshrn.v1i16(<1 x i32>, i32)
377
378 define i32 @test_vqshrnd_n_u64(i64 %a) {
379 ; CHECK: test_vqshrnd_n_u64
380 ; CHECK: uqshrn {{s[0-9]+}}, {{d[0-9]+}}, #32
381 entry:
382   %vuqshrn = insertelement <1 x i64> undef, i64 %a, i32 0
383   %vuqshrn1 = call <1 x i32> @llvm.aarch64.neon.vuqshrn.v1i32(<1 x i64> %vuqshrn, i32 32)
384   %0 = extractelement <1 x i32> %vuqshrn1, i32 0
385   ret i32 %0
386 }
387
388 declare <1 x i32> @llvm.aarch64.neon.vuqshrn.v1i32(<1 x i64>, i32)
389
390 define i8 @test_vqrshrnh_n_s16(i16 %a) {
391 ; CHECK: test_vqrshrnh_n_s16
392 ; CHECK: sqrshrn {{b[0-9]+}}, {{h[0-9]+}}, #8
393 entry:
394   %vsqrshrn = insertelement <1 x i16> undef, i16 %a, i32 0
395   %vsqrshrn1 = call <1 x i8> @llvm.aarch64.neon.vsqrshrn.v1i8(<1 x i16> %vsqrshrn, i32 8)
396   %0 = extractelement <1 x i8> %vsqrshrn1, i32 0
397   ret i8 %0
398 }
399
400 declare <1 x i8> @llvm.aarch64.neon.vsqrshrn.v1i8(<1 x i16>, i32)
401
402 define i16 @test_vqrshrns_n_s32(i32 %a) {
403 ; CHECK: test_vqrshrns_n_s32
404 ; CHECK: sqrshrn {{h[0-9]+}}, {{s[0-9]+}}, #16
405 entry:
406   %vsqrshrn = insertelement <1 x i32> undef, i32 %a, i32 0
407   %vsqrshrn1 = call <1 x i16> @llvm.aarch64.neon.vsqrshrn.v1i16(<1 x i32> %vsqrshrn, i32 16)
408   %0 = extractelement <1 x i16> %vsqrshrn1, i32 0
409   ret i16 %0
410 }
411
412 declare <1 x i16> @llvm.aarch64.neon.vsqrshrn.v1i16(<1 x i32>, i32)
413
414 define i32 @test_vqrshrnd_n_s64(i64 %a) {
415 ; CHECK: test_vqrshrnd_n_s64
416 ; CHECK: sqrshrn {{s[0-9]+}}, {{d[0-9]+}}, #32
417 entry:
418   %vsqrshrn = insertelement <1 x i64> undef, i64 %a, i32 0
419   %vsqrshrn1 = call <1 x i32> @llvm.aarch64.neon.vsqrshrn.v1i32(<1 x i64> %vsqrshrn, i32 32)
420   %0 = extractelement <1 x i32> %vsqrshrn1, i32 0
421   ret i32 %0
422 }
423
424 declare <1 x i32> @llvm.aarch64.neon.vsqrshrn.v1i32(<1 x i64>, i32)
425
426 define i8 @test_vqrshrnh_n_u16(i16 %a) {
427 ; CHECK: test_vqrshrnh_n_u16
428 ; CHECK: uqrshrn {{b[0-9]+}}, {{h[0-9]+}}, #8
429 entry:
430   %vuqrshrn = insertelement <1 x i16> undef, i16 %a, i32 0
431   %vuqrshrn1 = call <1 x i8> @llvm.aarch64.neon.vuqrshrn.v1i8(<1 x i16> %vuqrshrn, i32 8)
432   %0 = extractelement <1 x i8> %vuqrshrn1, i32 0
433   ret i8 %0
434 }
435
436 declare <1 x i8> @llvm.aarch64.neon.vuqrshrn.v1i8(<1 x i16>, i32)
437
438 define i16 @test_vqrshrns_n_u32(i32 %a) {
439 ; CHECK: test_vqrshrns_n_u32
440 ; CHECK: uqrshrn {{h[0-9]+}}, {{s[0-9]+}}, #16
441 entry:
442   %vuqrshrn = insertelement <1 x i32> undef, i32 %a, i32 0
443   %vuqrshrn1 = call <1 x i16> @llvm.aarch64.neon.vuqrshrn.v1i16(<1 x i32> %vuqrshrn, i32 16)
444   %0 = extractelement <1 x i16> %vuqrshrn1, i32 0
445   ret i16 %0
446 }
447
448 declare <1 x i16> @llvm.aarch64.neon.vuqrshrn.v1i16(<1 x i32>, i32)
449
450 define i32 @test_vqrshrnd_n_u64(i64 %a) {
451 ; CHECK: test_vqrshrnd_n_u64
452 ; CHECK: uqrshrn {{s[0-9]+}}, {{d[0-9]+}}, #32
453 entry:
454   %vuqrshrn = insertelement <1 x i64> undef, i64 %a, i32 0
455   %vuqrshrn1 = call <1 x i32> @llvm.aarch64.neon.vuqrshrn.v1i32(<1 x i64> %vuqrshrn, i32 32)
456   %0 = extractelement <1 x i32> %vuqrshrn1, i32 0
457   ret i32 %0
458 }
459
460 declare <1 x i32> @llvm.aarch64.neon.vuqrshrn.v1i32(<1 x i64>, i32)
461
462 define i8 @test_vqshrunh_n_s16(i16 %a) {
463 ; CHECK: test_vqshrunh_n_s16
464 ; CHECK: sqshrun {{b[0-9]+}}, {{h[0-9]+}}, #8
465 entry:
466   %vsqshrun = insertelement <1 x i16> undef, i16 %a, i32 0
467   %vsqshrun1 = call <1 x i8> @llvm.aarch64.neon.vsqshrun.v1i8(<1 x i16> %vsqshrun, i32 8)
468   %0 = extractelement <1 x i8> %vsqshrun1, i32 0
469   ret i8 %0
470 }
471
472 declare <1 x i8> @llvm.aarch64.neon.vsqshrun.v1i8(<1 x i16>, i32)
473
474 define i16 @test_vqshruns_n_s32(i32 %a) {
475 ; CHECK: test_vqshruns_n_s32
476 ; CHECK: sqshrun {{h[0-9]+}}, {{s[0-9]+}}, #16
477 entry:
478   %vsqshrun = insertelement <1 x i32> undef, i32 %a, i32 0
479   %vsqshrun1 = call <1 x i16> @llvm.aarch64.neon.vsqshrun.v1i16(<1 x i32> %vsqshrun, i32 16)
480   %0 = extractelement <1 x i16> %vsqshrun1, i32 0
481   ret i16 %0
482 }
483
484 declare <1 x i16> @llvm.aarch64.neon.vsqshrun.v1i16(<1 x i32>, i32)
485
486 define i32 @test_vqshrund_n_s64(i64 %a) {
487 ; CHECK: test_vqshrund_n_s64
488 ; CHECK: sqshrun {{s[0-9]+}}, {{d[0-9]+}}, #32
489 entry:
490   %vsqshrun = insertelement <1 x i64> undef, i64 %a, i32 0
491   %vsqshrun1 = call <1 x i32> @llvm.aarch64.neon.vsqshrun.v1i32(<1 x i64> %vsqshrun, i32 32)
492   %0 = extractelement <1 x i32> %vsqshrun1, i32 0
493   ret i32 %0
494 }
495
496 declare <1 x i32> @llvm.aarch64.neon.vsqshrun.v1i32(<1 x i64>, i32)
497
498 define i8 @test_vqrshrunh_n_s16(i16 %a) {
499 ; CHECK: test_vqrshrunh_n_s16
500 ; CHECK: sqrshrun {{b[0-9]+}}, {{h[0-9]+}}, #8
501 entry:
502   %vsqrshrun = insertelement <1 x i16> undef, i16 %a, i32 0
503   %vsqrshrun1 = call <1 x i8> @llvm.aarch64.neon.vsqrshrun.v1i8(<1 x i16> %vsqrshrun, i32 8)
504   %0 = extractelement <1 x i8> %vsqrshrun1, i32 0
505   ret i8 %0
506 }
507
508 declare <1 x i8> @llvm.aarch64.neon.vsqrshrun.v1i8(<1 x i16>, i32)
509
510 define i16 @test_vqrshruns_n_s32(i32 %a) {
511 ; CHECK: test_vqrshruns_n_s32
512 ; CHECK: sqrshrun {{h[0-9]+}}, {{s[0-9]+}}, #16
513 entry:
514   %vsqrshrun = insertelement <1 x i32> undef, i32 %a, i32 0
515   %vsqrshrun1 = call <1 x i16> @llvm.aarch64.neon.vsqrshrun.v1i16(<1 x i32> %vsqrshrun, i32 16)
516   %0 = extractelement <1 x i16> %vsqrshrun1, i32 0
517   ret i16 %0
518 }
519
520 declare <1 x i16> @llvm.aarch64.neon.vsqrshrun.v1i16(<1 x i32>, i32)
521
522 define i32 @test_vqrshrund_n_s64(i64 %a) {
523 ; CHECK: test_vqrshrund_n_s64
524 ; CHECK: sqrshrun {{s[0-9]+}}, {{d[0-9]+}}, #32
525 entry:
526   %vsqrshrun = insertelement <1 x i64> undef, i64 %a, i32 0
527   %vsqrshrun1 = call <1 x i32> @llvm.aarch64.neon.vsqrshrun.v1i32(<1 x i64> %vsqrshrun, i32 32)
528   %0 = extractelement <1 x i32> %vsqrshrun1, i32 0
529   ret i32 %0
530 }
531
532 declare <1 x i32> @llvm.aarch64.neon.vsqrshrun.v1i32(<1 x i64>, i32)