1// REQUIRES: aarch64-registered-target
2// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon \
3// RUN:   -ffp-contract=fast -S -O3 -o - %s | FileCheck %s
4
5// Test new aarch64 intrinsics and types
6
7#include <arm_neon.h>
8
9int16_t test_vaddlv_s8(int8x8_t a) {
10  // CHECK-LABEL: test_vaddlv_s8
11  return vaddlv_s8(a);
12  // CHECK: saddlv {{h[0-9]+}}, {{v[0-9]+}}.8b
13}
14
15int32_t test_vaddlv_s16(int16x4_t a) {
16  // CHECK-LABEL: test_vaddlv_s16
17  return vaddlv_s16(a);
18  // CHECK: saddlv {{s[0-9]+}}, {{v[0-9]+}}.4h
19}
20
21uint16_t test_vaddlv_u8(uint8x8_t a) {
22  // CHECK-LABEL: test_vaddlv_u8
23  return vaddlv_u8(a);
24  // CHECK: uaddlv {{h[0-9]+}}, {{v[0-9]+}}.8b
25}
26
27uint32_t test_vaddlv_u16(uint16x4_t a) {
28  // CHECK-LABEL: test_vaddlv_u16
29  return vaddlv_u16(a);
30  // CHECK: uaddlv {{s[0-9]+}}, {{v[0-9]+}}.4h
31}
32
33int16_t test_vaddlvq_s8(int8x16_t a) {
34  // CHECK-LABEL: test_vaddlvq_s8
35  return vaddlvq_s8(a);
36  // CHECK: saddlv {{h[0-9]+}}, {{v[0-9]+}}.16b
37}
38
39int32_t test_vaddlvq_s16(int16x8_t a) {
40  // CHECK-LABEL: test_vaddlvq_s16
41  return vaddlvq_s16(a);
42  // CHECK: saddlv {{s[0-9]+}}, {{v[0-9]+}}.8h
43}
44
45int64_t test_vaddlvq_s32(int32x4_t a) {
46  // CHECK-LABEL: test_vaddlvq_s32
47  return vaddlvq_s32(a);
48  // CHECK: saddlv {{d[0-9]+}}, {{v[0-9]+}}.4s
49}
50
51uint16_t test_vaddlvq_u8(uint8x16_t a) {
52  // CHECK-LABEL: test_vaddlvq_u8
53  return vaddlvq_u8(a);
54  // CHECK: uaddlv {{h[0-9]+}}, {{v[0-9]+}}.16b
55}
56
57uint32_t test_vaddlvq_u16(uint16x8_t a) {
58  // CHECK-LABEL: test_vaddlvq_u16
59  return vaddlvq_u16(a);
60  // CHECK: uaddlv {{s[0-9]+}}, {{v[0-9]+}}.8h
61}
62
63uint64_t test_vaddlvq_u32(uint32x4_t a) {
64  // CHECK-LABEL: test_vaddlvq_u32
65  return vaddlvq_u32(a);
66  // CHECK: uaddlv {{d[0-9]+}}, {{v[0-9]+}}.4s
67}
68
69int8_t test_vmaxv_s8(int8x8_t a) {
70  // CHECK-LABEL: test_vmaxv_s8
71  return vmaxv_s8(a);
72  // CHECK: smaxv {{b[0-9]+}}, {{v[0-9]+}}.8b
73}
74
75int16_t test_vmaxv_s16(int16x4_t a) {
76  // CHECK-LABEL: test_vmaxv_s16
77  return vmaxv_s16(a);
78  // CHECK: smaxv {{h[0-9]+}}, {{v[0-9]+}}.4h
79}
80
81uint8_t test_vmaxv_u8(uint8x8_t a) {
82  // CHECK-LABEL: test_vmaxv_u8
83  return vmaxv_u8(a);
84  // CHECK: umaxv {{b[0-9]+}}, {{v[0-9]+}}.8b
85}
86
87uint16_t test_vmaxv_u16(uint16x4_t a) {
88  // CHECK-LABEL: test_vmaxv_u16
89  return vmaxv_u16(a);
90  // CHECK: umaxv {{h[0-9]+}}, {{v[0-9]+}}.4h
91}
92
93int8_t test_vmaxvq_s8(int8x16_t a) {
94  // CHECK-LABEL: test_vmaxvq_s8
95  return vmaxvq_s8(a);
96  // CHECK: smaxv {{b[0-9]+}}, {{v[0-9]+}}.16b
97}
98
99int16_t test_vmaxvq_s16(int16x8_t a) {
100  // CHECK-LABEL: test_vmaxvq_s16
101  return vmaxvq_s16(a);
102  // CHECK: smaxv {{h[0-9]+}}, {{v[0-9]+}}.8h
103}
104
105int32_t test_vmaxvq_s32(int32x4_t a) {
106  // CHECK-LABEL: test_vmaxvq_s32
107  return vmaxvq_s32(a);
108  // CHECK: smaxv {{s[0-9]+}}, {{v[0-9]+}}.4s
109}
110
111uint8_t test_vmaxvq_u8(uint8x16_t a) {
112  // CHECK-LABEL: test_vmaxvq_u8
113  return vmaxvq_u8(a);
114  // CHECK: umaxv {{b[0-9]+}}, {{v[0-9]+}}.16b
115}
116
117uint16_t test_vmaxvq_u16(uint16x8_t a) {
118  // CHECK-LABEL: test_vmaxvq_u16
119  return vmaxvq_u16(a);
120  // CHECK: umaxv {{h[0-9]+}}, {{v[0-9]+}}.8h
121}
122
123uint32_t test_vmaxvq_u32(uint32x4_t a) {
124  // CHECK-LABEL: test_vmaxvq_u32
125  return vmaxvq_u32(a);
126  // CHECK: umaxv {{s[0-9]+}}, {{v[0-9]+}}.4s
127}
128
129int8_t test_vminv_s8(int8x8_t a) {
130  // CHECK-LABEL: test_vminv_s8
131  return vminv_s8(a);
132  // CHECK: sminv {{b[0-9]+}}, {{v[0-9]+}}.8b
133}
134
135int16_t test_vminv_s16(int16x4_t a) {
136  // CHECK-LABEL: test_vminv_s16
137  return vminv_s16(a);
138  // CHECK: sminv {{h[0-9]+}}, {{v[0-9]+}}.4h
139}
140
141uint8_t test_vminv_u8(uint8x8_t a) {
142  // CHECK-LABEL: test_vminv_u8
143  return vminv_u8(a);
144  // CHECK: uminv {{b[0-9]+}}, {{v[0-9]+}}.8b
145}
146
147uint16_t test_vminv_u16(uint16x4_t a) {
148  // CHECK-LABEL: test_vminv_u16
149  return vminv_u16(a);
150  // CHECK: uminv {{h[0-9]+}}, {{v[0-9]+}}.4h
151}
152
153int8_t test_vminvq_s8(int8x16_t a) {
154  // CHECK-LABEL: test_vminvq_s8
155  return vminvq_s8(a);
156  // CHECK: sminv {{b[0-9]+}}, {{v[0-9]+}}.16b
157}
158
159int16_t test_vminvq_s16(int16x8_t a) {
160  // CHECK-LABEL: test_vminvq_s16
161  return vminvq_s16(a);
162  // CHECK: sminv {{h[0-9]+}}, {{v[0-9]+}}.8h
163}
164
165int32_t test_vminvq_s32(int32x4_t a) {
166  // CHECK-LABEL: test_vminvq_s32
167  return vminvq_s32(a);
168  // CHECK: sminv {{s[0-9]+}}, {{v[0-9]+}}.4s
169}
170
171uint8_t test_vminvq_u8(uint8x16_t a) {
172  // CHECK-LABEL: test_vminvq_u8
173  return vminvq_u8(a);
174  // CHECK: uminv {{b[0-9]+}}, {{v[0-9]+}}.16b
175}
176
177uint16_t test_vminvq_u16(uint16x8_t a) {
178  // CHECK-LABEL: test_vminvq_u16
179  return vminvq_u16(a);
180  // CHECK: uminv {{h[0-9]+}}, {{v[0-9]+}}.8h
181}
182
183uint32_t test_vminvq_u32(uint32x4_t a) {
184  // CHECK-LABEL: test_vminvq_u32
185  return vminvq_u32(a);
186  // CHECK: uminv {{s[0-9]+}}, {{v[0-9]+}}.4s
187}
188
189int8_t test_vaddv_s8(int8x8_t a) {
190  // CHECK-LABEL: test_vaddv_s8
191  return vaddv_s8(a);
192  // CHECK: addv {{b[0-9]+}}, {{v[0-9]+}}.8b
193}
194
195int16_t test_vaddv_s16(int16x4_t a) {
196  // CHECK-LABEL: test_vaddv_s16
197  return vaddv_s16(a);
198  // CHECK: addv {{h[0-9]+}}, {{v[0-9]+}}.4h
199}
200
201uint8_t test_vaddv_u8(uint8x8_t a) {
202  // CHECK-LABEL: test_vaddv_u8
203  return vaddv_u8(a);
204  // CHECK: addv {{b[0-9]+}}, {{v[0-9]+}}.8b
205}
206
207uint16_t test_vaddv_u16(uint16x4_t a) {
208  // CHECK-LABEL: test_vaddv_u16
209  return vaddv_u16(a);
210  // CHECK: addv {{h[0-9]+}}, {{v[0-9]+}}.4h
211}
212
213int8_t test_vaddvq_s8(int8x16_t a) {
214  // CHECK-LABEL: test_vaddvq_s8
215  return vaddvq_s8(a);
216  // CHECK: addv {{b[0-9]+}}, {{v[0-9]+}}.16b
217}
218
219int16_t test_vaddvq_s16(int16x8_t a) {
220  // CHECK-LABEL: test_vaddvq_s16
221  return vaddvq_s16(a);
222  // CHECK: addv {{h[0-9]+}}, {{v[0-9]+}}.8h
223}
224
225int32_t test_vaddvq_s32(int32x4_t a) {
226  // CHECK-LABEL: test_vaddvq_s32
227  return vaddvq_s32(a);
228  // CHECK: addv {{s[0-9]+}}, {{v[0-9]+}}.4s
229}
230
231uint8_t test_vaddvq_u8(uint8x16_t a) {
232  // CHECK-LABEL: test_vaddvq_u8
233  return vaddvq_u8(a);
234  // CHECK: addv {{b[0-9]+}}, {{v[0-9]+}}.16b
235}
236
237uint16_t test_vaddvq_u16(uint16x8_t a) {
238  // CHECK-LABEL: test_vaddvq_u16
239  return vaddvq_u16(a);
240  // CHECK: addv {{h[0-9]+}}, {{v[0-9]+}}.8h
241}
242
243uint32_t test_vaddvq_u32(uint32x4_t a) {
244  // CHECK-LABEL: test_vaddvq_u32
245  return vaddvq_u32(a);
246  // CHECK: addv {{s[0-9]+}}, {{v[0-9]+}}.4s
247}
248
249float32_t test_vmaxvq_f32(float32x4_t a) {
250  // CHECK-LABEL: test_vmaxvq_f32
251  return vmaxvq_f32(a);
252  // CHECK: fmaxv {{s[0-9]+}}, {{v[0-9]+}}.4s
253}
254
255float32_t test_vminvq_f32(float32x4_t a) {
256  // CHECK-LABEL: test_vminvq_f32
257  return vminvq_f32(a);
258  // CHECK: fminv {{s[0-9]+}}, {{v[0-9]+}}.4s
259}
260
261float32_t test_vmaxnmvq_f32(float32x4_t a) {
262  // CHECK-LABEL: test_vmaxnmvq_f32
263  return vmaxnmvq_f32(a);
264  // CHECK: fmaxnmv {{s[0-9]+}}, {{v[0-9]+}}.4s
265}
266
267float32_t test_vminnmvq_f32(float32x4_t a) {
268  // CHECK-LABEL: test_vminnmvq_f32
269  return vminnmvq_f32(a);
270  // CHECK: fminnmv {{s[0-9]+}}, {{v[0-9]+}}.4s
271}
272