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
test_vaddlv_s8(int8x8_t a)9 int16_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
test_vaddlv_s16(int16x4_t a)15 int32_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
test_vaddlv_u8(uint8x8_t a)21 uint16_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
test_vaddlv_u16(uint16x4_t a)27 uint32_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
test_vaddlvq_s8(int8x16_t a)33 int16_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
test_vaddlvq_s16(int16x8_t a)39 int32_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
test_vaddlvq_s32(int32x4_t a)45 int64_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
test_vaddlvq_u8(uint8x16_t a)51 uint16_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
test_vaddlvq_u16(uint16x8_t a)57 uint32_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
test_vaddlvq_u32(uint32x4_t a)63 uint64_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
test_vmaxv_s8(int8x8_t a)69 int8_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
test_vmaxv_s16(int16x4_t a)75 int16_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
test_vmaxv_u8(uint8x8_t a)81 uint8_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
test_vmaxv_u16(uint16x4_t a)87 uint16_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
test_vmaxvq_s8(int8x16_t a)93 int8_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
test_vmaxvq_s16(int16x8_t a)99 int16_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
test_vmaxvq_s32(int32x4_t a)105 int32_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
test_vmaxvq_u8(uint8x16_t a)111 uint8_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
test_vmaxvq_u16(uint16x8_t a)117 uint16_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
test_vmaxvq_u32(uint32x4_t a)123 uint32_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
test_vminv_s8(int8x8_t a)129 int8_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
test_vminv_s16(int16x4_t a)135 int16_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
test_vminv_u8(uint8x8_t a)141 uint8_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
test_vminv_u16(uint16x4_t a)147 uint16_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
test_vminvq_s8(int8x16_t a)153 int8_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
test_vminvq_s16(int16x8_t a)159 int16_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
test_vminvq_s32(int32x4_t a)165 int32_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
test_vminvq_u8(uint8x16_t a)171 uint8_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
test_vminvq_u16(uint16x8_t a)177 uint16_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
test_vminvq_u32(uint32x4_t a)183 uint32_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
test_vaddv_s8(int8x8_t a)189 int8_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
test_vaddv_s16(int16x4_t a)195 int16_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
test_vaddv_u8(uint8x8_t a)201 uint8_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
test_vaddv_u16(uint16x4_t a)207 uint16_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
test_vaddvq_s8(int8x16_t a)213 int8_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
test_vaddvq_s16(int16x8_t a)219 int16_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
test_vaddvq_s32(int32x4_t a)225 int32_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
test_vaddvq_u8(uint8x16_t a)231 uint8_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
test_vaddvq_u16(uint16x8_t a)237 uint16_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
test_vaddvq_u32(uint32x4_t a)243 uint32_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
test_vmaxvq_f32(float32x4_t a)249 float32_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
test_vminvq_f32(float32x4_t a)255 float32_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
test_vmaxnmvq_f32(float32x4_t a)261 float32_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
test_vminnmvq_f32(float32x4_t a)267 float32_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