]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/aarch64-neon-misc.c
Vendor import of clang trunk r304149:
[FreeBSD/FreeBSD.git] / test / CodeGen / aarch64-neon-misc.c
1 // RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon \
2 // RUN:  -disable-O0-optnone -fallow-half-arguments-and-returns -emit-llvm -o - %s \
3 // RUN: | opt -S -mem2reg | FileCheck %s
4
5 // Test new aarch64 intrinsics and types
6
7 #include <arm_neon.h>
8
9 // CHECK-LABEL: @test_vceqz_s8(
10 // CHECK:   [[TMP0:%.*]] = icmp eq <8 x i8> %a, zeroinitializer
11 // CHECK:   [[VCEQZ_I:%.*]] = sext <8 x i1> [[TMP0]] to <8 x i8>
12 // CHECK:   ret <8 x i8> [[VCEQZ_I]]
13 uint8x8_t test_vceqz_s8(int8x8_t a) {
14   return vceqz_s8(a);
15 }
16
17 // CHECK-LABEL: @test_vceqz_s16(
18 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
19 // CHECK:   [[TMP1:%.*]] = icmp eq <4 x i16> %a, zeroinitializer
20 // CHECK:   [[VCEQZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
21 // CHECK:   ret <4 x i16> [[VCEQZ_I]]
22 uint16x4_t test_vceqz_s16(int16x4_t a) {
23   return vceqz_s16(a);
24 }
25
26 // CHECK-LABEL: @test_vceqz_s32(
27 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
28 // CHECK:   [[TMP1:%.*]] = icmp eq <2 x i32> %a, zeroinitializer
29 // CHECK:   [[VCEQZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
30 // CHECK:   ret <2 x i32> [[VCEQZ_I]]
31 uint32x2_t test_vceqz_s32(int32x2_t a) {
32   return vceqz_s32(a);
33 }
34
35 // CHECK-LABEL: @test_vceqz_s64(
36 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
37 // CHECK:   [[TMP1:%.*]] = icmp eq <1 x i64> %a, zeroinitializer
38 // CHECK:   [[VCEQZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
39 // CHECK:   ret <1 x i64> [[VCEQZ_I]]
40 uint64x1_t test_vceqz_s64(int64x1_t a) {
41   return vceqz_s64(a);
42 }
43
44 // CHECK-LABEL: @test_vceqz_u64(
45 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
46 // CHECK:   [[TMP1:%.*]] = icmp eq <1 x i64> %a, zeroinitializer
47 // CHECK:   [[VCEQZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
48 // CHECK:   ret <1 x i64> [[VCEQZ_I]]
49 uint64x1_t test_vceqz_u64(uint64x1_t a) {
50   return vceqz_u64(a);
51 }
52
53 // CHECK-LABEL: @test_vceqz_p64(
54 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
55 // CHECK:   [[TMP1:%.*]] = icmp eq <1 x i64> %a, zeroinitializer
56 // CHECK:   [[VCEQZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
57 // CHECK:   ret <1 x i64> [[VCEQZ_I]]
58 uint64x1_t test_vceqz_p64(poly64x1_t a) {
59   return vceqz_p64(a);
60 }
61
62 // CHECK-LABEL: @test_vceqzq_s8(
63 // CHECK:   [[TMP0:%.*]] = icmp eq <16 x i8> %a, zeroinitializer
64 // CHECK:   [[VCEQZ_I:%.*]] = sext <16 x i1> [[TMP0]] to <16 x i8>
65 // CHECK:   ret <16 x i8> [[VCEQZ_I]]
66 uint8x16_t test_vceqzq_s8(int8x16_t a) {
67   return vceqzq_s8(a);
68 }
69
70 // CHECK-LABEL: @test_vceqzq_s16(
71 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
72 // CHECK:   [[TMP1:%.*]] = icmp eq <8 x i16> %a, zeroinitializer
73 // CHECK:   [[VCEQZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
74 // CHECK:   ret <8 x i16> [[VCEQZ_I]]
75 uint16x8_t test_vceqzq_s16(int16x8_t a) {
76   return vceqzq_s16(a);
77 }
78
79 // CHECK-LABEL: @test_vceqzq_s32(
80 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
81 // CHECK:   [[TMP1:%.*]] = icmp eq <4 x i32> %a, zeroinitializer
82 // CHECK:   [[VCEQZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
83 // CHECK:   ret <4 x i32> [[VCEQZ_I]]
84 uint32x4_t test_vceqzq_s32(int32x4_t a) {
85   return vceqzq_s32(a);
86 }
87
88 // CHECK-LABEL: @test_vceqzq_s64(
89 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
90 // CHECK:   [[TMP1:%.*]] = icmp eq <2 x i64> %a, zeroinitializer
91 // CHECK:   [[VCEQZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
92 // CHECK:   ret <2 x i64> [[VCEQZ_I]]
93 uint64x2_t test_vceqzq_s64(int64x2_t a) {
94   return vceqzq_s64(a);
95 }
96
97 // CHECK-LABEL: @test_vceqz_u8(
98 // CHECK:   [[TMP0:%.*]] = icmp eq <8 x i8> %a, zeroinitializer
99 // CHECK:   [[VCEQZ_I:%.*]] = sext <8 x i1> [[TMP0]] to <8 x i8>
100 // CHECK:   ret <8 x i8> [[VCEQZ_I]]
101 uint8x8_t test_vceqz_u8(uint8x8_t a) {
102   return vceqz_u8(a);
103 }
104
105 // CHECK-LABEL: @test_vceqz_u16(
106 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
107 // CHECK:   [[TMP1:%.*]] = icmp eq <4 x i16> %a, zeroinitializer
108 // CHECK:   [[VCEQZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
109 // CHECK:   ret <4 x i16> [[VCEQZ_I]]
110 uint16x4_t test_vceqz_u16(uint16x4_t a) {
111   return vceqz_u16(a);
112 }
113
114 // CHECK-LABEL: @test_vceqz_u32(
115 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
116 // CHECK:   [[TMP1:%.*]] = icmp eq <2 x i32> %a, zeroinitializer
117 // CHECK:   [[VCEQZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
118 // CHECK:   ret <2 x i32> [[VCEQZ_I]]
119 uint32x2_t test_vceqz_u32(uint32x2_t a) {
120   return vceqz_u32(a);
121 }
122
123 // CHECK-LABEL: @test_vceqzq_u8(
124 // CHECK:   [[TMP0:%.*]] = icmp eq <16 x i8> %a, zeroinitializer
125 // CHECK:   [[VCEQZ_I:%.*]] = sext <16 x i1> [[TMP0]] to <16 x i8>
126 // CHECK:   ret <16 x i8> [[VCEQZ_I]]
127 uint8x16_t test_vceqzq_u8(uint8x16_t a) {
128   return vceqzq_u8(a);
129 }
130
131 // CHECK-LABEL: @test_vceqzq_u16(
132 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
133 // CHECK:   [[TMP1:%.*]] = icmp eq <8 x i16> %a, zeroinitializer
134 // CHECK:   [[VCEQZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
135 // CHECK:   ret <8 x i16> [[VCEQZ_I]]
136 uint16x8_t test_vceqzq_u16(uint16x8_t a) {
137   return vceqzq_u16(a);
138 }
139
140 // CHECK-LABEL: @test_vceqzq_u32(
141 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
142 // CHECK:   [[TMP1:%.*]] = icmp eq <4 x i32> %a, zeroinitializer
143 // CHECK:   [[VCEQZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
144 // CHECK:   ret <4 x i32> [[VCEQZ_I]]
145 uint32x4_t test_vceqzq_u32(uint32x4_t a) {
146   return vceqzq_u32(a);
147 }
148
149 // CHECK-LABEL: @test_vceqzq_u64(
150 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
151 // CHECK:   [[TMP1:%.*]] = icmp eq <2 x i64> %a, zeroinitializer
152 // CHECK:   [[VCEQZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
153 // CHECK:   ret <2 x i64> [[VCEQZ_I]]
154 uint64x2_t test_vceqzq_u64(uint64x2_t a) {
155   return vceqzq_u64(a);
156 }
157
158 // CHECK-LABEL: @test_vceqz_f32(
159 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
160 // CHECK:   [[TMP1:%.*]] = fcmp oeq <2 x float> %a, zeroinitializer
161 // CHECK:   [[VCEQZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
162 // CHECK:   ret <2 x i32> [[VCEQZ_I]]
163 uint32x2_t test_vceqz_f32(float32x2_t a) {
164   return vceqz_f32(a);
165 }
166
167 // CHECK-LABEL: @test_vceqz_f64(
168 // CHECK:   [[TMP0:%.*]] = bitcast <1 x double> %a to <8 x i8>
169 // CHECK:   [[TMP1:%.*]] = fcmp oeq <1 x double> %a, zeroinitializer
170 // CHECK:   [[VCEQZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
171 // CHECK:   ret <1 x i64> [[VCEQZ_I]]
172 uint64x1_t test_vceqz_f64(float64x1_t a) {
173   return vceqz_f64(a);
174 }
175
176 // CHECK-LABEL: @test_vceqzq_f32(
177 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
178 // CHECK:   [[TMP1:%.*]] = fcmp oeq <4 x float> %a, zeroinitializer
179 // CHECK:   [[VCEQZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
180 // CHECK:   ret <4 x i32> [[VCEQZ_I]]
181 uint32x4_t test_vceqzq_f32(float32x4_t a) {
182   return vceqzq_f32(a);
183 }
184
185 // CHECK-LABEL: @test_vceqz_p8(
186 // CHECK:   [[TMP0:%.*]] = icmp eq <8 x i8> %a, zeroinitializer
187 // CHECK:   [[VCEQZ_I:%.*]] = sext <8 x i1> [[TMP0]] to <8 x i8>
188 // CHECK:   ret <8 x i8> [[VCEQZ_I]]
189 uint8x8_t test_vceqz_p8(poly8x8_t a) {
190   return vceqz_p8(a);
191 }
192
193 // CHECK-LABEL: @test_vceqzq_p8(
194 // CHECK:   [[TMP0:%.*]] = icmp eq <16 x i8> %a, zeroinitializer
195 // CHECK:   [[VCEQZ_I:%.*]] = sext <16 x i1> [[TMP0]] to <16 x i8>
196 // CHECK:   ret <16 x i8> [[VCEQZ_I]]
197 uint8x16_t test_vceqzq_p8(poly8x16_t a) {
198   return vceqzq_p8(a);
199 }
200
201 // CHECK-LABEL: @test_vceqz_p16(
202 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
203 // CHECK:   [[TMP1:%.*]] = icmp eq <4 x i16> %a, zeroinitializer
204 // CHECK:   [[VCEQZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
205 // CHECK:   ret <4 x i16> [[VCEQZ_I]]
206 uint16x4_t test_vceqz_p16(poly16x4_t a) {
207   return vceqz_p16(a);
208 }
209
210 // CHECK-LABEL: @test_vceqzq_p16(
211 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
212 // CHECK:   [[TMP1:%.*]] = icmp eq <8 x i16> %a, zeroinitializer
213 // CHECK:   [[VCEQZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
214 // CHECK:   ret <8 x i16> [[VCEQZ_I]]
215 uint16x8_t test_vceqzq_p16(poly16x8_t a) {
216   return vceqzq_p16(a);
217 }
218
219 // CHECK-LABEL: @test_vceqzq_f64(
220 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
221 // CHECK:   [[TMP1:%.*]] = fcmp oeq <2 x double> %a, zeroinitializer
222 // CHECK:   [[VCEQZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
223 // CHECK:   ret <2 x i64> [[VCEQZ_I]]
224 uint64x2_t test_vceqzq_f64(float64x2_t a) {
225   return vceqzq_f64(a);
226 }
227
228 // CHECK-LABEL: @test_vceqzq_p64(
229 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
230 // CHECK:   [[TMP1:%.*]] = icmp eq <2 x i64> %a, zeroinitializer
231 // CHECK:   [[VCEQZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
232 // CHECK:   ret <2 x i64> [[VCEQZ_I]]
233 uint64x2_t test_vceqzq_p64(poly64x2_t a) {
234   return vceqzq_p64(a);
235 }
236
237 // CHECK-LABEL: @test_vcgez_s8(
238 // CHECK:   [[TMP0:%.*]] = icmp sge <8 x i8> %a, zeroinitializer
239 // CHECK:   [[VCGEZ_I:%.*]] = sext <8 x i1> [[TMP0]] to <8 x i8>
240 // CHECK:   ret <8 x i8> [[VCGEZ_I]]
241 uint8x8_t test_vcgez_s8(int8x8_t a) {
242   return vcgez_s8(a);
243 }
244
245 // CHECK-LABEL: @test_vcgez_s16(
246 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
247 // CHECK:   [[TMP1:%.*]] = icmp sge <4 x i16> %a, zeroinitializer
248 // CHECK:   [[VCGEZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
249 // CHECK:   ret <4 x i16> [[VCGEZ_I]]
250 uint16x4_t test_vcgez_s16(int16x4_t a) {
251   return vcgez_s16(a);
252 }
253
254 // CHECK-LABEL: @test_vcgez_s32(
255 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
256 // CHECK:   [[TMP1:%.*]] = icmp sge <2 x i32> %a, zeroinitializer
257 // CHECK:   [[VCGEZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
258 // CHECK:   ret <2 x i32> [[VCGEZ_I]]
259 uint32x2_t test_vcgez_s32(int32x2_t a) {
260   return vcgez_s32(a);
261 }
262
263 // CHECK-LABEL: @test_vcgez_s64(
264 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
265 // CHECK:   [[TMP1:%.*]] = icmp sge <1 x i64> %a, zeroinitializer
266 // CHECK:   [[VCGEZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
267 // CHECK:   ret <1 x i64> [[VCGEZ_I]]
268 uint64x1_t test_vcgez_s64(int64x1_t a) {
269   return vcgez_s64(a);
270 }
271
272 // CHECK-LABEL: @test_vcgezq_s8(
273 // CHECK:   [[TMP0:%.*]] = icmp sge <16 x i8> %a, zeroinitializer
274 // CHECK:   [[VCGEZ_I:%.*]] = sext <16 x i1> [[TMP0]] to <16 x i8>
275 // CHECK:   ret <16 x i8> [[VCGEZ_I]]
276 uint8x16_t test_vcgezq_s8(int8x16_t a) {
277   return vcgezq_s8(a);
278 }
279
280 // CHECK-LABEL: @test_vcgezq_s16(
281 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
282 // CHECK:   [[TMP1:%.*]] = icmp sge <8 x i16> %a, zeroinitializer
283 // CHECK:   [[VCGEZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
284 // CHECK:   ret <8 x i16> [[VCGEZ_I]]
285 uint16x8_t test_vcgezq_s16(int16x8_t a) {
286   return vcgezq_s16(a);
287 }
288
289 // CHECK-LABEL: @test_vcgezq_s32(
290 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
291 // CHECK:   [[TMP1:%.*]] = icmp sge <4 x i32> %a, zeroinitializer
292 // CHECK:   [[VCGEZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
293 // CHECK:   ret <4 x i32> [[VCGEZ_I]]
294 uint32x4_t test_vcgezq_s32(int32x4_t a) {
295   return vcgezq_s32(a);
296 }
297
298 // CHECK-LABEL: @test_vcgezq_s64(
299 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
300 // CHECK:   [[TMP1:%.*]] = icmp sge <2 x i64> %a, zeroinitializer
301 // CHECK:   [[VCGEZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
302 // CHECK:   ret <2 x i64> [[VCGEZ_I]]
303 uint64x2_t test_vcgezq_s64(int64x2_t a) {
304   return vcgezq_s64(a);
305 }
306
307 // CHECK-LABEL: @test_vcgez_f32(
308 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
309 // CHECK:   [[TMP1:%.*]] = fcmp oge <2 x float> %a, zeroinitializer
310 // CHECK:   [[VCGEZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
311 // CHECK:   ret <2 x i32> [[VCGEZ_I]]
312 uint32x2_t test_vcgez_f32(float32x2_t a) {
313   return vcgez_f32(a);
314 }
315
316 // CHECK-LABEL: @test_vcgez_f64(
317 // CHECK:   [[TMP0:%.*]] = bitcast <1 x double> %a to <8 x i8>
318 // CHECK:   [[TMP1:%.*]] = fcmp oge <1 x double> %a, zeroinitializer
319 // CHECK:   [[VCGEZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
320 // CHECK:   ret <1 x i64> [[VCGEZ_I]]
321 uint64x1_t test_vcgez_f64(float64x1_t a) {
322   return vcgez_f64(a);
323 }
324
325 // CHECK-LABEL: @test_vcgezq_f32(
326 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
327 // CHECK:   [[TMP1:%.*]] = fcmp oge <4 x float> %a, zeroinitializer
328 // CHECK:   [[VCGEZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
329 // CHECK:   ret <4 x i32> [[VCGEZ_I]]
330 uint32x4_t test_vcgezq_f32(float32x4_t a) {
331   return vcgezq_f32(a);
332 }
333
334 // CHECK-LABEL: @test_vcgezq_f64(
335 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
336 // CHECK:   [[TMP1:%.*]] = fcmp oge <2 x double> %a, zeroinitializer
337 // CHECK:   [[VCGEZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
338 // CHECK:   ret <2 x i64> [[VCGEZ_I]]
339 uint64x2_t test_vcgezq_f64(float64x2_t a) {
340   return vcgezq_f64(a);
341 }
342
343 // CHECK-LABEL: @test_vclez_s8(
344 // CHECK:   [[TMP0:%.*]] = icmp sle <8 x i8> %a, zeroinitializer
345 // CHECK:   [[VCLEZ_I:%.*]] = sext <8 x i1> [[TMP0]] to <8 x i8>
346 // CHECK:   ret <8 x i8> [[VCLEZ_I]]
347 uint8x8_t test_vclez_s8(int8x8_t a) {
348   return vclez_s8(a);
349 }
350
351 // CHECK-LABEL: @test_vclez_s16(
352 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
353 // CHECK:   [[TMP1:%.*]] = icmp sle <4 x i16> %a, zeroinitializer
354 // CHECK:   [[VCLEZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
355 // CHECK:   ret <4 x i16> [[VCLEZ_I]]
356 uint16x4_t test_vclez_s16(int16x4_t a) {
357   return vclez_s16(a);
358 }
359
360 // CHECK-LABEL: @test_vclez_s32(
361 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
362 // CHECK:   [[TMP1:%.*]] = icmp sle <2 x i32> %a, zeroinitializer
363 // CHECK:   [[VCLEZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
364 // CHECK:   ret <2 x i32> [[VCLEZ_I]]
365 uint32x2_t test_vclez_s32(int32x2_t a) {
366   return vclez_s32(a);
367 }
368
369 // CHECK-LABEL: @test_vclez_s64(
370 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
371 // CHECK:   [[TMP1:%.*]] = icmp sle <1 x i64> %a, zeroinitializer
372 // CHECK:   [[VCLEZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
373 // CHECK:   ret <1 x i64> [[VCLEZ_I]]
374 uint64x1_t test_vclez_s64(int64x1_t a) {
375   return vclez_s64(a);
376 }
377
378 // CHECK-LABEL: @test_vclezq_s8(
379 // CHECK:   [[TMP0:%.*]] = icmp sle <16 x i8> %a, zeroinitializer
380 // CHECK:   [[VCLEZ_I:%.*]] = sext <16 x i1> [[TMP0]] to <16 x i8>
381 // CHECK:   ret <16 x i8> [[VCLEZ_I]]
382 uint8x16_t test_vclezq_s8(int8x16_t a) {
383   return vclezq_s8(a);
384 }
385
386 // CHECK-LABEL: @test_vclezq_s16(
387 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
388 // CHECK:   [[TMP1:%.*]] = icmp sle <8 x i16> %a, zeroinitializer
389 // CHECK:   [[VCLEZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
390 // CHECK:   ret <8 x i16> [[VCLEZ_I]]
391 uint16x8_t test_vclezq_s16(int16x8_t a) {
392   return vclezq_s16(a);
393 }
394
395 // CHECK-LABEL: @test_vclezq_s32(
396 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
397 // CHECK:   [[TMP1:%.*]] = icmp sle <4 x i32> %a, zeroinitializer
398 // CHECK:   [[VCLEZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
399 // CHECK:   ret <4 x i32> [[VCLEZ_I]]
400 uint32x4_t test_vclezq_s32(int32x4_t a) {
401   return vclezq_s32(a);
402 }
403
404 // CHECK-LABEL: @test_vclezq_s64(
405 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
406 // CHECK:   [[TMP1:%.*]] = icmp sle <2 x i64> %a, zeroinitializer
407 // CHECK:   [[VCLEZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
408 // CHECK:   ret <2 x i64> [[VCLEZ_I]]
409 uint64x2_t test_vclezq_s64(int64x2_t a) {
410   return vclezq_s64(a);
411 }
412
413 // CHECK-LABEL: @test_vclez_f32(
414 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
415 // CHECK:   [[TMP1:%.*]] = fcmp ole <2 x float> %a, zeroinitializer
416 // CHECK:   [[VCLEZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
417 // CHECK:   ret <2 x i32> [[VCLEZ_I]]
418 uint32x2_t test_vclez_f32(float32x2_t a) {
419   return vclez_f32(a);
420 }
421
422 // CHECK-LABEL: @test_vclez_f64(
423 // CHECK:   [[TMP0:%.*]] = bitcast <1 x double> %a to <8 x i8>
424 // CHECK:   [[TMP1:%.*]] = fcmp ole <1 x double> %a, zeroinitializer
425 // CHECK:   [[VCLEZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
426 // CHECK:   ret <1 x i64> [[VCLEZ_I]]
427 uint64x1_t test_vclez_f64(float64x1_t a) {
428   return vclez_f64(a);
429 }
430
431 // CHECK-LABEL: @test_vclezq_f32(
432 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
433 // CHECK:   [[TMP1:%.*]] = fcmp ole <4 x float> %a, zeroinitializer
434 // CHECK:   [[VCLEZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
435 // CHECK:   ret <4 x i32> [[VCLEZ_I]]
436 uint32x4_t test_vclezq_f32(float32x4_t a) {
437   return vclezq_f32(a);
438 }
439
440 // CHECK-LABEL: @test_vclezq_f64(
441 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
442 // CHECK:   [[TMP1:%.*]] = fcmp ole <2 x double> %a, zeroinitializer
443 // CHECK:   [[VCLEZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
444 // CHECK:   ret <2 x i64> [[VCLEZ_I]]
445 uint64x2_t test_vclezq_f64(float64x2_t a) {
446   return vclezq_f64(a);
447 }
448
449 // CHECK-LABEL: @test_vcgtz_s8(
450 // CHECK:   [[TMP0:%.*]] = icmp sgt <8 x i8> %a, zeroinitializer
451 // CHECK:   [[VCGTZ_I:%.*]] = sext <8 x i1> [[TMP0]] to <8 x i8>
452 // CHECK:   ret <8 x i8> [[VCGTZ_I]]
453 uint8x8_t test_vcgtz_s8(int8x8_t a) {
454   return vcgtz_s8(a);
455 }
456
457 // CHECK-LABEL: @test_vcgtz_s16(
458 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
459 // CHECK:   [[TMP1:%.*]] = icmp sgt <4 x i16> %a, zeroinitializer
460 // CHECK:   [[VCGTZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
461 // CHECK:   ret <4 x i16> [[VCGTZ_I]]
462 uint16x4_t test_vcgtz_s16(int16x4_t a) {
463   return vcgtz_s16(a);
464 }
465
466 // CHECK-LABEL: @test_vcgtz_s32(
467 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
468 // CHECK:   [[TMP1:%.*]] = icmp sgt <2 x i32> %a, zeroinitializer
469 // CHECK:   [[VCGTZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
470 // CHECK:   ret <2 x i32> [[VCGTZ_I]]
471 uint32x2_t test_vcgtz_s32(int32x2_t a) {
472   return vcgtz_s32(a);
473 }
474
475 // CHECK-LABEL: @test_vcgtz_s64(
476 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
477 // CHECK:   [[TMP1:%.*]] = icmp sgt <1 x i64> %a, zeroinitializer
478 // CHECK:   [[VCGTZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
479 // CHECK:   ret <1 x i64> [[VCGTZ_I]]
480 uint64x1_t test_vcgtz_s64(int64x1_t a) {
481   return vcgtz_s64(a);
482 }
483
484 // CHECK-LABEL: @test_vcgtzq_s8(
485 // CHECK:   [[TMP0:%.*]] = icmp sgt <16 x i8> %a, zeroinitializer
486 // CHECK:   [[VCGTZ_I:%.*]] = sext <16 x i1> [[TMP0]] to <16 x i8>
487 // CHECK:   ret <16 x i8> [[VCGTZ_I]]
488 uint8x16_t test_vcgtzq_s8(int8x16_t a) {
489   return vcgtzq_s8(a);
490 }
491
492 // CHECK-LABEL: @test_vcgtzq_s16(
493 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
494 // CHECK:   [[TMP1:%.*]] = icmp sgt <8 x i16> %a, zeroinitializer
495 // CHECK:   [[VCGTZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
496 // CHECK:   ret <8 x i16> [[VCGTZ_I]]
497 uint16x8_t test_vcgtzq_s16(int16x8_t a) {
498   return vcgtzq_s16(a);
499 }
500
501 // CHECK-LABEL: @test_vcgtzq_s32(
502 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
503 // CHECK:   [[TMP1:%.*]] = icmp sgt <4 x i32> %a, zeroinitializer
504 // CHECK:   [[VCGTZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
505 // CHECK:   ret <4 x i32> [[VCGTZ_I]]
506 uint32x4_t test_vcgtzq_s32(int32x4_t a) {
507   return vcgtzq_s32(a);
508 }
509
510 // CHECK-LABEL: @test_vcgtzq_s64(
511 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
512 // CHECK:   [[TMP1:%.*]] = icmp sgt <2 x i64> %a, zeroinitializer
513 // CHECK:   [[VCGTZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
514 // CHECK:   ret <2 x i64> [[VCGTZ_I]]
515 uint64x2_t test_vcgtzq_s64(int64x2_t a) {
516   return vcgtzq_s64(a);
517 }
518
519 // CHECK-LABEL: @test_vcgtz_f32(
520 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
521 // CHECK:   [[TMP1:%.*]] = fcmp ogt <2 x float> %a, zeroinitializer
522 // CHECK:   [[VCGTZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
523 // CHECK:   ret <2 x i32> [[VCGTZ_I]]
524 uint32x2_t test_vcgtz_f32(float32x2_t a) {
525   return vcgtz_f32(a);
526 }
527
528 // CHECK-LABEL: @test_vcgtz_f64(
529 // CHECK:   [[TMP0:%.*]] = bitcast <1 x double> %a to <8 x i8>
530 // CHECK:   [[TMP1:%.*]] = fcmp ogt <1 x double> %a, zeroinitializer
531 // CHECK:   [[VCGTZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
532 // CHECK:   ret <1 x i64> [[VCGTZ_I]]
533 uint64x1_t test_vcgtz_f64(float64x1_t a) {
534   return vcgtz_f64(a);
535 }
536
537 // CHECK-LABEL: @test_vcgtzq_f32(
538 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
539 // CHECK:   [[TMP1:%.*]] = fcmp ogt <4 x float> %a, zeroinitializer
540 // CHECK:   [[VCGTZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
541 // CHECK:   ret <4 x i32> [[VCGTZ_I]]
542 uint32x4_t test_vcgtzq_f32(float32x4_t a) {
543   return vcgtzq_f32(a);
544 }
545
546 // CHECK-LABEL: @test_vcgtzq_f64(
547 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
548 // CHECK:   [[TMP1:%.*]] = fcmp ogt <2 x double> %a, zeroinitializer
549 // CHECK:   [[VCGTZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
550 // CHECK:   ret <2 x i64> [[VCGTZ_I]]
551 uint64x2_t test_vcgtzq_f64(float64x2_t a) {
552   return vcgtzq_f64(a);
553 }
554
555 // CHECK-LABEL: @test_vcltz_s8(
556 // CHECK:   [[TMP0:%.*]] = icmp slt <8 x i8> %a, zeroinitializer
557 // CHECK:   [[VCLTZ_I:%.*]] = sext <8 x i1> [[TMP0]] to <8 x i8>
558 // CHECK:   ret <8 x i8> [[VCLTZ_I]]
559 uint8x8_t test_vcltz_s8(int8x8_t a) {
560   return vcltz_s8(a);
561 }
562
563 // CHECK-LABEL: @test_vcltz_s16(
564 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
565 // CHECK:   [[TMP1:%.*]] = icmp slt <4 x i16> %a, zeroinitializer
566 // CHECK:   [[VCLTZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
567 // CHECK:   ret <4 x i16> [[VCLTZ_I]]
568 uint16x4_t test_vcltz_s16(int16x4_t a) {
569   return vcltz_s16(a);
570 }
571
572 // CHECK-LABEL: @test_vcltz_s32(
573 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
574 // CHECK:   [[TMP1:%.*]] = icmp slt <2 x i32> %a, zeroinitializer
575 // CHECK:   [[VCLTZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
576 // CHECK:   ret <2 x i32> [[VCLTZ_I]]
577 uint32x2_t test_vcltz_s32(int32x2_t a) {
578   return vcltz_s32(a);
579 }
580
581 // CHECK-LABEL: @test_vcltz_s64(
582 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
583 // CHECK:   [[TMP1:%.*]] = icmp slt <1 x i64> %a, zeroinitializer
584 // CHECK:   [[VCLTZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
585 // CHECK:   ret <1 x i64> [[VCLTZ_I]]
586 uint64x1_t test_vcltz_s64(int64x1_t a) {
587   return vcltz_s64(a);
588 }
589
590 // CHECK-LABEL: @test_vcltzq_s8(
591 // CHECK:   [[TMP0:%.*]] = icmp slt <16 x i8> %a, zeroinitializer
592 // CHECK:   [[VCLTZ_I:%.*]] = sext <16 x i1> [[TMP0]] to <16 x i8>
593 // CHECK:   ret <16 x i8> [[VCLTZ_I]]
594 uint8x16_t test_vcltzq_s8(int8x16_t a) {
595   return vcltzq_s8(a);
596 }
597
598 // CHECK-LABEL: @test_vcltzq_s16(
599 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
600 // CHECK:   [[TMP1:%.*]] = icmp slt <8 x i16> %a, zeroinitializer
601 // CHECK:   [[VCLTZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
602 // CHECK:   ret <8 x i16> [[VCLTZ_I]]
603 uint16x8_t test_vcltzq_s16(int16x8_t a) {
604   return vcltzq_s16(a);
605 }
606
607 // CHECK-LABEL: @test_vcltzq_s32(
608 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
609 // CHECK:   [[TMP1:%.*]] = icmp slt <4 x i32> %a, zeroinitializer
610 // CHECK:   [[VCLTZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
611 // CHECK:   ret <4 x i32> [[VCLTZ_I]]
612 uint32x4_t test_vcltzq_s32(int32x4_t a) {
613   return vcltzq_s32(a);
614 }
615
616 // CHECK-LABEL: @test_vcltzq_s64(
617 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
618 // CHECK:   [[TMP1:%.*]] = icmp slt <2 x i64> %a, zeroinitializer
619 // CHECK:   [[VCLTZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
620 // CHECK:   ret <2 x i64> [[VCLTZ_I]]
621 uint64x2_t test_vcltzq_s64(int64x2_t a) {
622   return vcltzq_s64(a);
623 }
624
625 // CHECK-LABEL: @test_vcltz_f32(
626 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
627 // CHECK:   [[TMP1:%.*]] = fcmp olt <2 x float> %a, zeroinitializer
628 // CHECK:   [[VCLTZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
629 // CHECK:   ret <2 x i32> [[VCLTZ_I]]
630 uint32x2_t test_vcltz_f32(float32x2_t a) {
631   return vcltz_f32(a);
632 }
633
634 // CHECK-LABEL: @test_vcltz_f64(
635 // CHECK:   [[TMP0:%.*]] = bitcast <1 x double> %a to <8 x i8>
636 // CHECK:   [[TMP1:%.*]] = fcmp olt <1 x double> %a, zeroinitializer
637 // CHECK:   [[VCLTZ_I:%.*]] = sext <1 x i1> [[TMP1]] to <1 x i64>
638 // CHECK:   ret <1 x i64> [[VCLTZ_I]]
639 uint64x1_t test_vcltz_f64(float64x1_t a) {
640   return vcltz_f64(a);
641 }
642
643 // CHECK-LABEL: @test_vcltzq_f32(
644 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
645 // CHECK:   [[TMP1:%.*]] = fcmp olt <4 x float> %a, zeroinitializer
646 // CHECK:   [[VCLTZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i32>
647 // CHECK:   ret <4 x i32> [[VCLTZ_I]]
648 uint32x4_t test_vcltzq_f32(float32x4_t a) {
649   return vcltzq_f32(a);
650 }
651
652 // CHECK-LABEL: @test_vcltzq_f64(
653 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
654 // CHECK:   [[TMP1:%.*]] = fcmp olt <2 x double> %a, zeroinitializer
655 // CHECK:   [[VCLTZ_I:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i64>
656 // CHECK:   ret <2 x i64> [[VCLTZ_I]]
657 uint64x2_t test_vcltzq_f64(float64x2_t a) {
658   return vcltzq_f64(a);
659 }
660
661 // CHECK-LABEL: @test_vrev16_s8(
662 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
663 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
664 int8x8_t test_vrev16_s8(int8x8_t a) {
665   return vrev16_s8(a);
666 }
667
668 // CHECK-LABEL: @test_vrev16_u8(
669 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
670 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
671 uint8x8_t test_vrev16_u8(uint8x8_t a) {
672   return vrev16_u8(a);
673 }
674
675 // CHECK-LABEL: @test_vrev16_p8(
676 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
677 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
678 poly8x8_t test_vrev16_p8(poly8x8_t a) {
679   return vrev16_p8(a);
680 }
681
682 // CHECK-LABEL: @test_vrev16q_s8(
683 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
684 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
685 int8x16_t test_vrev16q_s8(int8x16_t a) {
686   return vrev16q_s8(a);
687 }
688
689 // CHECK-LABEL: @test_vrev16q_u8(
690 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
691 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
692 uint8x16_t test_vrev16q_u8(uint8x16_t a) {
693   return vrev16q_u8(a);
694 }
695
696 // CHECK-LABEL: @test_vrev16q_p8(
697 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
698 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
699 poly8x16_t test_vrev16q_p8(poly8x16_t a) {
700   return vrev16q_p8(a);
701 }
702
703 // CHECK-LABEL: @test_vrev32_s8(
704 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
705 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
706 int8x8_t test_vrev32_s8(int8x8_t a) {
707   return vrev32_s8(a);
708 }
709
710 // CHECK-LABEL: @test_vrev32_s16(
711 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
712 // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
713 int16x4_t test_vrev32_s16(int16x4_t a) {
714   return vrev32_s16(a);
715 }
716
717 // CHECK-LABEL: @test_vrev32_u8(
718 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
719 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
720 uint8x8_t test_vrev32_u8(uint8x8_t a) {
721   return vrev32_u8(a);
722 }
723
724 // CHECK-LABEL: @test_vrev32_u16(
725 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
726 // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
727 uint16x4_t test_vrev32_u16(uint16x4_t a) {
728   return vrev32_u16(a);
729 }
730
731 // CHECK-LABEL: @test_vrev32_p8(
732 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
733 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
734 poly8x8_t test_vrev32_p8(poly8x8_t a) {
735   return vrev32_p8(a);
736 }
737
738 // CHECK-LABEL: @test_vrev32_p16(
739 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
740 // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
741 poly16x4_t test_vrev32_p16(poly16x4_t a) {
742   return vrev32_p16(a);
743 }
744
745 // CHECK-LABEL: @test_vrev32q_s8(
746 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>
747 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
748 int8x16_t test_vrev32q_s8(int8x16_t a) {
749   return vrev32q_s8(a);
750 }
751
752 // CHECK-LABEL: @test_vrev32q_s16(
753 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
754 // CHECK:   ret <8 x i16> [[SHUFFLE_I]]
755 int16x8_t test_vrev32q_s16(int16x8_t a) {
756   return vrev32q_s16(a);
757 }
758
759 // CHECK-LABEL: @test_vrev32q_u8(
760 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>
761 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
762 uint8x16_t test_vrev32q_u8(uint8x16_t a) {
763   return vrev32q_u8(a);
764 }
765
766 // CHECK-LABEL: @test_vrev32q_u16(
767 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
768 // CHECK:   ret <8 x i16> [[SHUFFLE_I]]
769 uint16x8_t test_vrev32q_u16(uint16x8_t a) {
770   return vrev32q_u16(a);
771 }
772
773 // CHECK-LABEL: @test_vrev32q_p8(
774 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>
775 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
776 poly8x16_t test_vrev32q_p8(poly8x16_t a) {
777   return vrev32q_p8(a);
778 }
779
780 // CHECK-LABEL: @test_vrev32q_p16(
781 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
782 // CHECK:   ret <8 x i16> [[SHUFFLE_I]]
783 poly16x8_t test_vrev32q_p16(poly16x8_t a) {
784   return vrev32q_p16(a);
785 }
786
787 // CHECK-LABEL: @test_vrev64_s8(
788 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
789 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
790 int8x8_t test_vrev64_s8(int8x8_t a) {
791   return vrev64_s8(a);
792 }
793
794 // CHECK-LABEL: @test_vrev64_s16(
795 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
796 // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
797 int16x4_t test_vrev64_s16(int16x4_t a) {
798   return vrev64_s16(a);
799 }
800
801 // CHECK-LABEL: @test_vrev64_s32(
802 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x i32> %a, <2 x i32> %a, <2 x i32> <i32 1, i32 0>
803 // CHECK:   ret <2 x i32> [[SHUFFLE_I]]
804 int32x2_t test_vrev64_s32(int32x2_t a) {
805   return vrev64_s32(a);
806 }
807
808 // CHECK-LABEL: @test_vrev64_u8(
809 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
810 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
811 uint8x8_t test_vrev64_u8(uint8x8_t a) {
812   return vrev64_u8(a);
813 }
814
815 // CHECK-LABEL: @test_vrev64_u16(
816 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
817 // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
818 uint16x4_t test_vrev64_u16(uint16x4_t a) {
819   return vrev64_u16(a);
820 }
821
822 // CHECK-LABEL: @test_vrev64_u32(
823 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x i32> %a, <2 x i32> %a, <2 x i32> <i32 1, i32 0>
824 // CHECK:   ret <2 x i32> [[SHUFFLE_I]]
825 uint32x2_t test_vrev64_u32(uint32x2_t a) {
826   return vrev64_u32(a);
827 }
828
829 // CHECK-LABEL: @test_vrev64_p8(
830 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> %a, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
831 // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
832 poly8x8_t test_vrev64_p8(poly8x8_t a) {
833   return vrev64_p8(a);
834 }
835
836 // CHECK-LABEL: @test_vrev64_p16(
837 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> %a, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
838 // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
839 poly16x4_t test_vrev64_p16(poly16x4_t a) {
840   return vrev64_p16(a);
841 }
842
843 // CHECK-LABEL: @test_vrev64_f32(
844 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x float> %a, <2 x float> %a, <2 x i32> <i32 1, i32 0>
845 // CHECK:   ret <2 x float> [[SHUFFLE_I]]
846 float32x2_t test_vrev64_f32(float32x2_t a) {
847   return vrev64_f32(a);
848 }
849
850 // CHECK-LABEL: @test_vrev64q_s8(
851 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>
852 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
853 int8x16_t test_vrev64q_s8(int8x16_t a) {
854   return vrev64q_s8(a);
855 }
856
857 // CHECK-LABEL: @test_vrev64q_s16(
858 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
859 // CHECK:   ret <8 x i16> [[SHUFFLE_I]]
860 int16x8_t test_vrev64q_s16(int16x8_t a) {
861   return vrev64q_s16(a);
862 }
863
864 // CHECK-LABEL: @test_vrev64q_s32(
865 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
866 // CHECK:   ret <4 x i32> [[SHUFFLE_I]]
867 int32x4_t test_vrev64q_s32(int32x4_t a) {
868   return vrev64q_s32(a);
869 }
870
871 // CHECK-LABEL: @test_vrev64q_u8(
872 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>
873 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
874 uint8x16_t test_vrev64q_u8(uint8x16_t a) {
875   return vrev64q_u8(a);
876 }
877
878 // CHECK-LABEL: @test_vrev64q_u16(
879 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
880 // CHECK:   ret <8 x i16> [[SHUFFLE_I]]
881 uint16x8_t test_vrev64q_u16(uint16x8_t a) {
882   return vrev64q_u16(a);
883 }
884
885 // CHECK-LABEL: @test_vrev64q_u32(
886 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
887 // CHECK:   ret <4 x i32> [[SHUFFLE_I]]
888 uint32x4_t test_vrev64q_u32(uint32x4_t a) {
889   return vrev64q_u32(a);
890 }
891
892 // CHECK-LABEL: @test_vrev64q_p8(
893 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>
894 // CHECK:   ret <16 x i8> [[SHUFFLE_I]]
895 poly8x16_t test_vrev64q_p8(poly8x16_t a) {
896   return vrev64q_p8(a);
897 }
898
899 // CHECK-LABEL: @test_vrev64q_p16(
900 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
901 // CHECK:   ret <8 x i16> [[SHUFFLE_I]]
902 poly16x8_t test_vrev64q_p16(poly16x8_t a) {
903   return vrev64q_p16(a);
904 }
905
906 // CHECK-LABEL: @test_vrev64q_f32(
907 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x float> %a, <4 x float> %a, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
908 // CHECK:   ret <4 x float> [[SHUFFLE_I]]
909 float32x4_t test_vrev64q_f32(float32x4_t a) {
910   return vrev64q_f32(a);
911 }
912
913 // CHECK-LABEL: @test_vpaddl_s8(
914 // CHECK:   [[VPADDL_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.saddlp.v4i16.v8i8(<8 x i8> %a)
915 // CHECK:   ret <4 x i16> [[VPADDL_I]]
916 int16x4_t test_vpaddl_s8(int8x8_t a) {
917   return vpaddl_s8(a);
918 }
919
920 // CHECK-LABEL: @test_vpaddl_s16(
921 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
922 // CHECK:   [[VPADDL1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.saddlp.v2i32.v4i16(<4 x i16> %a)
923 // CHECK:   ret <2 x i32> [[VPADDL1_I]]
924 int32x2_t test_vpaddl_s16(int16x4_t a) {
925   return vpaddl_s16(a);
926 }
927
928 // CHECK-LABEL: @test_vpaddl_s32(
929 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
930 // CHECK:   [[VPADDL1_I:%.*]] = call <1 x i64> @llvm.aarch64.neon.saddlp.v1i64.v2i32(<2 x i32> %a)
931 // CHECK:   ret <1 x i64> [[VPADDL1_I]]
932 int64x1_t test_vpaddl_s32(int32x2_t a) {
933   return vpaddl_s32(a);
934 }
935
936 // CHECK-LABEL: @test_vpaddl_u8(
937 // CHECK:   [[VPADDL_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uaddlp.v4i16.v8i8(<8 x i8> %a)
938 // CHECK:   ret <4 x i16> [[VPADDL_I]]
939 uint16x4_t test_vpaddl_u8(uint8x8_t a) {
940   return vpaddl_u8(a);
941 }
942
943 // CHECK-LABEL: @test_vpaddl_u16(
944 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
945 // CHECK:   [[VPADDL1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uaddlp.v2i32.v4i16(<4 x i16> %a)
946 // CHECK:   ret <2 x i32> [[VPADDL1_I]]
947 uint32x2_t test_vpaddl_u16(uint16x4_t a) {
948   return vpaddl_u16(a);
949 }
950
951 // CHECK-LABEL: @test_vpaddl_u32(
952 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
953 // CHECK:   [[VPADDL1_I:%.*]] = call <1 x i64> @llvm.aarch64.neon.uaddlp.v1i64.v2i32(<2 x i32> %a)
954 // CHECK:   ret <1 x i64> [[VPADDL1_I]]
955 uint64x1_t test_vpaddl_u32(uint32x2_t a) {
956   return vpaddl_u32(a);
957 }
958
959 // CHECK-LABEL: @test_vpaddlq_s8(
960 // CHECK:   [[VPADDL_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.saddlp.v8i16.v16i8(<16 x i8> %a)
961 // CHECK:   ret <8 x i16> [[VPADDL_I]]
962 int16x8_t test_vpaddlq_s8(int8x16_t a) {
963   return vpaddlq_s8(a);
964 }
965
966 // CHECK-LABEL: @test_vpaddlq_s16(
967 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
968 // CHECK:   [[VPADDL1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.saddlp.v4i32.v8i16(<8 x i16> %a)
969 // CHECK:   ret <4 x i32> [[VPADDL1_I]]
970 int32x4_t test_vpaddlq_s16(int16x8_t a) {
971   return vpaddlq_s16(a);
972 }
973
974 // CHECK-LABEL: @test_vpaddlq_s32(
975 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
976 // CHECK:   [[VPADDL1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.saddlp.v2i64.v4i32(<4 x i32> %a)
977 // CHECK:   ret <2 x i64> [[VPADDL1_I]]
978 int64x2_t test_vpaddlq_s32(int32x4_t a) {
979   return vpaddlq_s32(a);
980 }
981
982 // CHECK-LABEL: @test_vpaddlq_u8(
983 // CHECK:   [[VPADDL_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> %a)
984 // CHECK:   ret <8 x i16> [[VPADDL_I]]
985 uint16x8_t test_vpaddlq_u8(uint8x16_t a) {
986   return vpaddlq_u8(a);
987 }
988
989 // CHECK-LABEL: @test_vpaddlq_u16(
990 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
991 // CHECK:   [[VPADDL1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> %a)
992 // CHECK:   ret <4 x i32> [[VPADDL1_I]]
993 uint32x4_t test_vpaddlq_u16(uint16x8_t a) {
994   return vpaddlq_u16(a);
995 }
996
997 // CHECK-LABEL: @test_vpaddlq_u32(
998 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
999 // CHECK:   [[VPADDL1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> %a)
1000 // CHECK:   ret <2 x i64> [[VPADDL1_I]]
1001 uint64x2_t test_vpaddlq_u32(uint32x4_t a) {
1002   return vpaddlq_u32(a);
1003 }
1004
1005 // CHECK-LABEL: @test_vpadal_s8(
1006 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1007 // CHECK:   [[VPADAL_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.saddlp.v4i16.v8i8(<8 x i8> %b)
1008 // CHECK:   [[TMP1:%.*]] = add <4 x i16> [[VPADAL_I]], %a
1009 // CHECK:   ret <4 x i16> [[TMP1]]
1010 int16x4_t test_vpadal_s8(int16x4_t a, int8x8_t b) {
1011   return vpadal_s8(a, b);
1012 }
1013
1014 // CHECK-LABEL: @test_vpadal_s16(
1015 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1016 // CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8>
1017 // CHECK:   [[VPADAL1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.saddlp.v2i32.v4i16(<4 x i16> %b)
1018 // CHECK:   [[TMP2:%.*]] = add <2 x i32> [[VPADAL1_I]], %a
1019 // CHECK:   ret <2 x i32> [[TMP2]]
1020 int32x2_t test_vpadal_s16(int32x2_t a, int16x4_t b) {
1021   return vpadal_s16(a, b);
1022 }
1023
1024 // CHECK-LABEL: @test_vpadal_s32(
1025 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
1026 // CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8>
1027 // CHECK:   [[VPADAL1_I:%.*]] = call <1 x i64> @llvm.aarch64.neon.saddlp.v1i64.v2i32(<2 x i32> %b)
1028 // CHECK:   [[TMP2:%.*]] = add <1 x i64> [[VPADAL1_I]], %a
1029 // CHECK:   ret <1 x i64> [[TMP2]]
1030 int64x1_t test_vpadal_s32(int64x1_t a, int32x2_t b) {
1031   return vpadal_s32(a, b);
1032 }
1033
1034 // CHECK-LABEL: @test_vpadal_u8(
1035 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1036 // CHECK:   [[VPADAL_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uaddlp.v4i16.v8i8(<8 x i8> %b)
1037 // CHECK:   [[TMP1:%.*]] = add <4 x i16> [[VPADAL_I]], %a
1038 // CHECK:   ret <4 x i16> [[TMP1]]
1039 uint16x4_t test_vpadal_u8(uint16x4_t a, uint8x8_t b) {
1040   return vpadal_u8(a, b);
1041 }
1042
1043 // CHECK-LABEL: @test_vpadal_u16(
1044 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1045 // CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8>
1046 // CHECK:   [[VPADAL1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uaddlp.v2i32.v4i16(<4 x i16> %b)
1047 // CHECK:   [[TMP2:%.*]] = add <2 x i32> [[VPADAL1_I]], %a
1048 // CHECK:   ret <2 x i32> [[TMP2]]
1049 uint32x2_t test_vpadal_u16(uint32x2_t a, uint16x4_t b) {
1050   return vpadal_u16(a, b);
1051 }
1052
1053 // CHECK-LABEL: @test_vpadal_u32(
1054 // CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>
1055 // CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8>
1056 // CHECK:   [[VPADAL1_I:%.*]] = call <1 x i64> @llvm.aarch64.neon.uaddlp.v1i64.v2i32(<2 x i32> %b)
1057 // CHECK:   [[TMP2:%.*]] = add <1 x i64> [[VPADAL1_I]], %a
1058 // CHECK:   ret <1 x i64> [[TMP2]]
1059 uint64x1_t test_vpadal_u32(uint64x1_t a, uint32x2_t b) {
1060   return vpadal_u32(a, b);
1061 }
1062
1063 // CHECK-LABEL: @test_vpadalq_s8(
1064 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1065 // CHECK:   [[VPADAL_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.saddlp.v8i16.v16i8(<16 x i8> %b)
1066 // CHECK:   [[TMP1:%.*]] = add <8 x i16> [[VPADAL_I]], %a
1067 // CHECK:   ret <8 x i16> [[TMP1]]
1068 int16x8_t test_vpadalq_s8(int16x8_t a, int8x16_t b) {
1069   return vpadalq_s8(a, b);
1070 }
1071
1072 // CHECK-LABEL: @test_vpadalq_s16(
1073 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1074 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %b to <16 x i8>
1075 // CHECK:   [[VPADAL1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.saddlp.v4i32.v8i16(<8 x i16> %b)
1076 // CHECK:   [[TMP2:%.*]] = add <4 x i32> [[VPADAL1_I]], %a
1077 // CHECK:   ret <4 x i32> [[TMP2]]
1078 int32x4_t test_vpadalq_s16(int32x4_t a, int16x8_t b) {
1079   return vpadalq_s16(a, b);
1080 }
1081
1082 // CHECK-LABEL: @test_vpadalq_s32(
1083 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1084 // CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %b to <16 x i8>
1085 // CHECK:   [[VPADAL1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.saddlp.v2i64.v4i32(<4 x i32> %b)
1086 // CHECK:   [[TMP2:%.*]] = add <2 x i64> [[VPADAL1_I]], %a
1087 // CHECK:   ret <2 x i64> [[TMP2]]
1088 int64x2_t test_vpadalq_s32(int64x2_t a, int32x4_t b) {
1089   return vpadalq_s32(a, b);
1090 }
1091
1092 // CHECK-LABEL: @test_vpadalq_u8(
1093 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1094 // CHECK:   [[VPADAL_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> %b)
1095 // CHECK:   [[TMP1:%.*]] = add <8 x i16> [[VPADAL_I]], %a
1096 // CHECK:   ret <8 x i16> [[TMP1]]
1097 uint16x8_t test_vpadalq_u8(uint16x8_t a, uint8x16_t b) {
1098   return vpadalq_u8(a, b);
1099 }
1100
1101 // CHECK-LABEL: @test_vpadalq_u16(
1102 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1103 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %b to <16 x i8>
1104 // CHECK:   [[VPADAL1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> %b)
1105 // CHECK:   [[TMP2:%.*]] = add <4 x i32> [[VPADAL1_I]], %a
1106 // CHECK:   ret <4 x i32> [[TMP2]]
1107 uint32x4_t test_vpadalq_u16(uint32x4_t a, uint16x8_t b) {
1108   return vpadalq_u16(a, b);
1109 }
1110
1111 // CHECK-LABEL: @test_vpadalq_u32(
1112 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1113 // CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %b to <16 x i8>
1114 // CHECK:   [[VPADAL1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> %b)
1115 // CHECK:   [[TMP2:%.*]] = add <2 x i64> [[VPADAL1_I]], %a
1116 // CHECK:   ret <2 x i64> [[TMP2]]
1117 uint64x2_t test_vpadalq_u32(uint64x2_t a, uint32x4_t b) {
1118   return vpadalq_u32(a, b);
1119 }
1120
1121 // CHECK-LABEL: @test_vqabs_s8(
1122 // CHECK:   [[VQABS_V_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqabs.v8i8(<8 x i8> %a)
1123 // CHECK:   ret <8 x i8> [[VQABS_V_I]]
1124 int8x8_t test_vqabs_s8(int8x8_t a) {
1125   return vqabs_s8(a);
1126 }
1127
1128 // CHECK-LABEL: @test_vqabsq_s8(
1129 // CHECK:   [[VQABSQ_V_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.sqabs.v16i8(<16 x i8> %a)
1130 // CHECK:   ret <16 x i8> [[VQABSQ_V_I]]
1131 int8x16_t test_vqabsq_s8(int8x16_t a) {
1132   return vqabsq_s8(a);
1133 }
1134
1135 // CHECK-LABEL: @test_vqabs_s16(
1136 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1137 // CHECK:   [[VQABS_V1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sqabs.v4i16(<4 x i16> %a)
1138 // CHECK:   [[VQABS_V2_I:%.*]] = bitcast <4 x i16> [[VQABS_V1_I]] to <8 x i8>
1139 // CHECK:   ret <4 x i16> [[VQABS_V1_I]]
1140 int16x4_t test_vqabs_s16(int16x4_t a) {
1141   return vqabs_s16(a);
1142 }
1143
1144 // CHECK-LABEL: @test_vqabsq_s16(
1145 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1146 // CHECK:   [[VQABSQ_V1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.sqabs.v8i16(<8 x i16> %a)
1147 // CHECK:   [[VQABSQ_V2_I:%.*]] = bitcast <8 x i16> [[VQABSQ_V1_I]] to <16 x i8>
1148 // CHECK:   ret <8 x i16> [[VQABSQ_V1_I]]
1149 int16x8_t test_vqabsq_s16(int16x8_t a) {
1150   return vqabsq_s16(a);
1151 }
1152
1153 // CHECK-LABEL: @test_vqabs_s32(
1154 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1155 // CHECK:   [[VQABS_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sqabs.v2i32(<2 x i32> %a)
1156 // CHECK:   [[VQABS_V2_I:%.*]] = bitcast <2 x i32> [[VQABS_V1_I]] to <8 x i8>
1157 // CHECK:   ret <2 x i32> [[VQABS_V1_I]]
1158 int32x2_t test_vqabs_s32(int32x2_t a) {
1159   return vqabs_s32(a);
1160 }
1161
1162 // CHECK-LABEL: @test_vqabsq_s32(
1163 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1164 // CHECK:   [[VQABSQ_V1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.sqabs.v4i32(<4 x i32> %a)
1165 // CHECK:   [[VQABSQ_V2_I:%.*]] = bitcast <4 x i32> [[VQABSQ_V1_I]] to <16 x i8>
1166 // CHECK:   ret <4 x i32> [[VQABSQ_V1_I]]
1167 int32x4_t test_vqabsq_s32(int32x4_t a) {
1168   return vqabsq_s32(a);
1169 }
1170
1171 // CHECK-LABEL: @test_vqabsq_s64(
1172 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1173 // CHECK:   [[VQABSQ_V1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.sqabs.v2i64(<2 x i64> %a)
1174 // CHECK:   [[VQABSQ_V2_I:%.*]] = bitcast <2 x i64> [[VQABSQ_V1_I]] to <16 x i8>
1175 // CHECK:   ret <2 x i64> [[VQABSQ_V1_I]]
1176 int64x2_t test_vqabsq_s64(int64x2_t a) {
1177   return vqabsq_s64(a);
1178 }
1179
1180 // CHECK-LABEL: @test_vqneg_s8(
1181 // CHECK:   [[VQNEG_V_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqneg.v8i8(<8 x i8> %a)
1182 // CHECK:   ret <8 x i8> [[VQNEG_V_I]]
1183 int8x8_t test_vqneg_s8(int8x8_t a) {
1184   return vqneg_s8(a);
1185 }
1186
1187 // CHECK-LABEL: @test_vqnegq_s8(
1188 // CHECK:   [[VQNEGQ_V_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.sqneg.v16i8(<16 x i8> %a)
1189 // CHECK:   ret <16 x i8> [[VQNEGQ_V_I]]
1190 int8x16_t test_vqnegq_s8(int8x16_t a) {
1191   return vqnegq_s8(a);
1192 }
1193
1194 // CHECK-LABEL: @test_vqneg_s16(
1195 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1196 // CHECK:   [[VQNEG_V1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sqneg.v4i16(<4 x i16> %a)
1197 // CHECK:   [[VQNEG_V2_I:%.*]] = bitcast <4 x i16> [[VQNEG_V1_I]] to <8 x i8>
1198 // CHECK:   ret <4 x i16> [[VQNEG_V1_I]]
1199 int16x4_t test_vqneg_s16(int16x4_t a) {
1200   return vqneg_s16(a);
1201 }
1202
1203 // CHECK-LABEL: @test_vqnegq_s16(
1204 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1205 // CHECK:   [[VQNEGQ_V1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.sqneg.v8i16(<8 x i16> %a)
1206 // CHECK:   [[VQNEGQ_V2_I:%.*]] = bitcast <8 x i16> [[VQNEGQ_V1_I]] to <16 x i8>
1207 // CHECK:   ret <8 x i16> [[VQNEGQ_V1_I]]
1208 int16x8_t test_vqnegq_s16(int16x8_t a) {
1209   return vqnegq_s16(a);
1210 }
1211
1212 // CHECK-LABEL: @test_vqneg_s32(
1213 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1214 // CHECK:   [[VQNEG_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sqneg.v2i32(<2 x i32> %a)
1215 // CHECK:   [[VQNEG_V2_I:%.*]] = bitcast <2 x i32> [[VQNEG_V1_I]] to <8 x i8>
1216 // CHECK:   ret <2 x i32> [[VQNEG_V1_I]]
1217 int32x2_t test_vqneg_s32(int32x2_t a) {
1218   return vqneg_s32(a);
1219 }
1220
1221 // CHECK-LABEL: @test_vqnegq_s32(
1222 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1223 // CHECK:   [[VQNEGQ_V1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.sqneg.v4i32(<4 x i32> %a)
1224 // CHECK:   [[VQNEGQ_V2_I:%.*]] = bitcast <4 x i32> [[VQNEGQ_V1_I]] to <16 x i8>
1225 // CHECK:   ret <4 x i32> [[VQNEGQ_V1_I]]
1226 int32x4_t test_vqnegq_s32(int32x4_t a) {
1227   return vqnegq_s32(a);
1228 }
1229
1230 // CHECK-LABEL: @test_vqnegq_s64(
1231 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1232 // CHECK:   [[VQNEGQ_V1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.sqneg.v2i64(<2 x i64> %a)
1233 // CHECK:   [[VQNEGQ_V2_I:%.*]] = bitcast <2 x i64> [[VQNEGQ_V1_I]] to <16 x i8>
1234 // CHECK:   ret <2 x i64> [[VQNEGQ_V1_I]]
1235 int64x2_t test_vqnegq_s64(int64x2_t a) {
1236   return vqnegq_s64(a);
1237 }
1238
1239 // CHECK-LABEL: @test_vneg_s8(
1240 // CHECK:   [[SUB_I:%.*]] = sub <8 x i8> zeroinitializer, %a
1241 // CHECK:   ret <8 x i8> [[SUB_I]]
1242 int8x8_t test_vneg_s8(int8x8_t a) {
1243   return vneg_s8(a);
1244 }
1245
1246 // CHECK-LABEL: @test_vnegq_s8(
1247 // CHECK:   [[SUB_I:%.*]] = sub <16 x i8> zeroinitializer, %a
1248 // CHECK:   ret <16 x i8> [[SUB_I]]
1249 int8x16_t test_vnegq_s8(int8x16_t a) {
1250   return vnegq_s8(a);
1251 }
1252
1253 // CHECK-LABEL: @test_vneg_s16(
1254 // CHECK:   [[SUB_I:%.*]] = sub <4 x i16> zeroinitializer, %a
1255 // CHECK:   ret <4 x i16> [[SUB_I]]
1256 int16x4_t test_vneg_s16(int16x4_t a) {
1257   return vneg_s16(a);
1258 }
1259
1260 // CHECK-LABEL: @test_vnegq_s16(
1261 // CHECK:   [[SUB_I:%.*]] = sub <8 x i16> zeroinitializer, %a
1262 // CHECK:   ret <8 x i16> [[SUB_I]]
1263 int16x8_t test_vnegq_s16(int16x8_t a) {
1264   return vnegq_s16(a);
1265 }
1266
1267 // CHECK-LABEL: @test_vneg_s32(
1268 // CHECK:   [[SUB_I:%.*]] = sub <2 x i32> zeroinitializer, %a
1269 // CHECK:   ret <2 x i32> [[SUB_I]]
1270 int32x2_t test_vneg_s32(int32x2_t a) {
1271   return vneg_s32(a);
1272 }
1273
1274 // CHECK-LABEL: @test_vnegq_s32(
1275 // CHECK:   [[SUB_I:%.*]] = sub <4 x i32> zeroinitializer, %a
1276 // CHECK:   ret <4 x i32> [[SUB_I]]
1277 int32x4_t test_vnegq_s32(int32x4_t a) {
1278   return vnegq_s32(a);
1279 }
1280
1281 // CHECK-LABEL: @test_vnegq_s64(
1282 // CHECK:   [[SUB_I:%.*]] = sub <2 x i64> zeroinitializer, %a
1283 // CHECK:   ret <2 x i64> [[SUB_I]]
1284 int64x2_t test_vnegq_s64(int64x2_t a) {
1285   return vnegq_s64(a);
1286 }
1287
1288 // CHECK-LABEL: @test_vneg_f32(
1289 // CHECK:   [[SUB_I:%.*]] = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, %a
1290 // CHECK:   ret <2 x float> [[SUB_I]]
1291 float32x2_t test_vneg_f32(float32x2_t a) {
1292   return vneg_f32(a);
1293 }
1294
1295 // CHECK-LABEL: @test_vnegq_f32(
1296 // CHECK:   [[SUB_I:%.*]] = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %a
1297 // CHECK:   ret <4 x float> [[SUB_I]]
1298 float32x4_t test_vnegq_f32(float32x4_t a) {
1299   return vnegq_f32(a);
1300 }
1301
1302 // CHECK-LABEL: @test_vnegq_f64(
1303 // CHECK:   [[SUB_I:%.*]] = fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %a
1304 // CHECK:   ret <2 x double> [[SUB_I]]
1305 float64x2_t test_vnegq_f64(float64x2_t a) {
1306   return vnegq_f64(a);
1307 }
1308
1309 // CHECK-LABEL: @test_vabs_s8(
1310 // CHECK:   [[VABS_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.abs.v8i8(<8 x i8> %a)
1311 // CHECK:   ret <8 x i8> [[VABS_I]]
1312 int8x8_t test_vabs_s8(int8x8_t a) {
1313   return vabs_s8(a);
1314 }
1315
1316 // CHECK-LABEL: @test_vabsq_s8(
1317 // CHECK:   [[VABS_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.abs.v16i8(<16 x i8> %a)
1318 // CHECK:   ret <16 x i8> [[VABS_I]]
1319 int8x16_t test_vabsq_s8(int8x16_t a) {
1320   return vabsq_s8(a);
1321 }
1322
1323 // CHECK-LABEL: @test_vabs_s16(
1324 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1325 // CHECK:   [[VABS1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.abs.v4i16(<4 x i16> %a)
1326 // CHECK:   ret <4 x i16> [[VABS1_I]]
1327 int16x4_t test_vabs_s16(int16x4_t a) {
1328   return vabs_s16(a);
1329 }
1330
1331 // CHECK-LABEL: @test_vabsq_s16(
1332 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1333 // CHECK:   [[VABS1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.abs.v8i16(<8 x i16> %a)
1334 // CHECK:   ret <8 x i16> [[VABS1_I]]
1335 int16x8_t test_vabsq_s16(int16x8_t a) {
1336   return vabsq_s16(a);
1337 }
1338
1339 // CHECK-LABEL: @test_vabs_s32(
1340 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1341 // CHECK:   [[VABS1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.abs.v2i32(<2 x i32> %a)
1342 // CHECK:   ret <2 x i32> [[VABS1_I]]
1343 int32x2_t test_vabs_s32(int32x2_t a) {
1344   return vabs_s32(a);
1345 }
1346
1347 // CHECK-LABEL: @test_vabsq_s32(
1348 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1349 // CHECK:   [[VABS1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.abs.v4i32(<4 x i32> %a)
1350 // CHECK:   ret <4 x i32> [[VABS1_I]]
1351 int32x4_t test_vabsq_s32(int32x4_t a) {
1352   return vabsq_s32(a);
1353 }
1354
1355 // CHECK-LABEL: @test_vabsq_s64(
1356 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1357 // CHECK:   [[VABS1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.abs.v2i64(<2 x i64> %a)
1358 // CHECK:   ret <2 x i64> [[VABS1_I]]
1359 int64x2_t test_vabsq_s64(int64x2_t a) {
1360   return vabsq_s64(a);
1361 }
1362
1363 // CHECK-LABEL: @test_vabs_f32(
1364 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
1365 // CHECK:   [[VABS1_I:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
1366 // CHECK:   ret <2 x float> [[VABS1_I]]
1367 float32x2_t test_vabs_f32(float32x2_t a) {
1368   return vabs_f32(a);
1369 }
1370
1371 // CHECK-LABEL: @test_vabsq_f32(
1372 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
1373 // CHECK:   [[VABS1_I:%.*]] = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
1374 // CHECK:   ret <4 x float> [[VABS1_I]]
1375 float32x4_t test_vabsq_f32(float32x4_t a) {
1376   return vabsq_f32(a);
1377 }
1378
1379 // CHECK-LABEL: @test_vabsq_f64(
1380 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
1381 // CHECK:   [[VABS1_I:%.*]] = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)
1382 // CHECK:   ret <2 x double> [[VABS1_I]]
1383 float64x2_t test_vabsq_f64(float64x2_t a) {
1384   return vabsq_f64(a);
1385 }
1386
1387 // CHECK-LABEL: @test_vuqadd_s8(
1388 // CHECK:   [[VUQADD_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.suqadd.v8i8(<8 x i8> %a, <8 x i8> %b)
1389 // CHECK:   ret <8 x i8> [[VUQADD_I]]
1390 int8x8_t test_vuqadd_s8(int8x8_t a, int8x8_t b) {
1391   return vuqadd_s8(a, b);
1392 }
1393
1394 // CHECK-LABEL: @test_vuqaddq_s8(
1395 // CHECK:   [[VUQADD_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.suqadd.v16i8(<16 x i8> %a, <16 x i8> %b)
1396 // CHECK:   ret <16 x i8> [[VUQADD_I]]
1397 int8x16_t test_vuqaddq_s8(int8x16_t a, int8x16_t b) {
1398   return vuqaddq_s8(a, b);
1399 }
1400
1401 // CHECK-LABEL: @test_vuqadd_s16(
1402 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1403 // CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8>
1404 // CHECK:   [[VUQADD2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.suqadd.v4i16(<4 x i16> %a, <4 x i16> %b)
1405 // CHECK:   ret <4 x i16> [[VUQADD2_I]]
1406 int16x4_t test_vuqadd_s16(int16x4_t a, int16x4_t b) {
1407   return vuqadd_s16(a, b);
1408 }
1409
1410 // CHECK-LABEL: @test_vuqaddq_s16(
1411 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1412 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %b to <16 x i8>
1413 // CHECK:   [[VUQADD2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.suqadd.v8i16(<8 x i16> %a, <8 x i16> %b)
1414 // CHECK:   ret <8 x i16> [[VUQADD2_I]]
1415 int16x8_t test_vuqaddq_s16(int16x8_t a, int16x8_t b) {
1416   return vuqaddq_s16(a, b);
1417 }
1418
1419 // CHECK-LABEL: @test_vuqadd_s32(
1420 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1421 // CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8>
1422 // CHECK:   [[VUQADD2_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.suqadd.v2i32(<2 x i32> %a, <2 x i32> %b)
1423 // CHECK:   ret <2 x i32> [[VUQADD2_I]]
1424 int32x2_t test_vuqadd_s32(int32x2_t a, int32x2_t b) {
1425   return vuqadd_s32(a, b);
1426 }
1427
1428 // CHECK-LABEL: @test_vuqaddq_s32(
1429 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1430 // CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %b to <16 x i8>
1431 // CHECK:   [[VUQADD2_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.suqadd.v4i32(<4 x i32> %a, <4 x i32> %b)
1432 // CHECK:   ret <4 x i32> [[VUQADD2_I]]
1433 int32x4_t test_vuqaddq_s32(int32x4_t a, int32x4_t b) {
1434   return vuqaddq_s32(a, b);
1435 }
1436
1437 // CHECK-LABEL: @test_vuqaddq_s64(
1438 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1439 // CHECK:   [[TMP1:%.*]] = bitcast <2 x i64> %b to <16 x i8>
1440 // CHECK:   [[VUQADD2_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.suqadd.v2i64(<2 x i64> %a, <2 x i64> %b)
1441 // CHECK:   ret <2 x i64> [[VUQADD2_I]]
1442 int64x2_t test_vuqaddq_s64(int64x2_t a, int64x2_t b) {
1443   return vuqaddq_s64(a, b);
1444 }
1445
1446 // CHECK-LABEL: @test_vcls_s8(
1447 // CHECK:   [[VCLS_V_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.cls.v8i8(<8 x i8> %a)
1448 // CHECK:   ret <8 x i8> [[VCLS_V_I]]
1449 int8x8_t test_vcls_s8(int8x8_t a) {
1450   return vcls_s8(a);
1451 }
1452
1453 // CHECK-LABEL: @test_vclsq_s8(
1454 // CHECK:   [[VCLSQ_V_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.cls.v16i8(<16 x i8> %a)
1455 // CHECK:   ret <16 x i8> [[VCLSQ_V_I]]
1456 int8x16_t test_vclsq_s8(int8x16_t a) {
1457   return vclsq_s8(a);
1458 }
1459
1460 // CHECK-LABEL: @test_vcls_s16(
1461 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1462 // CHECK:   [[VCLS_V1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.cls.v4i16(<4 x i16> %a)
1463 // CHECK:   [[VCLS_V2_I:%.*]] = bitcast <4 x i16> [[VCLS_V1_I]] to <8 x i8>
1464 // CHECK:   ret <4 x i16> [[VCLS_V1_I]]
1465 int16x4_t test_vcls_s16(int16x4_t a) {
1466   return vcls_s16(a);
1467 }
1468
1469 // CHECK-LABEL: @test_vclsq_s16(
1470 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1471 // CHECK:   [[VCLSQ_V1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.cls.v8i16(<8 x i16> %a)
1472 // CHECK:   [[VCLSQ_V2_I:%.*]] = bitcast <8 x i16> [[VCLSQ_V1_I]] to <16 x i8>
1473 // CHECK:   ret <8 x i16> [[VCLSQ_V1_I]]
1474 int16x8_t test_vclsq_s16(int16x8_t a) {
1475   return vclsq_s16(a);
1476 }
1477
1478 // CHECK-LABEL: @test_vcls_s32(
1479 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1480 // CHECK:   [[VCLS_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.cls.v2i32(<2 x i32> %a)
1481 // CHECK:   [[VCLS_V2_I:%.*]] = bitcast <2 x i32> [[VCLS_V1_I]] to <8 x i8>
1482 // CHECK:   ret <2 x i32> [[VCLS_V1_I]]
1483 int32x2_t test_vcls_s32(int32x2_t a) {
1484   return vcls_s32(a);
1485 }
1486
1487 // CHECK-LABEL: @test_vclsq_s32(
1488 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1489 // CHECK:   [[VCLSQ_V1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.cls.v4i32(<4 x i32> %a)
1490 // CHECK:   [[VCLSQ_V2_I:%.*]] = bitcast <4 x i32> [[VCLSQ_V1_I]] to <16 x i8>
1491 // CHECK:   ret <4 x i32> [[VCLSQ_V1_I]]
1492 int32x4_t test_vclsq_s32(int32x4_t a) {
1493   return vclsq_s32(a);
1494 }
1495
1496 // CHECK-LABEL: @test_vclz_s8(
1497 // CHECK:   [[VCLZ_V_I:%.*]] = call <8 x i8> @llvm.ctlz.v8i8(<8 x i8> %a, i1 false)
1498 // CHECK:   ret <8 x i8> [[VCLZ_V_I]]
1499 int8x8_t test_vclz_s8(int8x8_t a) {
1500   return vclz_s8(a);
1501 }
1502
1503 // CHECK-LABEL: @test_vclzq_s8(
1504 // CHECK:   [[VCLZQ_V_I:%.*]] = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 false)
1505 // CHECK:   ret <16 x i8> [[VCLZQ_V_I]]
1506 int8x16_t test_vclzq_s8(int8x16_t a) {
1507   return vclzq_s8(a);
1508 }
1509
1510 // CHECK-LABEL: @test_vclz_s16(
1511 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1512 // CHECK:   [[VCLZ_V1_I:%.*]] = call <4 x i16> @llvm.ctlz.v4i16(<4 x i16> %a, i1 false)
1513 // CHECK:   [[VCLZ_V2_I:%.*]] = bitcast <4 x i16> [[VCLZ_V1_I]] to <8 x i8>
1514 // CHECK:   ret <4 x i16> [[VCLZ_V1_I]]
1515 int16x4_t test_vclz_s16(int16x4_t a) {
1516   return vclz_s16(a);
1517 }
1518
1519 // CHECK-LABEL: @test_vclzq_s16(
1520 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1521 // CHECK:   [[VCLZQ_V1_I:%.*]] = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 false)
1522 // CHECK:   [[VCLZQ_V2_I:%.*]] = bitcast <8 x i16> [[VCLZQ_V1_I]] to <16 x i8>
1523 // CHECK:   ret <8 x i16> [[VCLZQ_V1_I]]
1524 int16x8_t test_vclzq_s16(int16x8_t a) {
1525   return vclzq_s16(a);
1526 }
1527
1528 // CHECK-LABEL: @test_vclz_s32(
1529 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1530 // CHECK:   [[VCLZ_V1_I:%.*]] = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)
1531 // CHECK:   [[VCLZ_V2_I:%.*]] = bitcast <2 x i32> [[VCLZ_V1_I]] to <8 x i8>
1532 // CHECK:   ret <2 x i32> [[VCLZ_V1_I]]
1533 int32x2_t test_vclz_s32(int32x2_t a) {
1534   return vclz_s32(a);
1535 }
1536
1537 // CHECK-LABEL: @test_vclzq_s32(
1538 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1539 // CHECK:   [[VCLZQ_V1_I:%.*]] = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 false)
1540 // CHECK:   [[VCLZQ_V2_I:%.*]] = bitcast <4 x i32> [[VCLZQ_V1_I]] to <16 x i8>
1541 // CHECK:   ret <4 x i32> [[VCLZQ_V1_I]]
1542 int32x4_t test_vclzq_s32(int32x4_t a) {
1543   return vclzq_s32(a);
1544 }
1545
1546 // CHECK-LABEL: @test_vclz_u8(
1547 // CHECK:   [[VCLZ_V_I:%.*]] = call <8 x i8> @llvm.ctlz.v8i8(<8 x i8> %a, i1 false)
1548 // CHECK:   ret <8 x i8> [[VCLZ_V_I]]
1549 uint8x8_t test_vclz_u8(uint8x8_t a) {
1550   return vclz_u8(a);
1551 }
1552
1553 // CHECK-LABEL: @test_vclzq_u8(
1554 // CHECK:   [[VCLZQ_V_I:%.*]] = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 false)
1555 // CHECK:   ret <16 x i8> [[VCLZQ_V_I]]
1556 uint8x16_t test_vclzq_u8(uint8x16_t a) {
1557   return vclzq_u8(a);
1558 }
1559
1560 // CHECK-LABEL: @test_vclz_u16(
1561 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
1562 // CHECK:   [[VCLZ_V1_I:%.*]] = call <4 x i16> @llvm.ctlz.v4i16(<4 x i16> %a, i1 false)
1563 // CHECK:   [[VCLZ_V2_I:%.*]] = bitcast <4 x i16> [[VCLZ_V1_I]] to <8 x i8>
1564 // CHECK:   ret <4 x i16> [[VCLZ_V1_I]]
1565 uint16x4_t test_vclz_u16(uint16x4_t a) {
1566   return vclz_u16(a);
1567 }
1568
1569 // CHECK-LABEL: @test_vclzq_u16(
1570 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1571 // CHECK:   [[VCLZQ_V1_I:%.*]] = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 false)
1572 // CHECK:   [[VCLZQ_V2_I:%.*]] = bitcast <8 x i16> [[VCLZQ_V1_I]] to <16 x i8>
1573 // CHECK:   ret <8 x i16> [[VCLZQ_V1_I]]
1574 uint16x8_t test_vclzq_u16(uint16x8_t a) {
1575   return vclzq_u16(a);
1576 }
1577
1578 // CHECK-LABEL: @test_vclz_u32(
1579 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
1580 // CHECK:   [[VCLZ_V1_I:%.*]] = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)
1581 // CHECK:   [[VCLZ_V2_I:%.*]] = bitcast <2 x i32> [[VCLZ_V1_I]] to <8 x i8>
1582 // CHECK:   ret <2 x i32> [[VCLZ_V1_I]]
1583 uint32x2_t test_vclz_u32(uint32x2_t a) {
1584   return vclz_u32(a);
1585 }
1586
1587 // CHECK-LABEL: @test_vclzq_u32(
1588 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1589 // CHECK:   [[VCLZQ_V1_I:%.*]] = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 false)
1590 // CHECK:   [[VCLZQ_V2_I:%.*]] = bitcast <4 x i32> [[VCLZQ_V1_I]] to <16 x i8>
1591 // CHECK:   ret <4 x i32> [[VCLZQ_V1_I]]
1592 uint32x4_t test_vclzq_u32(uint32x4_t a) {
1593   return vclzq_u32(a);
1594 }
1595
1596 // CHECK-LABEL: @test_vcnt_s8(
1597 // CHECK:   [[VCNT_V_I:%.*]] = call <8 x i8> @llvm.ctpop.v8i8(<8 x i8> %a)
1598 // CHECK:   ret <8 x i8> [[VCNT_V_I]]
1599 int8x8_t test_vcnt_s8(int8x8_t a) {
1600   return vcnt_s8(a);
1601 }
1602
1603 // CHECK-LABEL: @test_vcntq_s8(
1604 // CHECK:   [[VCNTQ_V_I:%.*]] = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %a)
1605 // CHECK:   ret <16 x i8> [[VCNTQ_V_I]]
1606 int8x16_t test_vcntq_s8(int8x16_t a) {
1607   return vcntq_s8(a);
1608 }
1609
1610 // CHECK-LABEL: @test_vcnt_u8(
1611 // CHECK:   [[VCNT_V_I:%.*]] = call <8 x i8> @llvm.ctpop.v8i8(<8 x i8> %a)
1612 // CHECK:   ret <8 x i8> [[VCNT_V_I]]
1613 uint8x8_t test_vcnt_u8(uint8x8_t a) {
1614   return vcnt_u8(a);
1615 }
1616
1617 // CHECK-LABEL: @test_vcntq_u8(
1618 // CHECK:   [[VCNTQ_V_I:%.*]] = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %a)
1619 // CHECK:   ret <16 x i8> [[VCNTQ_V_I]]
1620 uint8x16_t test_vcntq_u8(uint8x16_t a) {
1621   return vcntq_u8(a);
1622 }
1623
1624 // CHECK-LABEL: @test_vcnt_p8(
1625 // CHECK:   [[VCNT_V_I:%.*]] = call <8 x i8> @llvm.ctpop.v8i8(<8 x i8> %a)
1626 // CHECK:   ret <8 x i8> [[VCNT_V_I]]
1627 poly8x8_t test_vcnt_p8(poly8x8_t a) {
1628   return vcnt_p8(a);
1629 }
1630
1631 // CHECK-LABEL: @test_vcntq_p8(
1632 // CHECK:   [[VCNTQ_V_I:%.*]] = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %a)
1633 // CHECK:   ret <16 x i8> [[VCNTQ_V_I]]
1634 poly8x16_t test_vcntq_p8(poly8x16_t a) {
1635   return vcntq_p8(a);
1636 }
1637
1638 // CHECK-LABEL: @test_vmvn_s8(
1639 // CHECK:   [[NEG_I:%.*]] = xor <8 x i8> %a, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
1640 // CHECK:   ret <8 x i8> [[NEG_I]]
1641 int8x8_t test_vmvn_s8(int8x8_t a) {
1642   return vmvn_s8(a);
1643 }
1644
1645 // CHECK-LABEL: @test_vmvnq_s8(
1646 // CHECK:   [[NEG_I:%.*]] = xor <16 x i8> %a, <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>
1647 // CHECK:   ret <16 x i8> [[NEG_I]]
1648 int8x16_t test_vmvnq_s8(int8x16_t a) {
1649   return vmvnq_s8(a);
1650 }
1651
1652 // CHECK-LABEL: @test_vmvn_s16(
1653 // CHECK:   [[NEG_I:%.*]] = xor <4 x i16> %a, <i16 -1, i16 -1, i16 -1, i16 -1>
1654 // CHECK:   ret <4 x i16> [[NEG_I]]
1655 int16x4_t test_vmvn_s16(int16x4_t a) {
1656   return vmvn_s16(a);
1657 }
1658
1659 // CHECK-LABEL: @test_vmvnq_s16(
1660 // CHECK:   [[NEG_I:%.*]] = xor <8 x i16> %a, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1661 // CHECK:   ret <8 x i16> [[NEG_I]]
1662 int16x8_t test_vmvnq_s16(int16x8_t a) {
1663   return vmvnq_s16(a);
1664 }
1665
1666 // CHECK-LABEL: @test_vmvn_s32(
1667 // CHECK:   [[NEG_I:%.*]] = xor <2 x i32> %a, <i32 -1, i32 -1>
1668 // CHECK:   ret <2 x i32> [[NEG_I]]
1669 int32x2_t test_vmvn_s32(int32x2_t a) {
1670   return vmvn_s32(a);
1671 }
1672
1673 // CHECK-LABEL: @test_vmvnq_s32(
1674 // CHECK:   [[NEG_I:%.*]] = xor <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>
1675 // CHECK:   ret <4 x i32> [[NEG_I]]
1676 int32x4_t test_vmvnq_s32(int32x4_t a) {
1677   return vmvnq_s32(a);
1678 }
1679
1680 // CHECK-LABEL: @test_vmvn_u8(
1681 // CHECK:   [[NEG_I:%.*]] = xor <8 x i8> %a, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
1682 // CHECK:   ret <8 x i8> [[NEG_I]]
1683 uint8x8_t test_vmvn_u8(uint8x8_t a) {
1684   return vmvn_u8(a);
1685 }
1686
1687 // CHECK-LABEL: @test_vmvnq_u8(
1688 // CHECK:   [[NEG_I:%.*]] = xor <16 x i8> %a, <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>
1689 // CHECK:   ret <16 x i8> [[NEG_I]]
1690 uint8x16_t test_vmvnq_u8(uint8x16_t a) {
1691   return vmvnq_u8(a);
1692 }
1693
1694 // CHECK-LABEL: @test_vmvn_u16(
1695 // CHECK:   [[NEG_I:%.*]] = xor <4 x i16> %a, <i16 -1, i16 -1, i16 -1, i16 -1>
1696 // CHECK:   ret <4 x i16> [[NEG_I]]
1697 uint16x4_t test_vmvn_u16(uint16x4_t a) {
1698   return vmvn_u16(a);
1699 }
1700
1701 // CHECK-LABEL: @test_vmvnq_u16(
1702 // CHECK:   [[NEG_I:%.*]] = xor <8 x i16> %a, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1703 // CHECK:   ret <8 x i16> [[NEG_I]]
1704 uint16x8_t test_vmvnq_u16(uint16x8_t a) {
1705   return vmvnq_u16(a);
1706 }
1707
1708 // CHECK-LABEL: @test_vmvn_u32(
1709 // CHECK:   [[NEG_I:%.*]] = xor <2 x i32> %a, <i32 -1, i32 -1>
1710 // CHECK:   ret <2 x i32> [[NEG_I]]
1711 uint32x2_t test_vmvn_u32(uint32x2_t a) {
1712   return vmvn_u32(a);
1713 }
1714
1715 // CHECK-LABEL: @test_vmvnq_u32(
1716 // CHECK:   [[NEG_I:%.*]] = xor <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>
1717 // CHECK:   ret <4 x i32> [[NEG_I]]
1718 uint32x4_t test_vmvnq_u32(uint32x4_t a) {
1719   return vmvnq_u32(a);
1720 }
1721
1722 // CHECK-LABEL: @test_vmvn_p8(
1723 // CHECK:   [[NEG_I:%.*]] = xor <8 x i8> %a, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
1724 // CHECK:   ret <8 x i8> [[NEG_I]]
1725 poly8x8_t test_vmvn_p8(poly8x8_t a) {
1726   return vmvn_p8(a);
1727 }
1728
1729 // CHECK-LABEL: @test_vmvnq_p8(
1730 // CHECK:   [[NEG_I:%.*]] = xor <16 x i8> %a, <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>
1731 // CHECK:   ret <16 x i8> [[NEG_I]]
1732 poly8x16_t test_vmvnq_p8(poly8x16_t a) {
1733   return vmvnq_p8(a);
1734 }
1735
1736 // CHECK-LABEL: @test_vrbit_s8(
1737 // CHECK:   [[VRBIT_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.rbit.v8i8(<8 x i8> %a)
1738 // CHECK:   ret <8 x i8> [[VRBIT_I]]
1739 int8x8_t test_vrbit_s8(int8x8_t a) {
1740   return vrbit_s8(a);
1741 }
1742
1743 // CHECK-LABEL: @test_vrbitq_s8(
1744 // CHECK:   [[VRBIT_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.rbit.v16i8(<16 x i8> %a)
1745 // CHECK:   ret <16 x i8> [[VRBIT_I]]
1746 int8x16_t test_vrbitq_s8(int8x16_t a) {
1747   return vrbitq_s8(a);
1748 }
1749
1750 // CHECK-LABEL: @test_vrbit_u8(
1751 // CHECK:   [[VRBIT_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.rbit.v8i8(<8 x i8> %a)
1752 // CHECK:   ret <8 x i8> [[VRBIT_I]]
1753 uint8x8_t test_vrbit_u8(uint8x8_t a) {
1754   return vrbit_u8(a);
1755 }
1756
1757 // CHECK-LABEL: @test_vrbitq_u8(
1758 // CHECK:   [[VRBIT_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.rbit.v16i8(<16 x i8> %a)
1759 // CHECK:   ret <16 x i8> [[VRBIT_I]]
1760 uint8x16_t test_vrbitq_u8(uint8x16_t a) {
1761   return vrbitq_u8(a);
1762 }
1763
1764 // CHECK-LABEL: @test_vrbit_p8(
1765 // CHECK:   [[VRBIT_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.rbit.v8i8(<8 x i8> %a)
1766 // CHECK:   ret <8 x i8> [[VRBIT_I]]
1767 poly8x8_t test_vrbit_p8(poly8x8_t a) {
1768   return vrbit_p8(a);
1769 }
1770
1771 // CHECK-LABEL: @test_vrbitq_p8(
1772 // CHECK:   [[VRBIT_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.rbit.v16i8(<16 x i8> %a)
1773 // CHECK:   ret <16 x i8> [[VRBIT_I]]
1774 poly8x16_t test_vrbitq_p8(poly8x16_t a) {
1775   return vrbitq_p8(a);
1776 }
1777
1778 // CHECK-LABEL: @test_vmovn_s16(
1779 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1780 // CHECK:   [[VMOVN_I:%.*]] = trunc <8 x i16> %a to <8 x i8>
1781 // CHECK:   ret <8 x i8> [[VMOVN_I]]
1782 int8x8_t test_vmovn_s16(int16x8_t a) {
1783   return vmovn_s16(a);
1784 }
1785
1786 // CHECK-LABEL: @test_vmovn_s32(
1787 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1788 // CHECK:   [[VMOVN_I:%.*]] = trunc <4 x i32> %a to <4 x i16>
1789 // CHECK:   ret <4 x i16> [[VMOVN_I]]
1790 int16x4_t test_vmovn_s32(int32x4_t a) {
1791   return vmovn_s32(a);
1792 }
1793
1794 // CHECK-LABEL: @test_vmovn_s64(
1795 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1796 // CHECK:   [[VMOVN_I:%.*]] = trunc <2 x i64> %a to <2 x i32>
1797 // CHECK:   ret <2 x i32> [[VMOVN_I]]
1798 int32x2_t test_vmovn_s64(int64x2_t a) {
1799   return vmovn_s64(a);
1800 }
1801
1802 // CHECK-LABEL: @test_vmovn_u16(
1803 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1804 // CHECK:   [[VMOVN_I:%.*]] = trunc <8 x i16> %a to <8 x i8>
1805 // CHECK:   ret <8 x i8> [[VMOVN_I]]
1806 uint8x8_t test_vmovn_u16(uint16x8_t a) {
1807   return vmovn_u16(a);
1808 }
1809
1810 // CHECK-LABEL: @test_vmovn_u32(
1811 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1812 // CHECK:   [[VMOVN_I:%.*]] = trunc <4 x i32> %a to <4 x i16>
1813 // CHECK:   ret <4 x i16> [[VMOVN_I]]
1814 uint16x4_t test_vmovn_u32(uint32x4_t a) {
1815   return vmovn_u32(a);
1816 }
1817
1818 // CHECK-LABEL: @test_vmovn_u64(
1819 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1820 // CHECK:   [[VMOVN_I:%.*]] = trunc <2 x i64> %a to <2 x i32>
1821 // CHECK:   ret <2 x i32> [[VMOVN_I]]
1822 uint32x2_t test_vmovn_u64(uint64x2_t a) {
1823   return vmovn_u64(a);
1824 }
1825
1826 // CHECK-LABEL: @test_vmovn_high_s16(
1827 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %b to <16 x i8>
1828 // CHECK:   [[VMOVN_I_I:%.*]] = trunc <8 x i16> %b to <8 x i8>
1829 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> [[VMOVN_I_I]], <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>
1830 // CHECK:   ret <16 x i8> [[SHUFFLE_I_I]]
1831 int8x16_t test_vmovn_high_s16(int8x8_t a, int16x8_t b) {
1832   return vmovn_high_s16(a, b);
1833 }
1834
1835 // CHECK-LABEL: @test_vmovn_high_s32(
1836 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %b to <16 x i8>
1837 // CHECK:   [[VMOVN_I_I:%.*]] = trunc <4 x i32> %b to <4 x i16>
1838 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> [[VMOVN_I_I]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1839 // CHECK:   ret <8 x i16> [[SHUFFLE_I_I]]
1840 int16x8_t test_vmovn_high_s32(int16x4_t a, int32x4_t b) {
1841   return vmovn_high_s32(a, b);
1842 }
1843
1844 // CHECK-LABEL: @test_vmovn_high_s64(
1845 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %b to <16 x i8>
1846 // CHECK:   [[VMOVN_I_I:%.*]] = trunc <2 x i64> %b to <2 x i32>
1847 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <2 x i32> %a, <2 x i32> [[VMOVN_I_I]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1848 // CHECK:   ret <4 x i32> [[SHUFFLE_I_I]]
1849 int32x4_t test_vmovn_high_s64(int32x2_t a, int64x2_t b) {
1850   return vmovn_high_s64(a, b);
1851 }
1852
1853 // CHECK-LABEL: @test_vmovn_high_u16(
1854 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %b to <16 x i8>
1855 // CHECK:   [[VMOVN_I_I:%.*]] = trunc <8 x i16> %b to <8 x i8>
1856 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> [[VMOVN_I_I]], <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>
1857 // CHECK:   ret <16 x i8> [[SHUFFLE_I_I]]
1858 int8x16_t test_vmovn_high_u16(int8x8_t a, int16x8_t b) {
1859   return vmovn_high_u16(a, b);
1860 }
1861
1862 // CHECK-LABEL: @test_vmovn_high_u32(
1863 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %b to <16 x i8>
1864 // CHECK:   [[VMOVN_I_I:%.*]] = trunc <4 x i32> %b to <4 x i16>
1865 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> [[VMOVN_I_I]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1866 // CHECK:   ret <8 x i16> [[SHUFFLE_I_I]]
1867 int16x8_t test_vmovn_high_u32(int16x4_t a, int32x4_t b) {
1868   return vmovn_high_u32(a, b);
1869 }
1870
1871 // CHECK-LABEL: @test_vmovn_high_u64(
1872 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %b to <16 x i8>
1873 // CHECK:   [[VMOVN_I_I:%.*]] = trunc <2 x i64> %b to <2 x i32>
1874 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <2 x i32> %a, <2 x i32> [[VMOVN_I_I]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1875 // CHECK:   ret <4 x i32> [[SHUFFLE_I_I]]
1876 int32x4_t test_vmovn_high_u64(int32x2_t a, int64x2_t b) {
1877   return vmovn_high_u64(a, b);
1878 }
1879
1880 // CHECK-LABEL: @test_vqmovun_s16(
1881 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1882 // CHECK:   [[VQMOVUN_V1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqxtun.v8i8(<8 x i16> %a)
1883 // CHECK:   ret <8 x i8> [[VQMOVUN_V1_I]]
1884 int8x8_t test_vqmovun_s16(int16x8_t a) {
1885   return vqmovun_s16(a);
1886 }
1887
1888 // CHECK-LABEL: @test_vqmovun_s32(
1889 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1890 // CHECK:   [[VQMOVUN_V1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sqxtun.v4i16(<4 x i32> %a)
1891 // CHECK:   [[VQMOVUN_V2_I:%.*]] = bitcast <4 x i16> [[VQMOVUN_V1_I]] to <8 x i8>
1892 // CHECK:   ret <4 x i16> [[VQMOVUN_V1_I]]
1893 int16x4_t test_vqmovun_s32(int32x4_t a) {
1894   return vqmovun_s32(a);
1895 }
1896
1897 // CHECK-LABEL: @test_vqmovun_s64(
1898 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1899 // CHECK:   [[VQMOVUN_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sqxtun.v2i32(<2 x i64> %a)
1900 // CHECK:   [[VQMOVUN_V2_I:%.*]] = bitcast <2 x i32> [[VQMOVUN_V1_I]] to <8 x i8>
1901 // CHECK:   ret <2 x i32> [[VQMOVUN_V1_I]]
1902 int32x2_t test_vqmovun_s64(int64x2_t a) {
1903   return vqmovun_s64(a);
1904 }
1905
1906 // CHECK-LABEL: @test_vqmovun_high_s16(
1907 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %b to <16 x i8>
1908 // CHECK:   [[VQMOVUN_V1_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqxtun.v8i8(<8 x i16> %b)
1909 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> [[VQMOVUN_V1_I_I]], <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>
1910 // CHECK:   ret <16 x i8> [[SHUFFLE_I_I]]
1911 int8x16_t test_vqmovun_high_s16(int8x8_t a, int16x8_t b) {
1912   return vqmovun_high_s16(a, b);
1913 }
1914
1915 // CHECK-LABEL: @test_vqmovun_high_s32(
1916 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %b to <16 x i8>
1917 // CHECK:   [[VQMOVUN_V1_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sqxtun.v4i16(<4 x i32> %b)
1918 // CHECK:   [[VQMOVUN_V2_I_I:%.*]] = bitcast <4 x i16> [[VQMOVUN_V1_I_I]] to <8 x i8>
1919 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> [[VQMOVUN_V1_I_I]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1920 // CHECK:   ret <8 x i16> [[SHUFFLE_I_I]]
1921 int16x8_t test_vqmovun_high_s32(int16x4_t a, int32x4_t b) {
1922   return vqmovun_high_s32(a, b);
1923 }
1924
1925 // CHECK-LABEL: @test_vqmovun_high_s64(
1926 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %b to <16 x i8>
1927 // CHECK:   [[VQMOVUN_V1_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sqxtun.v2i32(<2 x i64> %b)
1928 // CHECK:   [[VQMOVUN_V2_I_I:%.*]] = bitcast <2 x i32> [[VQMOVUN_V1_I_I]] to <8 x i8>
1929 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <2 x i32> %a, <2 x i32> [[VQMOVUN_V1_I_I]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1930 // CHECK:   ret <4 x i32> [[SHUFFLE_I_I]]
1931 int32x4_t test_vqmovun_high_s64(int32x2_t a, int64x2_t b) {
1932   return vqmovun_high_s64(a, b);
1933 }
1934
1935 // CHECK-LABEL: @test_vqmovn_s16(
1936 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1937 // CHECK:   [[VQMOVN_V1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqxtn.v8i8(<8 x i16> %a)
1938 // CHECK:   ret <8 x i8> [[VQMOVN_V1_I]]
1939 int8x8_t test_vqmovn_s16(int16x8_t a) {
1940   return vqmovn_s16(a);
1941 }
1942
1943 // CHECK-LABEL: @test_vqmovn_s32(
1944 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
1945 // CHECK:   [[VQMOVN_V1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sqxtn.v4i16(<4 x i32> %a)
1946 // CHECK:   [[VQMOVN_V2_I:%.*]] = bitcast <4 x i16> [[VQMOVN_V1_I]] to <8 x i8>
1947 // CHECK:   ret <4 x i16> [[VQMOVN_V1_I]]
1948 int16x4_t test_vqmovn_s32(int32x4_t a) {
1949   return vqmovn_s32(a);
1950 }
1951
1952 // CHECK-LABEL: @test_vqmovn_s64(
1953 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
1954 // CHECK:   [[VQMOVN_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sqxtn.v2i32(<2 x i64> %a)
1955 // CHECK:   [[VQMOVN_V2_I:%.*]] = bitcast <2 x i32> [[VQMOVN_V1_I]] to <8 x i8>
1956 // CHECK:   ret <2 x i32> [[VQMOVN_V1_I]]
1957 int32x2_t test_vqmovn_s64(int64x2_t a) {
1958   return vqmovn_s64(a);
1959 }
1960
1961 // CHECK-LABEL: @test_vqmovn_high_s16(
1962 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %b to <16 x i8>
1963 // CHECK:   [[VQMOVN_V1_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqxtn.v8i8(<8 x i16> %b)
1964 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> [[VQMOVN_V1_I_I]], <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>
1965 // CHECK:   ret <16 x i8> [[SHUFFLE_I_I]]
1966 int8x16_t test_vqmovn_high_s16(int8x8_t a, int16x8_t b) {
1967   return vqmovn_high_s16(a, b);
1968 }
1969
1970 // CHECK-LABEL: @test_vqmovn_high_s32(
1971 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %b to <16 x i8>
1972 // CHECK:   [[VQMOVN_V1_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sqxtn.v4i16(<4 x i32> %b)
1973 // CHECK:   [[VQMOVN_V2_I_I:%.*]] = bitcast <4 x i16> [[VQMOVN_V1_I_I]] to <8 x i8>
1974 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> [[VQMOVN_V1_I_I]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1975 // CHECK:   ret <8 x i16> [[SHUFFLE_I_I]]
1976 int16x8_t test_vqmovn_high_s32(int16x4_t a, int32x4_t b) {
1977   return vqmovn_high_s32(a, b);
1978 }
1979
1980 // CHECK-LABEL: @test_vqmovn_high_s64(
1981 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %b to <16 x i8>
1982 // CHECK:   [[VQMOVN_V1_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sqxtn.v2i32(<2 x i64> %b)
1983 // CHECK:   [[VQMOVN_V2_I_I:%.*]] = bitcast <2 x i32> [[VQMOVN_V1_I_I]] to <8 x i8>
1984 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <2 x i32> %a, <2 x i32> [[VQMOVN_V1_I_I]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1985 // CHECK:   ret <4 x i32> [[SHUFFLE_I_I]]
1986 int32x4_t test_vqmovn_high_s64(int32x2_t a, int64x2_t b) {
1987   return vqmovn_high_s64(a, b);
1988 }
1989
1990 // CHECK-LABEL: @test_vqmovn_u16(
1991 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8>
1992 // CHECK:   [[VQMOVN_V1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.uqxtn.v8i8(<8 x i16> %a)
1993 // CHECK:   ret <8 x i8> [[VQMOVN_V1_I]]
1994 uint8x8_t test_vqmovn_u16(uint16x8_t a) {
1995   return vqmovn_u16(a);
1996 }
1997
1998 // CHECK-LABEL: @test_vqmovn_u32(
1999 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
2000 // CHECK:   [[VQMOVN_V1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uqxtn.v4i16(<4 x i32> %a)
2001 // CHECK:   [[VQMOVN_V2_I:%.*]] = bitcast <4 x i16> [[VQMOVN_V1_I]] to <8 x i8>
2002 // CHECK:   ret <4 x i16> [[VQMOVN_V1_I]]
2003 uint16x4_t test_vqmovn_u32(uint32x4_t a) {
2004   return vqmovn_u32(a);
2005 }
2006
2007 // CHECK-LABEL: @test_vqmovn_u64(
2008 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
2009 // CHECK:   [[VQMOVN_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uqxtn.v2i32(<2 x i64> %a)
2010 // CHECK:   [[VQMOVN_V2_I:%.*]] = bitcast <2 x i32> [[VQMOVN_V1_I]] to <8 x i8>
2011 // CHECK:   ret <2 x i32> [[VQMOVN_V1_I]]
2012 uint32x2_t test_vqmovn_u64(uint64x2_t a) {
2013   return vqmovn_u64(a);
2014 }
2015
2016 // CHECK-LABEL: @test_vqmovn_high_u16(
2017 // CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %b to <16 x i8>
2018 // CHECK:   [[VQMOVN_V1_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.uqxtn.v8i8(<8 x i16> %b)
2019 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> [[VQMOVN_V1_I_I]], <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>
2020 // CHECK:   ret <16 x i8> [[SHUFFLE_I_I]]
2021 uint8x16_t test_vqmovn_high_u16(uint8x8_t a, uint16x8_t b) {
2022   return vqmovn_high_u16(a, b);
2023 }
2024
2025 // CHECK-LABEL: @test_vqmovn_high_u32(
2026 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %b to <16 x i8>
2027 // CHECK:   [[VQMOVN_V1_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uqxtn.v4i16(<4 x i32> %b)
2028 // CHECK:   [[VQMOVN_V2_I_I:%.*]] = bitcast <4 x i16> [[VQMOVN_V1_I_I]] to <8 x i8>
2029 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i16> %a, <4 x i16> [[VQMOVN_V1_I_I]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2030 // CHECK:   ret <8 x i16> [[SHUFFLE_I_I]]
2031 uint16x8_t test_vqmovn_high_u32(uint16x4_t a, uint32x4_t b) {
2032   return vqmovn_high_u32(a, b);
2033 }
2034
2035 // CHECK-LABEL: @test_vqmovn_high_u64(
2036 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %b to <16 x i8>
2037 // CHECK:   [[VQMOVN_V1_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uqxtn.v2i32(<2 x i64> %b)
2038 // CHECK:   [[VQMOVN_V2_I_I:%.*]] = bitcast <2 x i32> [[VQMOVN_V1_I_I]] to <8 x i8>
2039 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <2 x i32> %a, <2 x i32> [[VQMOVN_V1_I_I]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2040 // CHECK:   ret <4 x i32> [[SHUFFLE_I_I]]
2041 uint32x4_t test_vqmovn_high_u64(uint32x2_t a, uint64x2_t b) {
2042   return vqmovn_high_u64(a, b);
2043 }
2044
2045 // CHECK-LABEL: @test_vshll_n_s8(
2046 // CHECK:   [[TMP0:%.*]] = sext <8 x i8> %a to <8 x i16>
2047 // CHECK:   [[VSHLL_N:%.*]] = shl <8 x i16> [[TMP0]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
2048 // CHECK:   ret <8 x i16> [[VSHLL_N]]
2049 int16x8_t test_vshll_n_s8(int8x8_t a) {
2050   return vshll_n_s8(a, 8);
2051 }
2052
2053 // CHECK-LABEL: @test_vshll_n_s16(
2054 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
2055 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16>
2056 // CHECK:   [[TMP2:%.*]] = sext <4 x i16> [[TMP1]] to <4 x i32>
2057 // CHECK:   [[VSHLL_N:%.*]] = shl <4 x i32> [[TMP2]], <i32 16, i32 16, i32 16, i32 16>
2058 // CHECK:   ret <4 x i32> [[VSHLL_N]]
2059 int32x4_t test_vshll_n_s16(int16x4_t a) {
2060   return vshll_n_s16(a, 16);
2061 }
2062
2063 // CHECK-LABEL: @test_vshll_n_s32(
2064 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
2065 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32>
2066 // CHECK:   [[TMP2:%.*]] = sext <2 x i32> [[TMP1]] to <2 x i64>
2067 // CHECK:   [[VSHLL_N:%.*]] = shl <2 x i64> [[TMP2]], <i64 32, i64 32>
2068 // CHECK:   ret <2 x i64> [[VSHLL_N]]
2069 int64x2_t test_vshll_n_s32(int32x2_t a) {
2070   return vshll_n_s32(a, 32);
2071 }
2072
2073 // CHECK-LABEL: @test_vshll_n_u8(
2074 // CHECK:   [[TMP0:%.*]] = zext <8 x i8> %a to <8 x i16>
2075 // CHECK:   [[VSHLL_N:%.*]] = shl <8 x i16> [[TMP0]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
2076 // CHECK:   ret <8 x i16> [[VSHLL_N]]
2077 uint16x8_t test_vshll_n_u8(uint8x8_t a) {
2078   return vshll_n_u8(a, 8);
2079 }
2080
2081 // CHECK-LABEL: @test_vshll_n_u16(
2082 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8>
2083 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16>
2084 // CHECK:   [[TMP2:%.*]] = zext <4 x i16> [[TMP1]] to <4 x i32>
2085 // CHECK:   [[VSHLL_N:%.*]] = shl <4 x i32> [[TMP2]], <i32 16, i32 16, i32 16, i32 16>
2086 // CHECK:   ret <4 x i32> [[VSHLL_N]]
2087 uint32x4_t test_vshll_n_u16(uint16x4_t a) {
2088   return vshll_n_u16(a, 16);
2089 }
2090
2091 // CHECK-LABEL: @test_vshll_n_u32(
2092 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
2093 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32>
2094 // CHECK:   [[TMP2:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64>
2095 // CHECK:   [[VSHLL_N:%.*]] = shl <2 x i64> [[TMP2]], <i64 32, i64 32>
2096 // CHECK:   ret <2 x i64> [[VSHLL_N]]
2097 uint64x2_t test_vshll_n_u32(uint32x2_t a) {
2098   return vshll_n_u32(a, 32);
2099 }
2100
2101 // CHECK-LABEL: @test_vshll_high_n_s8(
2102 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2103 // CHECK:   [[TMP0:%.*]] = sext <8 x i8> [[SHUFFLE_I]] to <8 x i16>
2104 // CHECK:   [[VSHLL_N:%.*]] = shl <8 x i16> [[TMP0]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
2105 // CHECK:   ret <8 x i16> [[VSHLL_N]]
2106 int16x8_t test_vshll_high_n_s8(int8x16_t a) {
2107   return vshll_high_n_s8(a, 8);
2108 }
2109
2110 // CHECK-LABEL: @test_vshll_high_n_s16(
2111 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
2112 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> [[SHUFFLE_I]] to <8 x i8>
2113 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16>
2114 // CHECK:   [[TMP2:%.*]] = sext <4 x i16> [[TMP1]] to <4 x i32>
2115 // CHECK:   [[VSHLL_N:%.*]] = shl <4 x i32> [[TMP2]], <i32 16, i32 16, i32 16, i32 16>
2116 // CHECK:   ret <4 x i32> [[VSHLL_N]]
2117 int32x4_t test_vshll_high_n_s16(int16x8_t a) {
2118   return vshll_high_n_s16(a, 16);
2119 }
2120
2121 // CHECK-LABEL: @test_vshll_high_n_s32(
2122 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i32> %a, <4 x i32> %a, <2 x i32> <i32 2, i32 3>
2123 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> [[SHUFFLE_I]] to <8 x i8>
2124 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32>
2125 // CHECK:   [[TMP2:%.*]] = sext <2 x i32> [[TMP1]] to <2 x i64>
2126 // CHECK:   [[VSHLL_N:%.*]] = shl <2 x i64> [[TMP2]], <i64 32, i64 32>
2127 // CHECK:   ret <2 x i64> [[VSHLL_N]]
2128 int64x2_t test_vshll_high_n_s32(int32x4_t a) {
2129   return vshll_high_n_s32(a, 32);
2130 }
2131
2132 // CHECK-LABEL: @test_vshll_high_n_u8(
2133 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2134 // CHECK:   [[TMP0:%.*]] = zext <8 x i8> [[SHUFFLE_I]] to <8 x i16>
2135 // CHECK:   [[VSHLL_N:%.*]] = shl <8 x i16> [[TMP0]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
2136 // CHECK:   ret <8 x i16> [[VSHLL_N]]
2137 uint16x8_t test_vshll_high_n_u8(uint8x16_t a) {
2138   return vshll_high_n_u8(a, 8);
2139 }
2140
2141 // CHECK-LABEL: @test_vshll_high_n_u16(
2142 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
2143 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> [[SHUFFLE_I]] to <8 x i8>
2144 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16>
2145 // CHECK:   [[TMP2:%.*]] = zext <4 x i16> [[TMP1]] to <4 x i32>
2146 // CHECK:   [[VSHLL_N:%.*]] = shl <4 x i32> [[TMP2]], <i32 16, i32 16, i32 16, i32 16>
2147 // CHECK:   ret <4 x i32> [[VSHLL_N]]
2148 uint32x4_t test_vshll_high_n_u16(uint16x8_t a) {
2149   return vshll_high_n_u16(a, 16);
2150 }
2151
2152 // CHECK-LABEL: @test_vshll_high_n_u32(
2153 // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i32> %a, <4 x i32> %a, <2 x i32> <i32 2, i32 3>
2154 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> [[SHUFFLE_I]] to <8 x i8>
2155 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32>
2156 // CHECK:   [[TMP2:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64>
2157 // CHECK:   [[VSHLL_N:%.*]] = shl <2 x i64> [[TMP2]], <i64 32, i64 32>
2158 // CHECK:   ret <2 x i64> [[VSHLL_N]]
2159 uint64x2_t test_vshll_high_n_u32(uint32x4_t a) {
2160   return vshll_high_n_u32(a, 32);
2161 }
2162
2163 // CHECK-LABEL: @test_vcvt_f16_f32(
2164 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2165 // CHECK:   [[VCVT_F16_F321_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.vcvtfp2hf(<4 x float> %a)
2166 // CHECK:   [[VCVT_F16_F322_I:%.*]] = bitcast <4 x i16> [[VCVT_F16_F321_I]] to <8 x i8>
2167 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[VCVT_F16_F322_I]] to <4 x half>
2168 // CHECK:   ret <4 x half> [[TMP1]]
2169 float16x4_t test_vcvt_f16_f32(float32x4_t a) {
2170   return vcvt_f16_f32(a);
2171 }
2172
2173 // CHECK-LABEL: @test_vcvt_high_f16_f32(
2174 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %b to <16 x i8>
2175 // CHECK:   [[VCVT_F16_F321_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.vcvtfp2hf(<4 x float> %b)
2176 // CHECK:   [[VCVT_F16_F322_I_I:%.*]] = bitcast <4 x i16> [[VCVT_F16_F321_I_I]] to <8 x i8>
2177 // CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[VCVT_F16_F322_I_I]] to <4 x half>
2178 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <4 x half> %a, <4 x half> [[TMP1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2179 // CHECK:   ret <8 x half> [[SHUFFLE_I_I]]
2180 float16x8_t test_vcvt_high_f16_f32(float16x4_t a, float32x4_t b) {
2181   return vcvt_high_f16_f32(a, b);
2182 }
2183
2184 // CHECK-LABEL: @test_vcvt_f32_f64(
2185 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2186 // CHECK:   [[VCVT_I:%.*]] = fptrunc <2 x double> %a to <2 x float>
2187 // CHECK:   ret <2 x float> [[VCVT_I]]
2188 float32x2_t test_vcvt_f32_f64(float64x2_t a) {
2189   return vcvt_f32_f64(a);
2190 }
2191
2192 // CHECK-LABEL: @test_vcvt_high_f32_f64(
2193 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %b to <16 x i8>
2194 // CHECK:   [[VCVT_I_I:%.*]] = fptrunc <2 x double> %b to <2 x float>
2195 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <2 x float> %a, <2 x float> [[VCVT_I_I]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2196 // CHECK:   ret <4 x float> [[SHUFFLE_I_I]]
2197 float32x4_t test_vcvt_high_f32_f64(float32x2_t a, float64x2_t b) {
2198   return vcvt_high_f32_f64(a, b);
2199 }
2200
2201 // CHECK-LABEL: @test_vcvtx_f32_f64(
2202 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2203 // CHECK:   [[VCVTX_F32_V1_I:%.*]] = call <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double> %a)
2204 // CHECK:   ret <2 x float> [[VCVTX_F32_V1_I]]
2205 float32x2_t test_vcvtx_f32_f64(float64x2_t a) {
2206   return vcvtx_f32_f64(a);
2207 }
2208
2209 // CHECK-LABEL: @test_vcvtx_high_f32_f64(
2210 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %b to <16 x i8>
2211 // CHECK:   [[VCVTX_F32_V1_I_I:%.*]] = call <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double> %b)
2212 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <2 x float> %a, <2 x float> [[VCVTX_F32_V1_I_I]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2213 // CHECK:   ret <4 x float> [[SHUFFLE_I_I]]
2214 float32x4_t test_vcvtx_high_f32_f64(float32x2_t a, float64x2_t b) {
2215   return vcvtx_high_f32_f64(a, b);
2216 }
2217
2218 // CHECK-LABEL: @test_vcvt_f32_f16(
2219 // CHECK:   [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8>
2220 // CHECK:   [[VCVT_F32_F16_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16>
2221 // CHECK:   [[VCVT_F32_F161_I:%.*]] = call <4 x float> @llvm.aarch64.neon.vcvthf2fp(<4 x i16> [[VCVT_F32_F16_I]])
2222 // CHECK:   [[VCVT_F32_F162_I:%.*]] = bitcast <4 x float> [[VCVT_F32_F161_I]] to <16 x i8>
2223 // CHECK:   ret <4 x float> [[VCVT_F32_F161_I]]
2224 float32x4_t test_vcvt_f32_f16(float16x4_t a) {
2225   return vcvt_f32_f16(a);
2226 }
2227
2228 // CHECK-LABEL: @test_vcvt_high_f32_f16(
2229 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %a, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
2230 // CHECK:   [[TMP0:%.*]] = bitcast <4 x half> [[SHUFFLE_I_I]] to <8 x i8>
2231 // CHECK:   [[VCVT_F32_F16_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16>
2232 // CHECK:   [[VCVT_F32_F161_I_I:%.*]] = call <4 x float> @llvm.aarch64.neon.vcvthf2fp(<4 x i16> [[VCVT_F32_F16_I_I]])
2233 // CHECK:   [[VCVT_F32_F162_I_I:%.*]] = bitcast <4 x float> [[VCVT_F32_F161_I_I]] to <16 x i8>
2234 // CHECK:   ret <4 x float> [[VCVT_F32_F161_I_I]]
2235 float32x4_t test_vcvt_high_f32_f16(float16x8_t a) {
2236   return vcvt_high_f32_f16(a);
2237 }
2238
2239 // CHECK-LABEL: @test_vcvt_f64_f32(
2240 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2241 // CHECK:   [[VCVT_I:%.*]] = fpext <2 x float> %a to <2 x double>
2242 // CHECK:   ret <2 x double> [[VCVT_I]]
2243 float64x2_t test_vcvt_f64_f32(float32x2_t a) {
2244   return vcvt_f64_f32(a);
2245 }
2246
2247 // CHECK-LABEL: @test_vcvt_high_f64_f32(
2248 // CHECK:   [[SHUFFLE_I_I:%.*]] = shufflevector <4 x float> %a, <4 x float> %a, <2 x i32> <i32 2, i32 3>
2249 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> [[SHUFFLE_I_I]] to <8 x i8>
2250 // CHECK:   [[VCVT_I_I:%.*]] = fpext <2 x float> [[SHUFFLE_I_I]] to <2 x double>
2251 // CHECK:   ret <2 x double> [[VCVT_I_I]]
2252 float64x2_t test_vcvt_high_f64_f32(float32x4_t a) {
2253   return vcvt_high_f64_f32(a);
2254 }
2255
2256 // CHECK-LABEL: @test_vrndn_f32(
2257 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2258 // CHECK:   [[VRNDN1_I:%.*]] = call <2 x float> @llvm.aarch64.neon.frintn.v2f32(<2 x float> %a)
2259 // CHECK:   ret <2 x float> [[VRNDN1_I]]
2260 float32x2_t test_vrndn_f32(float32x2_t a) {
2261   return vrndn_f32(a);
2262 }
2263
2264 // CHECK-LABEL: @test_vrndnq_f32(
2265 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2266 // CHECK:   [[VRNDN1_I:%.*]] = call <4 x float> @llvm.aarch64.neon.frintn.v4f32(<4 x float> %a)
2267 // CHECK:   ret <4 x float> [[VRNDN1_I]]
2268 float32x4_t test_vrndnq_f32(float32x4_t a) {
2269   return vrndnq_f32(a);
2270 }
2271
2272 // CHECK-LABEL: @test_vrndnq_f64(
2273 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2274 // CHECK:   [[VRNDN1_I:%.*]] = call <2 x double> @llvm.aarch64.neon.frintn.v2f64(<2 x double> %a)
2275 // CHECK:   ret <2 x double> [[VRNDN1_I]]
2276 float64x2_t test_vrndnq_f64(float64x2_t a) {
2277   return vrndnq_f64(a);
2278 }
2279
2280 // CHECK-LABEL: @test_vrnda_f32(
2281 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2282 // CHECK:   [[VRNDA1_I:%.*]] = call <2 x float> @llvm.round.v2f32(<2 x float> %a)
2283 // CHECK:   ret <2 x float> [[VRNDA1_I]]
2284 float32x2_t test_vrnda_f32(float32x2_t a) {
2285   return vrnda_f32(a);
2286 }
2287
2288 // CHECK-LABEL: @test_vrndaq_f32(
2289 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2290 // CHECK:   [[VRNDA1_I:%.*]] = call <4 x float> @llvm.round.v4f32(<4 x float> %a)
2291 // CHECK:   ret <4 x float> [[VRNDA1_I]]
2292 float32x4_t test_vrndaq_f32(float32x4_t a) {
2293   return vrndaq_f32(a);
2294 }
2295
2296 // CHECK-LABEL: @test_vrndaq_f64(
2297 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2298 // CHECK:   [[VRNDA1_I:%.*]] = call <2 x double> @llvm.round.v2f64(<2 x double> %a)
2299 // CHECK:   ret <2 x double> [[VRNDA1_I]]
2300 float64x2_t test_vrndaq_f64(float64x2_t a) {
2301   return vrndaq_f64(a);
2302 }
2303
2304 // CHECK-LABEL: @test_vrndp_f32(
2305 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2306 // CHECK:   [[VRNDP1_I:%.*]] = call <2 x float> @llvm.ceil.v2f32(<2 x float> %a)
2307 // CHECK:   ret <2 x float> [[VRNDP1_I]]
2308 float32x2_t test_vrndp_f32(float32x2_t a) {
2309   return vrndp_f32(a);
2310 }
2311
2312 // CHECK-LABEL: @test_vrndpq_f32(
2313 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2314 // CHECK:   [[VRNDP1_I:%.*]] = call <4 x float> @llvm.ceil.v4f32(<4 x float> %a)
2315 // CHECK:   ret <4 x float> [[VRNDP1_I]]
2316 float32x4_t test_vrndpq_f32(float32x4_t a) {
2317   return vrndpq_f32(a);
2318 }
2319
2320 // CHECK-LABEL: @test_vrndpq_f64(
2321 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2322 // CHECK:   [[VRNDP1_I:%.*]] = call <2 x double> @llvm.ceil.v2f64(<2 x double> %a)
2323 // CHECK:   ret <2 x double> [[VRNDP1_I]]
2324 float64x2_t test_vrndpq_f64(float64x2_t a) {
2325   return vrndpq_f64(a);
2326 }
2327
2328 // CHECK-LABEL: @test_vrndm_f32(
2329 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2330 // CHECK:   [[VRNDM1_I:%.*]] = call <2 x float> @llvm.floor.v2f32(<2 x float> %a)
2331 // CHECK:   ret <2 x float> [[VRNDM1_I]]
2332 float32x2_t test_vrndm_f32(float32x2_t a) {
2333   return vrndm_f32(a);
2334 }
2335
2336 // CHECK-LABEL: @test_vrndmq_f32(
2337 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2338 // CHECK:   [[VRNDM1_I:%.*]] = call <4 x float> @llvm.floor.v4f32(<4 x float> %a)
2339 // CHECK:   ret <4 x float> [[VRNDM1_I]]
2340 float32x4_t test_vrndmq_f32(float32x4_t a) {
2341   return vrndmq_f32(a);
2342 }
2343
2344 // CHECK-LABEL: @test_vrndmq_f64(
2345 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2346 // CHECK:   [[VRNDM1_I:%.*]] = call <2 x double> @llvm.floor.v2f64(<2 x double> %a)
2347 // CHECK:   ret <2 x double> [[VRNDM1_I]]
2348 float64x2_t test_vrndmq_f64(float64x2_t a) {
2349   return vrndmq_f64(a);
2350 }
2351
2352 // CHECK-LABEL: @test_vrndx_f32(
2353 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2354 // CHECK:   [[VRNDX1_I:%.*]] = call <2 x float> @llvm.rint.v2f32(<2 x float> %a)
2355 // CHECK:   ret <2 x float> [[VRNDX1_I]]
2356 float32x2_t test_vrndx_f32(float32x2_t a) {
2357   return vrndx_f32(a);
2358 }
2359
2360 // CHECK-LABEL: @test_vrndxq_f32(
2361 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2362 // CHECK:   [[VRNDX1_I:%.*]] = call <4 x float> @llvm.rint.v4f32(<4 x float> %a)
2363 // CHECK:   ret <4 x float> [[VRNDX1_I]]
2364 float32x4_t test_vrndxq_f32(float32x4_t a) {
2365   return vrndxq_f32(a);
2366 }
2367
2368 // CHECK-LABEL: @test_vrndxq_f64(
2369 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2370 // CHECK:   [[VRNDX1_I:%.*]] = call <2 x double> @llvm.rint.v2f64(<2 x double> %a)
2371 // CHECK:   ret <2 x double> [[VRNDX1_I]]
2372 float64x2_t test_vrndxq_f64(float64x2_t a) {
2373   return vrndxq_f64(a);
2374 }
2375
2376 // CHECK-LABEL: @test_vrnd_f32(
2377 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2378 // CHECK:   [[VRNDZ1_I:%.*]] = call <2 x float> @llvm.trunc.v2f32(<2 x float> %a)
2379 // CHECK:   ret <2 x float> [[VRNDZ1_I]]
2380 float32x2_t test_vrnd_f32(float32x2_t a) {
2381   return vrnd_f32(a);
2382 }
2383
2384 // CHECK-LABEL: @test_vrndq_f32(
2385 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2386 // CHECK:   [[VRNDZ1_I:%.*]] = call <4 x float> @llvm.trunc.v4f32(<4 x float> %a)
2387 // CHECK:   ret <4 x float> [[VRNDZ1_I]]
2388 float32x4_t test_vrndq_f32(float32x4_t a) {
2389   return vrndq_f32(a);
2390 }
2391
2392 // CHECK-LABEL: @test_vrndq_f64(
2393 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2394 // CHECK:   [[VRNDZ1_I:%.*]] = call <2 x double> @llvm.trunc.v2f64(<2 x double> %a)
2395 // CHECK:   ret <2 x double> [[VRNDZ1_I]]
2396 float64x2_t test_vrndq_f64(float64x2_t a) {
2397   return vrndq_f64(a);
2398 }
2399
2400 // CHECK-LABEL: @test_vrndi_f32(
2401 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2402 // CHECK:   [[VRNDI1_I:%.*]] = call <2 x float> @llvm.nearbyint.v2f32(<2 x float> %a)
2403 // CHECK:   ret <2 x float> [[VRNDI1_I]]
2404 float32x2_t test_vrndi_f32(float32x2_t a) {
2405   return vrndi_f32(a);
2406 }
2407
2408 // CHECK-LABEL: @test_vrndiq_f32(
2409 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2410 // CHECK:   [[VRNDI1_I:%.*]] = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %a)
2411 // CHECK:   ret <4 x float> [[VRNDI1_I]]
2412 float32x4_t test_vrndiq_f32(float32x4_t a) {
2413   return vrndiq_f32(a);
2414 }
2415
2416 // CHECK-LABEL: @test_vrndiq_f64(
2417 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2418 // CHECK:   [[VRNDI1_I:%.*]] = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %a)
2419 // CHECK:   ret <2 x double> [[VRNDI1_I]]
2420 float64x2_t test_vrndiq_f64(float64x2_t a) {
2421   return vrndiq_f64(a);
2422 }
2423
2424 // CHECK-LABEL: @test_vcvt_s32_f32(
2425 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2426 // CHECK:   [[TMP1:%.*]] = fptosi <2 x float> %a to <2 x i32>
2427 // CHECK:   ret <2 x i32> [[TMP1]]
2428 int32x2_t test_vcvt_s32_f32(float32x2_t a) {
2429   return vcvt_s32_f32(a);
2430 }
2431
2432 // CHECK-LABEL: @test_vcvtq_s32_f32(
2433 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2434 // CHECK:   [[TMP1:%.*]] = fptosi <4 x float> %a to <4 x i32>
2435 // CHECK:   ret <4 x i32> [[TMP1]]
2436 int32x4_t test_vcvtq_s32_f32(float32x4_t a) {
2437   return vcvtq_s32_f32(a);
2438 }
2439
2440 // CHECK-LABEL: @test_vcvtq_s64_f64(
2441 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2442 // CHECK:   [[TMP1:%.*]] = fptosi <2 x double> %a to <2 x i64>
2443 // CHECK:   ret <2 x i64> [[TMP1]]
2444 int64x2_t test_vcvtq_s64_f64(float64x2_t a) {
2445   return vcvtq_s64_f64(a);
2446 }
2447
2448 // CHECK-LABEL: @test_vcvt_u32_f32(
2449 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2450 // CHECK:   [[TMP1:%.*]] = fptoui <2 x float> %a to <2 x i32>
2451 // CHECK:   ret <2 x i32> [[TMP1]]
2452 uint32x2_t test_vcvt_u32_f32(float32x2_t a) {
2453   return vcvt_u32_f32(a);
2454 }
2455
2456 // CHECK-LABEL: @test_vcvtq_u32_f32(
2457 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2458 // CHECK:   [[TMP1:%.*]] = fptoui <4 x float> %a to <4 x i32>
2459 // CHECK:   ret <4 x i32> [[TMP1]]
2460 uint32x4_t test_vcvtq_u32_f32(float32x4_t a) {
2461   return vcvtq_u32_f32(a);
2462 }
2463
2464 // CHECK-LABEL: @test_vcvtq_u64_f64(
2465 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2466 // CHECK:   [[TMP1:%.*]] = fptoui <2 x double> %a to <2 x i64>
2467 // CHECK:   ret <2 x i64> [[TMP1]]
2468 uint64x2_t test_vcvtq_u64_f64(float64x2_t a) {
2469   return vcvtq_u64_f64(a);
2470 }
2471
2472 // CHECK-LABEL: @test_vcvtn_s32_f32(
2473 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2474 // CHECK:   [[VCVTN1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.fcvtns.v2i32.v2f32(<2 x float> %a)
2475 // CHECK:   ret <2 x i32> [[VCVTN1_I]]
2476 int32x2_t test_vcvtn_s32_f32(float32x2_t a) {
2477   return vcvtn_s32_f32(a);
2478 }
2479
2480 // CHECK-LABEL: @test_vcvtnq_s32_f32(
2481 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2482 // CHECK:   [[VCVTN1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.fcvtns.v4i32.v4f32(<4 x float> %a)
2483 // CHECK:   ret <4 x i32> [[VCVTN1_I]]
2484 int32x4_t test_vcvtnq_s32_f32(float32x4_t a) {
2485   return vcvtnq_s32_f32(a);
2486 }
2487
2488 // CHECK-LABEL: @test_vcvtnq_s64_f64(
2489 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2490 // CHECK:   [[VCVTN1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.fcvtns.v2i64.v2f64(<2 x double> %a)
2491 // CHECK:   ret <2 x i64> [[VCVTN1_I]]
2492 int64x2_t test_vcvtnq_s64_f64(float64x2_t a) {
2493   return vcvtnq_s64_f64(a);
2494 }
2495
2496 // CHECK-LABEL: @test_vcvtn_u32_f32(
2497 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2498 // CHECK:   [[VCVTN1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.fcvtnu.v2i32.v2f32(<2 x float> %a)
2499 // CHECK:   ret <2 x i32> [[VCVTN1_I]]
2500 uint32x2_t test_vcvtn_u32_f32(float32x2_t a) {
2501   return vcvtn_u32_f32(a);
2502 }
2503
2504 // CHECK-LABEL: @test_vcvtnq_u32_f32(
2505 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2506 // CHECK:   [[VCVTN1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.fcvtnu.v4i32.v4f32(<4 x float> %a)
2507 // CHECK:   ret <4 x i32> [[VCVTN1_I]]
2508 uint32x4_t test_vcvtnq_u32_f32(float32x4_t a) {
2509   return vcvtnq_u32_f32(a);
2510 }
2511
2512 // CHECK-LABEL: @test_vcvtnq_u64_f64(
2513 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2514 // CHECK:   [[VCVTN1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.fcvtnu.v2i64.v2f64(<2 x double> %a)
2515 // CHECK:   ret <2 x i64> [[VCVTN1_I]]
2516 uint64x2_t test_vcvtnq_u64_f64(float64x2_t a) {
2517   return vcvtnq_u64_f64(a);
2518 }
2519
2520 // CHECK-LABEL: @test_vcvtp_s32_f32(
2521 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2522 // CHECK:   [[VCVTP1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.fcvtps.v2i32.v2f32(<2 x float> %a)
2523 // CHECK:   ret <2 x i32> [[VCVTP1_I]]
2524 int32x2_t test_vcvtp_s32_f32(float32x2_t a) {
2525   return vcvtp_s32_f32(a);
2526 }
2527
2528 // CHECK-LABEL: @test_vcvtpq_s32_f32(
2529 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2530 // CHECK:   [[VCVTP1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.fcvtps.v4i32.v4f32(<4 x float> %a)
2531 // CHECK:   ret <4 x i32> [[VCVTP1_I]]
2532 int32x4_t test_vcvtpq_s32_f32(float32x4_t a) {
2533   return vcvtpq_s32_f32(a);
2534 }
2535
2536 // CHECK-LABEL: @test_vcvtpq_s64_f64(
2537 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2538 // CHECK:   [[VCVTP1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.fcvtps.v2i64.v2f64(<2 x double> %a)
2539 // CHECK:   ret <2 x i64> [[VCVTP1_I]]
2540 int64x2_t test_vcvtpq_s64_f64(float64x2_t a) {
2541   return vcvtpq_s64_f64(a);
2542 }
2543
2544 // CHECK-LABEL: @test_vcvtp_u32_f32(
2545 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2546 // CHECK:   [[VCVTP1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.fcvtpu.v2i32.v2f32(<2 x float> %a)
2547 // CHECK:   ret <2 x i32> [[VCVTP1_I]]
2548 uint32x2_t test_vcvtp_u32_f32(float32x2_t a) {
2549   return vcvtp_u32_f32(a);
2550 }
2551
2552 // CHECK-LABEL: @test_vcvtpq_u32_f32(
2553 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2554 // CHECK:   [[VCVTP1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.fcvtpu.v4i32.v4f32(<4 x float> %a)
2555 // CHECK:   ret <4 x i32> [[VCVTP1_I]]
2556 uint32x4_t test_vcvtpq_u32_f32(float32x4_t a) {
2557   return vcvtpq_u32_f32(a);
2558 }
2559
2560 // CHECK-LABEL: @test_vcvtpq_u64_f64(
2561 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2562 // CHECK:   [[VCVTP1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.fcvtpu.v2i64.v2f64(<2 x double> %a)
2563 // CHECK:   ret <2 x i64> [[VCVTP1_I]]
2564 uint64x2_t test_vcvtpq_u64_f64(float64x2_t a) {
2565   return vcvtpq_u64_f64(a);
2566 }
2567
2568 // CHECK-LABEL: @test_vcvtm_s32_f32(
2569 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2570 // CHECK:   [[VCVTM1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.fcvtms.v2i32.v2f32(<2 x float> %a)
2571 // CHECK:   ret <2 x i32> [[VCVTM1_I]]
2572 int32x2_t test_vcvtm_s32_f32(float32x2_t a) {
2573   return vcvtm_s32_f32(a);
2574 }
2575
2576 // CHECK-LABEL: @test_vcvtmq_s32_f32(
2577 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2578 // CHECK:   [[VCVTM1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.fcvtms.v4i32.v4f32(<4 x float> %a)
2579 // CHECK:   ret <4 x i32> [[VCVTM1_I]]
2580 int32x4_t test_vcvtmq_s32_f32(float32x4_t a) {
2581   return vcvtmq_s32_f32(a);
2582 }
2583
2584 // CHECK-LABEL: @test_vcvtmq_s64_f64(
2585 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2586 // CHECK:   [[VCVTM1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.fcvtms.v2i64.v2f64(<2 x double> %a)
2587 // CHECK:   ret <2 x i64> [[VCVTM1_I]]
2588 int64x2_t test_vcvtmq_s64_f64(float64x2_t a) {
2589   return vcvtmq_s64_f64(a);
2590 }
2591
2592 // CHECK-LABEL: @test_vcvtm_u32_f32(
2593 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2594 // CHECK:   [[VCVTM1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.fcvtmu.v2i32.v2f32(<2 x float> %a)
2595 // CHECK:   ret <2 x i32> [[VCVTM1_I]]
2596 uint32x2_t test_vcvtm_u32_f32(float32x2_t a) {
2597   return vcvtm_u32_f32(a);
2598 }
2599
2600 // CHECK-LABEL: @test_vcvtmq_u32_f32(
2601 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2602 // CHECK:   [[VCVTM1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.fcvtmu.v4i32.v4f32(<4 x float> %a)
2603 // CHECK:   ret <4 x i32> [[VCVTM1_I]]
2604 uint32x4_t test_vcvtmq_u32_f32(float32x4_t a) {
2605   return vcvtmq_u32_f32(a);
2606 }
2607
2608 // CHECK-LABEL: @test_vcvtmq_u64_f64(
2609 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2610 // CHECK:   [[VCVTM1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.fcvtmu.v2i64.v2f64(<2 x double> %a)
2611 // CHECK:   ret <2 x i64> [[VCVTM1_I]]
2612 uint64x2_t test_vcvtmq_u64_f64(float64x2_t a) {
2613   return vcvtmq_u64_f64(a);
2614 }
2615
2616 // CHECK-LABEL: @test_vcvta_s32_f32(
2617 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2618 // CHECK:   [[VCVTA1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.fcvtas.v2i32.v2f32(<2 x float> %a)
2619 // CHECK:   ret <2 x i32> [[VCVTA1_I]]
2620 int32x2_t test_vcvta_s32_f32(float32x2_t a) {
2621   return vcvta_s32_f32(a);
2622 }
2623
2624 // CHECK-LABEL: @test_vcvtaq_s32_f32(
2625 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2626 // CHECK:   [[VCVTA1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.fcvtas.v4i32.v4f32(<4 x float> %a)
2627 // CHECK:   ret <4 x i32> [[VCVTA1_I]]
2628 int32x4_t test_vcvtaq_s32_f32(float32x4_t a) {
2629   return vcvtaq_s32_f32(a);
2630 }
2631
2632 // CHECK-LABEL: @test_vcvtaq_s64_f64(
2633 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2634 // CHECK:   [[VCVTA1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.fcvtas.v2i64.v2f64(<2 x double> %a)
2635 // CHECK:   ret <2 x i64> [[VCVTA1_I]]
2636 int64x2_t test_vcvtaq_s64_f64(float64x2_t a) {
2637   return vcvtaq_s64_f64(a);
2638 }
2639
2640 // CHECK-LABEL: @test_vcvta_u32_f32(
2641 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2642 // CHECK:   [[VCVTA1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.fcvtau.v2i32.v2f32(<2 x float> %a)
2643 // CHECK:   ret <2 x i32> [[VCVTA1_I]]
2644 uint32x2_t test_vcvta_u32_f32(float32x2_t a) {
2645   return vcvta_u32_f32(a);
2646 }
2647
2648 // CHECK-LABEL: @test_vcvtaq_u32_f32(
2649 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2650 // CHECK:   [[VCVTA1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.fcvtau.v4i32.v4f32(<4 x float> %a)
2651 // CHECK:   ret <4 x i32> [[VCVTA1_I]]
2652 uint32x4_t test_vcvtaq_u32_f32(float32x4_t a) {
2653   return vcvtaq_u32_f32(a);
2654 }
2655
2656 // CHECK-LABEL: @test_vcvtaq_u64_f64(
2657 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2658 // CHECK:   [[VCVTA1_I:%.*]] = call <2 x i64> @llvm.aarch64.neon.fcvtau.v2i64.v2f64(<2 x double> %a)
2659 // CHECK:   ret <2 x i64> [[VCVTA1_I]]
2660 uint64x2_t test_vcvtaq_u64_f64(float64x2_t a) {
2661   return vcvtaq_u64_f64(a);
2662 }
2663
2664 // CHECK-LABEL: @test_vrsqrte_f32(
2665 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2666 // CHECK:   [[VRSQRTE_V1_I:%.*]] = call <2 x float> @llvm.aarch64.neon.frsqrte.v2f32(<2 x float> %a)
2667 // CHECK:   ret <2 x float> [[VRSQRTE_V1_I]]
2668 float32x2_t test_vrsqrte_f32(float32x2_t a) {
2669   return vrsqrte_f32(a);
2670 }
2671
2672 // CHECK-LABEL: @test_vrsqrteq_f32(
2673 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2674 // CHECK:   [[VRSQRTEQ_V1_I:%.*]] = call <4 x float> @llvm.aarch64.neon.frsqrte.v4f32(<4 x float> %a)
2675 // CHECK:   ret <4 x float> [[VRSQRTEQ_V1_I]]
2676 float32x4_t test_vrsqrteq_f32(float32x4_t a) {
2677   return vrsqrteq_f32(a);
2678 }
2679
2680 // CHECK-LABEL: @test_vrsqrteq_f64(
2681 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2682 // CHECK:   [[VRSQRTEQ_V1_I:%.*]] = call <2 x double> @llvm.aarch64.neon.frsqrte.v2f64(<2 x double> %a)
2683 // CHECK:   ret <2 x double> [[VRSQRTEQ_V1_I]]
2684 float64x2_t test_vrsqrteq_f64(float64x2_t a) {
2685   return vrsqrteq_f64(a);
2686 }
2687
2688 // CHECK-LABEL: @test_vrecpe_f32(
2689 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2690 // CHECK:   [[VRECPE_V1_I:%.*]] = call <2 x float> @llvm.aarch64.neon.frecpe.v2f32(<2 x float> %a)
2691 // CHECK:   ret <2 x float> [[VRECPE_V1_I]]
2692 float32x2_t test_vrecpe_f32(float32x2_t a) {
2693   return vrecpe_f32(a);
2694 }
2695
2696 // CHECK-LABEL: @test_vrecpeq_f32(
2697 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2698 // CHECK:   [[VRECPEQ_V1_I:%.*]] = call <4 x float> @llvm.aarch64.neon.frecpe.v4f32(<4 x float> %a)
2699 // CHECK:   ret <4 x float> [[VRECPEQ_V1_I]]
2700 float32x4_t test_vrecpeq_f32(float32x4_t a) {
2701   return vrecpeq_f32(a);
2702 }
2703
2704 // CHECK-LABEL: @test_vrecpeq_f64(
2705 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2706 // CHECK:   [[VRECPEQ_V1_I:%.*]] = call <2 x double> @llvm.aarch64.neon.frecpe.v2f64(<2 x double> %a)
2707 // CHECK:   ret <2 x double> [[VRECPEQ_V1_I]]
2708 float64x2_t test_vrecpeq_f64(float64x2_t a) {
2709   return vrecpeq_f64(a);
2710 }
2711
2712 // CHECK-LABEL: @test_vrecpe_u32(
2713 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
2714 // CHECK:   [[VRECPE_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.urecpe.v2i32(<2 x i32> %a)
2715 // CHECK:   ret <2 x i32> [[VRECPE_V1_I]]
2716 uint32x2_t test_vrecpe_u32(uint32x2_t a) {
2717   return vrecpe_u32(a);
2718 }
2719
2720 // CHECK-LABEL: @test_vrecpeq_u32(
2721 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
2722 // CHECK:   [[VRECPEQ_V1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.urecpe.v4i32(<4 x i32> %a)
2723 // CHECK:   ret <4 x i32> [[VRECPEQ_V1_I]]
2724 uint32x4_t test_vrecpeq_u32(uint32x4_t a) {
2725   return vrecpeq_u32(a);
2726 }
2727
2728 // CHECK-LABEL: @test_vsqrt_f32(
2729 // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
2730 // CHECK:   [[VSQRT_I:%.*]] = call <2 x float> @llvm.sqrt.v2f32(<2 x float> %a)
2731 // CHECK:   ret <2 x float> [[VSQRT_I]]
2732 float32x2_t test_vsqrt_f32(float32x2_t a) {
2733   return vsqrt_f32(a);
2734 }
2735
2736 // CHECK-LABEL: @test_vsqrtq_f32(
2737 // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
2738 // CHECK:   [[VSQRT_I:%.*]] = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
2739 // CHECK:   ret <4 x float> [[VSQRT_I]]
2740 float32x4_t test_vsqrtq_f32(float32x4_t a) {
2741   return vsqrtq_f32(a);
2742 }
2743
2744 // CHECK-LABEL: @test_vsqrtq_f64(
2745 // CHECK:   [[TMP0:%.*]] = bitcast <2 x double> %a to <16 x i8>
2746 // CHECK:   [[VSQRT_I:%.*]] = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)
2747 // CHECK:   ret <2 x double> [[VSQRT_I]]
2748 float64x2_t test_vsqrtq_f64(float64x2_t a) {
2749   return vsqrtq_f64(a);
2750 }
2751
2752 // CHECK-LABEL: @test_vcvt_f32_s32(
2753 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
2754 // CHECK:   [[VCVT_I:%.*]] = sitofp <2 x i32> %a to <2 x float>
2755 // CHECK:   ret <2 x float> [[VCVT_I]]
2756 float32x2_t test_vcvt_f32_s32(int32x2_t a) {
2757   return vcvt_f32_s32(a);
2758 }
2759
2760 // CHECK-LABEL: @test_vcvt_f32_u32(
2761 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8>
2762 // CHECK:   [[VCVT_I:%.*]] = uitofp <2 x i32> %a to <2 x float>
2763 // CHECK:   ret <2 x float> [[VCVT_I]]
2764 float32x2_t test_vcvt_f32_u32(uint32x2_t a) {
2765   return vcvt_f32_u32(a);
2766 }
2767
2768 // CHECK-LABEL: @test_vcvtq_f32_s32(
2769 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
2770 // CHECK:   [[VCVT_I:%.*]] = sitofp <4 x i32> %a to <4 x float>
2771 // CHECK:   ret <4 x float> [[VCVT_I]]
2772 float32x4_t test_vcvtq_f32_s32(int32x4_t a) {
2773   return vcvtq_f32_s32(a);
2774 }
2775
2776 // CHECK-LABEL: @test_vcvtq_f32_u32(
2777 // CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8>
2778 // CHECK:   [[VCVT_I:%.*]] = uitofp <4 x i32> %a to <4 x float>
2779 // CHECK:   ret <4 x float> [[VCVT_I]]
2780 float32x4_t test_vcvtq_f32_u32(uint32x4_t a) {
2781   return vcvtq_f32_u32(a);
2782 }
2783
2784 // CHECK-LABEL: @test_vcvtq_f64_s64(
2785 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
2786 // CHECK:   [[VCVT_I:%.*]] = sitofp <2 x i64> %a to <2 x double>
2787 // CHECK:   ret <2 x double> [[VCVT_I]]
2788 float64x2_t test_vcvtq_f64_s64(int64x2_t a) {
2789   return vcvtq_f64_s64(a);
2790 }
2791
2792 // CHECK-LABEL: @test_vcvtq_f64_u64(
2793 // CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8>
2794 // CHECK:   [[VCVT_I:%.*]] = uitofp <2 x i64> %a to <2 x double>
2795 // CHECK:   ret <2 x double> [[VCVT_I]]
2796 float64x2_t test_vcvtq_f64_u64(uint64x2_t a) {
2797   return vcvtq_f64_u64(a);
2798 }