arm64-scalar-test.c revision 651f13cea278ec967336033dd032faef0e9fc2ec
1// REQUIRES: arm64-registered-target
2// RUN: %clang_cc1 -triple arm64-apple-ios7.0  \
3// RUN:   -S -O1 -o - -ffreestanding %s | FileCheck %s
4
5// We're explicitly using arm_neon.h here: some types probably don't match
6// the ACLE definitions, but we want to check current codegen.
7#include <arm_neon.h>
8
9float test_vrsqrtss_f32(float a, float b) {
10// CHECK: test_vrsqrtss_f32
11  return vrsqrtss_f32(a, b);
12// CHECK: frsqrts {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
13}
14
15double test_vrsqrtsd_f64(double a, double b) {
16// CHECK: test_vrsqrtsd_f64
17  return vrsqrtsd_f64(a, b);
18// CHECK: frsqrts {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
19}
20
21int64x1_t test_vrshl_s64(int64x1_t a, int64x1_t b) {
22// CHECK: test_vrshl_s64
23  return vrshl_s64(a, b);
24// CHECK: srshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
25}
26
27uint64x1_t test_vrshl_u64(uint64x1_t a, int64x1_t b) {
28// CHECK: test_vrshl_u64
29  return vrshl_u64(a, b);
30// CHECK: urshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
31}
32
33// CHECK: test_vrshld_s64
34int64_t test_vrshld_s64(int64_t a, int64_t b) {
35  return vrshld_s64(a, b);
36// CHECK: srshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
37}
38
39// CHECK: test_vrshld_u64
40uint64_t test_vrshld_u64(uint64_t a, uint64_t b) {
41  return vrshld_u64(a, b);
42// CHECK: urshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
43}
44
45// CHECK: test_vqrshlb_s8
46int8_t test_vqrshlb_s8(int8_t a, int8_t b) {
47  return vqrshlb_s8(a, b);
48// CHECK: sqrshl.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
49}
50
51// CHECK: test_vqrshlh_s16
52int16_t test_vqrshlh_s16(int16_t a, int16_t b) {
53  return vqrshlh_s16(a, b);
54// CHECK: sqrshl.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
55}
56
57// CHECK: test_vqrshls_s32
58int32_t test_vqrshls_s32(int32_t a, int32_t b) {
59  return vqrshls_s32(a, b);
60// CHECK: sqrshl {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
61}
62
63// CHECK: test_vqrshld_s64
64int64_t test_vqrshld_s64(int64_t a, int64_t b) {
65  return vqrshld_s64(a, b);
66// CHECK: sqrshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
67}
68
69// CHECK: test_vqrshlb_u8
70uint8_t test_vqrshlb_u8(uint8_t a, uint8_t b) {
71  return vqrshlb_u8(a, b);
72// CHECK: uqrshl.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
73}
74
75// CHECK: test_vqrshlh_u16
76uint16_t test_vqrshlh_u16(uint16_t a, uint16_t b) {
77  return vqrshlh_u16(a, b);
78// CHECK: uqrshl.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
79}
80
81// CHECK: test_vqrshls_u32
82uint32_t test_vqrshls_u32(uint32_t a, uint32_t b) {
83  return vqrshls_u32(a, b);
84// CHECK: uqrshl {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
85}
86
87// CHECK: test_vqrshld_u64
88uint64_t test_vqrshld_u64(uint64_t a, uint64_t b) {
89  return vqrshld_u64(a, b);
90// CHECK: uqrshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
91}
92
93// CHECK: test_vqshlb_s8
94int8_t test_vqshlb_s8(int8_t a, int8_t b) {
95  return vqshlb_s8(a, b);
96// CHECK: sqshl.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
97}
98
99// CHECK: test_vqshlh_s16
100int16_t test_vqshlh_s16(int16_t a, int16_t b) {
101  return vqshlh_s16(a, b);
102// CHECK: sqshl.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
103}
104
105// CHECK: test_vqshls_s32
106int32_t test_vqshls_s32(int32_t a, int32_t b) {
107  return vqshls_s32(a, b);
108// CHECK: sqshl {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
109}
110
111// CHECK: test_vqshld_s64
112int64_t test_vqshld_s64(int64_t a, int64_t b) {
113  return vqshld_s64(a, b);
114// CHECK: sqshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
115}
116
117// CHECK: test_vqshlb_u8
118uint8_t test_vqshlb_u8(uint8_t a, uint8_t b) {
119  return vqshlb_u8(a, b);
120// CHECK: uqshl.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
121}
122
123// CHECK: test_vqshlh_u16
124uint16_t test_vqshlh_u16(uint16_t a, uint16_t b) {
125  return vqshlh_u16(a, b);
126// CHECK: uqshl.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
127}
128
129// CHECK: test_vqshls_u32
130uint32_t test_vqshls_u32(uint32_t a, uint32_t b) {
131  return vqshls_u32(a, b);
132// CHECK: uqshl {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
133}
134
135// CHECK: test_vqshld_u64
136uint64_t test_vqshld_u64(uint64_t a, uint64_t b) {
137  return vqshld_u64(a, b);
138// CHECK: uqshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
139}
140
141// CHECK: test_vshld_u64
142uint64_t test_vshld_u64(uint64_t a, uint64_t b) {
143  return vshld_u64(a, b);
144// CHECK: ushl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
145}
146
147// CHECK: test_vshld_s64
148int64_t test_vshld_s64(int64_t a, int64_t b) {
149  return vshld_s64(a, b);
150// CHECK: sshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
151}
152
153// CHECK: test_vqdmullh_s16
154int32_t test_vqdmullh_s16(int16_t a, int16_t b) {
155  return vqdmullh_s16(a, b);
156// CHECK: sqdmull.4s {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
157}
158
159// CHECK: test_vqdmulls_s32
160int64_t test_vqdmulls_s32(int32_t a, int32_t b) {
161  return vqdmulls_s32(a, b);
162// CHECK: sqdmull {{d[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
163}
164
165// CHECK: test_vqaddb_s8
166int8_t test_vqaddb_s8(int8_t a, int8_t b) {
167  return vqaddb_s8(a, b);
168// CHECK: sqadd.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
169}
170
171// CHECK: test_vqaddh_s16
172int16_t test_vqaddh_s16(int16_t a, int16_t b) {
173  return vqaddh_s16(a, b);
174// CHECK: sqadd.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
175}
176
177// CHECK: test_vqadds_s32
178int32_t test_vqadds_s32(int32_t a, int32_t b) {
179  return vqadds_s32(a, b);
180// CHECK: sqadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
181}
182
183// CHECK: test_vqaddd_s64
184int64_t test_vqaddd_s64(int64_t a, int64_t b) {
185  return vqaddd_s64(a, b);
186// CHECK: sqadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
187}
188
189// CHECK: test_vqaddb_u8
190uint8_t test_vqaddb_u8(uint8_t a, uint8_t b) {
191  return vqaddb_u8(a, b);
192// CHECK: uqadd.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
193}
194
195// CHECK: test_vqaddh_u16
196uint16_t test_vqaddh_u16(uint16_t a, uint16_t b) {
197  return vqaddh_u16(a, b);
198// CHECK: uqadd.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
199}
200
201// CHECK: test_vqadds_u32
202uint32_t test_vqadds_u32(uint32_t a, uint32_t b) {
203  return vqadds_u32(a, b);
204// CHECK: uqadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
205}
206
207// CHECK: test_vqaddd_u64
208uint64_t test_vqaddd_u64(uint64_t a, uint64_t b) {
209  return vqaddd_u64(a, b);
210// CHECK: uqadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
211}
212
213// CHECK: test_vqsubb_s8
214int8_t test_vqsubb_s8(int8_t a, int8_t b) {
215  return vqsubb_s8(a, b);
216// CHECK: sqsub.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
217}
218
219// CHECK: test_vqsubh_s16
220int16_t test_vqsubh_s16(int16_t a, int16_t b) {
221  return vqsubh_s16(a, b);
222// CHECK: sqsub.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
223}
224
225// CHECK: test_vqsubs_s32
226int32_t test_vqsubs_s32(int32_t a, int32_t b) {
227  return vqsubs_s32(a, b);
228// CHECK: sqsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
229}
230
231// CHECK: test_vqsubd_s64
232int64_t test_vqsubd_s64(int64_t a, int64_t b) {
233  return vqsubd_s64(a, b);
234// CHECK: sqsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
235}
236
237// CHECK: test_vqsubb_u8
238uint8_t test_vqsubb_u8(uint8_t a, uint8_t b) {
239  return vqsubb_u8(a, b);
240// CHECK: uqsub.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
241}
242
243// CHECK: test_vqsubh_u16
244uint16_t test_vqsubh_u16(uint16_t a, uint16_t b) {
245  return vqsubh_u16(a, b);
246// CHECK: uqsub.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
247}
248
249// CHECK: test_vqsubs_u32
250uint32_t test_vqsubs_u32(uint32_t a, uint32_t b) {
251  return vqsubs_u32(a, b);
252// CHECK: uqsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
253}
254
255// CHECK: test_vqsubd_u64
256uint64_t test_vqsubd_u64(uint64_t a, uint64_t b) {
257  return vqsubd_u64(a, b);
258// CHECK: uqsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
259}
260
261// CHECK: test_vqmovnh_s16
262int8_t test_vqmovnh_s16(int16_t a) {
263  return vqmovnh_s16(a);
264// CHECK: sqxtn.8b {{v[0-9]+}}, {{v[0-9]+}}
265}
266
267// CHECK: test_vqmovnh_u16
268uint8_t test_vqmovnh_u16(uint16_t a) {
269  return vqmovnh_u16(a);
270// CHECK: uqxtn.8b {{v[0-9]+}}, {{v[0-9]+}}
271}
272
273// CHECK: test_vqmovns_s32
274int16_t test_vqmovns_s32(int32_t a) {
275  return vqmovns_s32(a);
276// CHECK: sqxtn.4h {{v[0-9]+}}, {{v[0-9]+}}
277}
278
279// CHECK: test_vqmovns_u32
280uint16_t test_vqmovns_u32(uint32_t a) {
281  return vqmovns_u32(a);
282// CHECK: uqxtn.4h {{v[0-9]+}}, {{v[0-9]+}}
283}
284
285// CHECK: test_vqmovnd_s64
286int32_t test_vqmovnd_s64(int64_t a) {
287  return vqmovnd_s64(a);
288// CHECK: sqxtn {{s[0-9]+}}, {{d[0-9]+}}
289}
290
291// CHECK: test_vqmovnd_u64
292uint32_t test_vqmovnd_u64(uint64_t a) {
293  return vqmovnd_u64(a);
294// CHECK: uqxtn {{s[0-9]+}}, {{d[0-9]+}}
295}
296
297// CHECK: test_vqmovunh_s16
298int8_t test_vqmovunh_s16(int16_t a) {
299  return vqmovunh_s16(a);
300// CHECK: sqxtun.8b {{v[0-9]+}}, {{v[0-9]+}}
301}
302
303// CHECK: test_vqmovuns_s32
304int16_t test_vqmovuns_s32(int32_t a) {
305  return vqmovuns_s32(a);
306// CHECK: sqxtun.4h {{v[0-9]+}}, {{v[0-9]+}}
307}
308
309// CHECK: test_vqmovund_s64
310int32_t test_vqmovund_s64(int64_t a) {
311  return vqmovund_s64(a);
312// CHECK: sqxtun {{s[0-9]+}}, {{d[0-9]+}}
313}
314
315// CHECK: test_vqabsb_s8
316int8_t test_vqabsb_s8(int8_t a) {
317  return vqabsb_s8(a);
318// CHECK: sqabs.8b {{v[0-9]+}}, {{v[0-9]+}}
319}
320
321// CHECK: test_vqabsh_s16
322int16_t test_vqabsh_s16(int16_t a) {
323  return vqabsh_s16(a);
324// CHECK: sqabs.4h {{v[0-9]+}}, {{v[0-9]+}}
325}
326
327// CHECK: test_vqabss_s32
328int32_t test_vqabss_s32(int32_t a) {
329  return vqabss_s32(a);
330// CHECK: sqabs {{s[0-9]+}}, {{s[0-9]+}}
331}
332
333// CHECK: test_vqabsd_s64
334int64_t test_vqabsd_s64(int64_t a) {
335  return vqabsd_s64(a);
336// CHECK: sqabs {{d[0-9]+}}, {{d[0-9]+}}
337}
338
339// CHECK: test_vqnegb_s8
340int8_t test_vqnegb_s8(int8_t a) {
341  return vqnegb_s8(a);
342// CHECK: sqneg.8b {{v[0-9]+}}, {{v[0-9]+}}
343}
344
345// CHECK: test_vqnegh_s16
346int16_t test_vqnegh_s16(int16_t a) {
347  return vqnegh_s16(a);
348// CHECK: sqneg.4h {{v[0-9]+}}, {{v[0-9]+}}
349}
350
351// CHECK: test_vqnegs_s32
352int32_t test_vqnegs_s32(int32_t a) {
353  return vqnegs_s32(a);
354// CHECK: sqneg {{s[0-9]+}}, {{s[0-9]+}}
355}
356
357// CHECK: test_vqnegd_s64
358int64_t test_vqnegd_s64(int64_t a) {
359  return vqnegd_s64(a);
360// CHECK: sqneg {{d[0-9]+}}, {{d[0-9]+}}
361}
362
363// CHECK: test_vcvts_n_f32_s32
364float32_t test_vcvts_n_f32_s32(int32_t a) {
365  return vcvts_n_f32_s32(a, 3);
366// CHECK: scvtf {{s[0-9]+}}, {{s[0-9]+}}, #3
367}
368
369// CHECK: test_vcvts_n_f32_u32
370float32_t test_vcvts_n_f32_u32(uint32_t a) {
371  return vcvts_n_f32_u32(a, 3);
372// CHECK: ucvtf {{s[0-9]+}}, {{s[0-9]+}}, #3
373}
374
375// CHECK: test_vcvtd_n_f64_s64
376float64_t test_vcvtd_n_f64_s64(int64_t a) {
377  return vcvtd_n_f64_s64(a, 3);
378// CHECK: scvtf {{d[0-9]+}}, {{d[0-9]+}}, #3
379}
380
381// CHECK: test_vcvtd_n_f64_u64
382float64_t test_vcvtd_n_f64_u64(uint64_t a) {
383  return vcvtd_n_f64_u64(a, 3);
384// CHECK: ucvtf {{d[0-9]+}}, {{d[0-9]+}}, #3
385}
386
387// CHECK: test_vcvts_n_s32_f32
388int32_t test_vcvts_n_s32_f32(float32_t a) {
389  return vcvts_n_s32_f32(a, 3);
390// CHECK: fcvtzs {{s[0-9]+}}, {{s[0-9]+}}, #3
391}
392
393// CHECK: test_vcvts_n_u32_f32
394uint32_t test_vcvts_n_u32_f32(float32_t a) {
395  return vcvts_n_u32_f32(a, 3);
396// CHECK: fcvtzu {{s[0-9]+}}, {{s[0-9]+}}, #3
397}
398
399// CHECK: test_vcvtd_n_s64_f64
400int64_t test_vcvtd_n_s64_f64(float64_t a) {
401  return vcvtd_n_s64_f64(a, 3);
402// CHECK: fcvtzs {{d[0-9]+}}, {{d[0-9]+}}, #3
403}
404
405// CHECK: test_vcvtd_n_u64_f64
406uint64_t test_vcvtd_n_u64_f64(float64_t a) {
407  return vcvtd_n_u64_f64(a, 3);
408// CHECK: fcvtzu {{d[0-9]+}}, {{d[0-9]+}}, #3
409}
410
411// CHECK: test_vcvtas_s32_f32
412int32_t test_vcvtas_s32_f32(float32_t a) {
413  return vcvtas_s32_f32(a);
414// CHECK: fcvtas {{w[0-9]+}}, {{s[0-9]+}}
415}
416
417// CHECK: test_vcvtas_u32_f32
418uint32_t test_vcvtas_u32_f32(float32_t a) {
419  return vcvtas_u32_f32(a);
420// CHECK: fcvtau {{w[0-9]+}}, {{s[0-9]+}}
421}
422
423// CHECK: test_vcvtad_s64_f64
424int64_t test_vcvtad_s64_f64(float64_t a) {
425  return vcvtad_s64_f64(a);
426// CHECK: fcvtas {{x[0-9]+}}, {{d[0-9]+}}
427}
428
429// CHECK: test_vcvtad_u64_f64
430uint64_t test_vcvtad_u64_f64(float64_t a) {
431  return vcvtad_u64_f64(a);
432// CHECK: fcvtau {{x[0-9]+}}, {{d[0-9]+}}
433}
434
435// CHECK: test_vcvtms_s32_f32
436int32_t test_vcvtms_s32_f32(float32_t a) {
437  return vcvtms_s32_f32(a);
438// CHECK: fcvtms {{w[0-9]+}}, {{s[0-9]+}}
439}
440
441// CHECK: test_vcvtms_u32_f32
442uint32_t test_vcvtms_u32_f32(float32_t a) {
443  return vcvtms_u32_f32(a);
444// CHECK: fcvtmu {{w[0-9]+}}, {{s[0-9]+}}
445}
446
447// CHECK: test_vcvtmd_s64_f64
448int64_t test_vcvtmd_s64_f64(float64_t a) {
449  return vcvtmd_s64_f64(a);
450// CHECK: fcvtms {{x[0-9]+}}, {{d[0-9]+}}
451}
452
453// CHECK: test_vcvtmd_u64_f64
454uint64_t test_vcvtmd_u64_f64(float64_t a) {
455  return vcvtmd_u64_f64(a);
456// CHECK: fcvtmu {{x[0-9]+}}, {{d[0-9]+}}
457}
458
459// CHECK: test_vcvtns_s32_f32
460int32_t test_vcvtns_s32_f32(float32_t a) {
461  return vcvtns_s32_f32(a);
462// CHECK: fcvtns {{w[0-9]+}}, {{s[0-9]+}}
463}
464
465// CHECK: test_vcvtns_u32_f32
466uint32_t test_vcvtns_u32_f32(float32_t a) {
467  return vcvtns_u32_f32(a);
468// CHECK: fcvtnu {{w[0-9]+}}, {{s[0-9]+}}
469}
470
471// CHECK: test_vcvtnd_s64_f64
472int64_t test_vcvtnd_s64_f64(float64_t a) {
473  return vcvtnd_s64_f64(a);
474// CHECK: fcvtns {{x[0-9]+}}, {{d[0-9]+}}
475}
476
477// CHECK: test_vcvtnd_u64_f64
478uint64_t test_vcvtnd_u64_f64(float64_t a) {
479  return vcvtnd_u64_f64(a);
480// CHECK: fcvtnu {{x[0-9]+}}, {{d[0-9]+}}
481}
482
483// CHECK: test_vcvtps_s32_f32
484int32_t test_vcvtps_s32_f32(float32_t a) {
485  return vcvtps_s32_f32(a);
486// CHECK: fcvtps {{w[0-9]+}}, {{s[0-9]+}}
487}
488
489// CHECK: test_vcvtps_u32_f32
490uint32_t test_vcvtps_u32_f32(float32_t a) {
491  return vcvtps_u32_f32(a);
492// CHECK: fcvtpu {{w[0-9]+}}, {{s[0-9]+}}
493}
494
495// CHECK: test_vcvtpd_s64_f64
496int64_t test_vcvtpd_s64_f64(float64_t a) {
497  return vcvtpd_s64_f64(a);
498// CHECK: fcvtps {{x[0-9]+}}, {{d[0-9]+}}
499}
500
501// CHECK: test_vcvtpd_u64_f64
502uint64_t test_vcvtpd_u64_f64(float64_t a) {
503  return vcvtpd_u64_f64(a);
504// CHECK: fcvtpu {{x[0-9]+}}, {{d[0-9]+}}
505}
506
507// CHECK: test_vcvtxd_f32_f64
508float32_t test_vcvtxd_f32_f64(float64_t a) {
509  return vcvtxd_f32_f64(a);
510// CHECK: fcvtxn {{s[0-9]+}}, {{d[0-9]+}}
511}
512
513// CHECK: test_vabds_f32
514float32_t test_vabds_f32(float32_t a, float32_t b) {
515  return vabds_f32(a, b);
516  // CHECK: fabd {{s[0-9]+}}, {{s[0-9]+}}
517}
518
519// CHECK: test_vabdd_f64
520float64_t test_vabdd_f64(float64_t a, float64_t b) {
521  return vabdd_f64(a, b);
522  // CHECK: fabd {{d[0-9]+}}, {{d[0-9]+}}
523}
524
525// CHECK: test_vmulxs_f32
526float32_t test_vmulxs_f32(float32_t a, float32_t b) {
527  return vmulxs_f32(a, b);
528  // CHECK: fmulx {{s[0-9]+}}, {{s[0-9]+}}
529}
530
531// CHECK: test_vmulxd_f64
532float64_t test_vmulxd_f64(float64_t a, float64_t b) {
533  return vmulxd_f64(a, b);
534  // CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}
535}
536