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