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