1 // REQUIRES: aarch64-registered-target
2 // RUN: %clang_cc1 -triple arm64-apple-darwin -target-feature +neon \
3 // RUN: -ffp-contract=fast -S -O3 -o - %s | FileCheck %s
4
5 #include <arm_neon.h>
6
test_vget_lane_u8(uint8x8_t a)7 uint8_t test_vget_lane_u8(uint8x8_t a) {
8 // CHECK-LABEL: test_vget_lane_u8:
9 // CHECK-NEXT: umov.b w0, v0[7]
10 // CHECK-NEXT: ret
11 return vget_lane_u8(a, 7);
12 }
13
test_vget_lane_u16(uint16x4_t a)14 uint16_t test_vget_lane_u16(uint16x4_t a) {
15 // CHECK-LABEL: test_vget_lane_u16:
16 // CHECK-NEXT: umov.h w0, v0[3]
17 // CHECK-NEXT: ret
18 return vget_lane_u16(a, 3);
19 }
20
test_vget_lane_u32(uint32x2_t a)21 uint32_t test_vget_lane_u32(uint32x2_t a) {
22 // CHECK-LABEL: test_vget_lane_u32:
23 // CHECK-NEXT: mov.s w0, v0[1]
24 // CHECK-NEXT: ret
25 return vget_lane_u32(a, 1);
26 }
27
test_vget_lane_s8(int8x8_t a)28 int8_t test_vget_lane_s8(int8x8_t a) {
29 // CHECK-LABEL: test_vget_lane_s8:
30 // CHECK-NEXT: umov.b w0, v0[7]
31 // CHECK-NEXT: ret
32 return vget_lane_s8(a, 7);
33 }
34
test_vget_lane_s16(int16x4_t a)35 int16_t test_vget_lane_s16(int16x4_t a) {
36 // CHECK-LABEL: test_vget_lane_s16:
37 // CHECK-NEXT: umov.h w0, v0[3]
38 // CHECK-NEXT: ret
39 return vget_lane_s16(a, 3);
40 }
41
test_vget_lane_s32(int32x2_t a)42 int32_t test_vget_lane_s32(int32x2_t a) {
43 // CHECK-LABEL: test_vget_lane_s32:
44 // CHECK-NEXT: mov.s w0, v0[1]
45 // CHECK-NEXT: ret
46 return vget_lane_s32(a, 1);
47 }
48
test_vget_lane_p8(poly8x8_t a)49 poly8_t test_vget_lane_p8(poly8x8_t a) {
50 // CHECK-LABEL: test_vget_lane_p8:
51 // CHECK-NEXT: umov.b w0, v0[7]
52 // CHECK-NEXT: ret
53 return vget_lane_p8(a, 7);
54 }
55
test_vget_lane_p16(poly16x4_t a)56 poly16_t test_vget_lane_p16(poly16x4_t a) {
57 // CHECK-LABEL: test_vget_lane_p16:
58 // CHECK-NEXT: umov.h w0, v0[3]
59 // CHECK-NEXT: ret
60 return vget_lane_p16(a, 3);
61 }
62
test_vget_lane_f32(float32x2_t a)63 float32_t test_vget_lane_f32(float32x2_t a) {
64 // CHECK-LABEL: test_vget_lane_f32:
65 // CHECK-NEXT: mov s0, v0[1]
66 // CHECK-NEXT: ret
67 return vget_lane_f32(a, 1);
68 }
69
test_vget_lane_f16(float16x4_t a)70 float32_t test_vget_lane_f16(float16x4_t a) {
71 // CHECK-LABEL: test_vget_lane_f16:
72 // CHECK-NEXT: umov.h w8, v0[1]
73 // CHECK-NEXT: fmov s0, w8
74 // CHECK-NEXT: fcvt s0, h0
75 // CHECK-NEXT: ret
76 return vget_lane_f16(a, 1);
77 }
78
test_vgetq_lane_u8(uint8x16_t a)79 uint8_t test_vgetq_lane_u8(uint8x16_t a) {
80 // CHECK-LABEL: test_vgetq_lane_u8:
81 // CHECK-NEXT: umov.b w0, v0[15]
82 // CHECK-NEXT: ret
83 return vgetq_lane_u8(a, 15);
84 }
85
test_vgetq_lane_u16(uint16x8_t a)86 uint16_t test_vgetq_lane_u16(uint16x8_t a) {
87 // CHECK-LABEL: test_vgetq_lane_u16:
88 // CHECK-NEXT: umov.h w0, v0[7]
89 // CHECK-NEXT: ret
90 return vgetq_lane_u16(a, 7);
91 }
92
test_vgetq_lane_u32(uint32x4_t a)93 uint32_t test_vgetq_lane_u32(uint32x4_t a) {
94 // CHECK-LABEL: test_vgetq_lane_u32:
95 // CHECK-NEXT: mov.s w0, v0[3]
96 // CHECK-NEXT: ret
97 return vgetq_lane_u32(a, 3);
98 }
99
test_vgetq_lane_s8(int8x16_t a)100 int8_t test_vgetq_lane_s8(int8x16_t a) {
101 // CHECK-LABEL: test_vgetq_lane_s8:
102 // CHECK-NEXT: umov.b w0, v0[15]
103 // CHECK-NEXT: ret
104 return vgetq_lane_s8(a, 15);
105 }
106
test_vgetq_lane_s16(int16x8_t a)107 int16_t test_vgetq_lane_s16(int16x8_t a) {
108 // CHECK-LABEL: test_vgetq_lane_s16:
109 // CHECK-NEXT: umov.h w0, v0[7]
110 // CHECK-NEXT: ret
111 return vgetq_lane_s16(a, 7);
112 }
113
test_vgetq_lane_s32(int32x4_t a)114 int32_t test_vgetq_lane_s32(int32x4_t a) {
115 // CHECK-LABEL: test_vgetq_lane_s32:
116 // CHECK-NEXT: mov.s w0, v0[3]
117 // CHECK-NEXT: ret
118 return vgetq_lane_s32(a, 3);
119 }
120
test_vgetq_lane_p8(poly8x16_t a)121 poly8_t test_vgetq_lane_p8(poly8x16_t a) {
122 // CHECK-LABEL: test_vgetq_lane_p8:
123 // CHECK-NEXT: umov.b w0, v0[15]
124 // CHECK-NEXT: ret
125 return vgetq_lane_p8(a, 15);
126 }
127
test_vgetq_lane_p16(poly16x8_t a)128 poly16_t test_vgetq_lane_p16(poly16x8_t a) {
129 // CHECK-LABEL: test_vgetq_lane_p16:
130 // CHECK-NEXT: umov.h w0, v0[7]
131 // CHECK-NEXT: ret
132 return vgetq_lane_p16(a, 7);
133 }
134
test_vgetq_lane_f32(float32x4_t a)135 float32_t test_vgetq_lane_f32(float32x4_t a) {
136 // CHECK-LABEL: test_vgetq_lane_f32:
137 // CHECK-NEXT: mov s0, v0[3]
138 // CHECK-NEXT: ret
139 return vgetq_lane_f32(a, 3);
140 }
141
test_vgetq_lane_f16(float16x8_t a)142 float32_t test_vgetq_lane_f16(float16x8_t a) {
143 // CHECK-LABEL: test_vgetq_lane_f16:
144 // CHECK-NEXT: umov.h w8, v0[3]
145 // CHECK-NEXT: fmov s0, w8
146 // CHECK-NEXT: fcvt s0, h0
147 // CHECK-NEXT: ret
148 return vgetq_lane_f16(a, 3);
149 }
150
test_vget_lane_s64(int64x1_t a)151 int64_t test_vget_lane_s64(int64x1_t a) {
152 // CHECK-LABEL: test_vget_lane_s64:
153 // CHECK-NEXT: fmov x0, d0
154 // CHECK-NEXT: ret
155 return vget_lane_s64(a, 0);
156 }
157
test_vget_lane_u64(uint64x1_t a)158 uint64_t test_vget_lane_u64(uint64x1_t a) {
159 // CHECK-LABEL: test_vget_lane_u64:
160 // CHECK-NEXT: fmov x0, d0
161 // CHECK-NEXT: ret
162 return vget_lane_u64(a, 0);
163 }
164
test_vgetq_lane_s64(int64x2_t a)165 int64_t test_vgetq_lane_s64(int64x2_t a) {
166 // CHECK-LABEL: test_vgetq_lane_s64:
167 // CHECK-NEXT: mov.d x0, v0[1]
168 // CHECK-NEXT: ret
169 return vgetq_lane_s64(a, 1);
170 }
171
test_vgetq_lane_u64(uint64x2_t a)172 uint64_t test_vgetq_lane_u64(uint64x2_t a) {
173 // CHECK-LABEL: test_vgetq_lane_u64:
174 // CHECK-NEXT: mov.d x0, v0[1]
175 // CHECK-NEXT: ret
176 return vgetq_lane_u64(a, 1);
177 }
178
179
test_vset_lane_u8(uint8_t a,uint8x8_t b)180 uint8x8_t test_vset_lane_u8(uint8_t a, uint8x8_t b) {
181 // CHECK-LABEL: test_vset_lane_u8:
182 // CHECK-NEXT: ins.b v0[7], w0
183 // CHECK-NEXT: ret
184 return vset_lane_u8(a, b, 7);
185 }
186
test_vset_lane_u16(uint16_t a,uint16x4_t b)187 uint16x4_t test_vset_lane_u16(uint16_t a, uint16x4_t b) {
188 // CHECK-LABEL: test_vset_lane_u16:
189 // CHECK-NEXT: ins.h v0[3], w0
190 // CHECK-NEXT: ret
191 return vset_lane_u16(a, b, 3);
192 }
193
test_vset_lane_u32(uint32_t a,uint32x2_t b)194 uint32x2_t test_vset_lane_u32(uint32_t a, uint32x2_t b) {
195 // CHECK-LABEL: test_vset_lane_u32:
196 // CHECK-NEXT: ins.s v0[1], w0
197 // CHECK-NEXT: ret
198 return vset_lane_u32(a, b, 1);
199 }
200
test_vset_lane_s8(int8_t a,int8x8_t b)201 int8x8_t test_vset_lane_s8(int8_t a, int8x8_t b) {
202 // CHECK-LABEL: test_vset_lane_s8:
203 // CHECK-NEXT: ins.b v0[7], w0
204 // CHECK-NEXT: ret
205 return vset_lane_s8(a, b, 7);
206 }
207
test_vset_lane_s16(int16_t a,int16x4_t b)208 int16x4_t test_vset_lane_s16(int16_t a, int16x4_t b) {
209 // CHECK-LABEL: test_vset_lane_s16:
210 // CHECK-NEXT: ins.h v0[3], w0
211 // CHECK-NEXT: ret
212 return vset_lane_s16(a, b, 3);
213 }
214
test_vset_lane_s32(int32_t a,int32x2_t b)215 int32x2_t test_vset_lane_s32(int32_t a, int32x2_t b) {
216 // CHECK-LABEL: test_vset_lane_s32:
217 // CHECK-NEXT: ins.s v0[1], w0
218 // CHECK-NEXT: ret
219 return vset_lane_s32(a, b, 1);
220 }
221
test_vset_lane_p8(poly8_t a,poly8x8_t b)222 poly8x8_t test_vset_lane_p8(poly8_t a, poly8x8_t b) {
223 // CHECK-LABEL: test_vset_lane_p8:
224 // CHECK-NEXT: ins.b v0[7], w0
225 // CHECK-NEXT: ret
226 return vset_lane_p8(a, b, 7);
227 }
228
test_vset_lane_p16(poly16_t a,poly16x4_t b)229 poly16x4_t test_vset_lane_p16(poly16_t a, poly16x4_t b) {
230 // CHECK-LABEL: test_vset_lane_p16:
231 // CHECK-NEXT: ins.h v0[3], w0
232 // CHECK-NEXT: ret
233 return vset_lane_p16(a, b, 3);
234 }
235
test_vset_lane_f32(float32_t a,float32x2_t b)236 float32x2_t test_vset_lane_f32(float32_t a, float32x2_t b) {
237 // CHECK-LABEL: test_vset_lane_f32:
238 // CHECK-NEXT: ins.s v1[1], v0[0]
239 // CHECK-NEXT: mov.16b v0, v1
240 // CHECK-NEXT: ret
241 return vset_lane_f32(a, b, 1);
242 }
243
test_vset_lane_f16(float16_t * a,float16x4_t b)244 float16x4_t test_vset_lane_f16(float16_t *a, float16x4_t b) {
245 // CHECK-LABEL: test_vset_lane_f16:
246 // CHECK-NEXT: ld1.h { v0 }[3], [x0]
247 // CHECK-NEXT: ret
248 return vset_lane_f16(*a, b, 3);
249 }
250
test_vsetq_lane_u8(uint8_t a,uint8x16_t b)251 uint8x16_t test_vsetq_lane_u8(uint8_t a, uint8x16_t b) {
252 // CHECK-LABEL: test_vsetq_lane_u8:
253 // CHECK-NEXT: ins.b v0[15], w0
254 // CHECK-NEXT: ret
255 return vsetq_lane_u8(a, b, 15);
256 }
257
test_vsetq_lane_u16(uint16_t a,uint16x8_t b)258 uint16x8_t test_vsetq_lane_u16(uint16_t a, uint16x8_t b) {
259 // CHECK-LABEL: test_vsetq_lane_u16:
260 // CHECK-NEXT: ins.h v0[7], w0
261 // CHECK-NEXT: ret
262 return vsetq_lane_u16(a, b, 7);
263 }
264
test_vsetq_lane_u32(uint32_t a,uint32x4_t b)265 uint32x4_t test_vsetq_lane_u32(uint32_t a, uint32x4_t b) {
266 // CHECK-LABEL: test_vsetq_lane_u32:
267 // CHECK-NEXT: ins.s v0[3], w0
268 // CHECK-NEXT: ret
269 return vsetq_lane_u32(a, b, 3);
270 }
271
test_vsetq_lane_s8(int8_t a,int8x16_t b)272 int8x16_t test_vsetq_lane_s8(int8_t a, int8x16_t b) {
273 // CHECK-LABEL: test_vsetq_lane_s8:
274 // CHECK-NEXT: ins.b v0[15], w0
275 // CHECK-NEXT: ret
276 return vsetq_lane_s8(a, b, 15);
277 }
278
test_vsetq_lane_s16(int16_t a,int16x8_t b)279 int16x8_t test_vsetq_lane_s16(int16_t a, int16x8_t b) {
280 // CHECK-LABEL: test_vsetq_lane_s16:
281 // CHECK-NEXT: ins.h v0[7], w0
282 // CHECK-NEXT: ret
283 return vsetq_lane_s16(a, b, 7);
284 }
285
test_vsetq_lane_s32(int32_t a,int32x4_t b)286 int32x4_t test_vsetq_lane_s32(int32_t a, int32x4_t b) {
287 // CHECK-LABEL: test_vsetq_lane_s32:
288 // CHECK-NEXT: ins.s v0[3], w0
289 // CHECK-NEXT: ret
290 return vsetq_lane_s32(a, b, 3);
291 }
292
test_vsetq_lane_p8(poly8_t a,poly8x16_t b)293 poly8x16_t test_vsetq_lane_p8(poly8_t a, poly8x16_t b) {
294 // CHECK-LABEL: test_vsetq_lane_p8:
295 // CHECK-NEXT: ins.b v0[15], w0
296 // CHECK-NEXT: ret
297 return vsetq_lane_p8(a, b, 15);
298 }
299
test_vsetq_lane_p16(poly16_t a,poly16x8_t b)300 poly16x8_t test_vsetq_lane_p16(poly16_t a, poly16x8_t b) {
301 // CHECK-LABEL: test_vsetq_lane_p16:
302 // CHECK-NEXT: ins.h v0[7], w0
303 // CHECK-NEXT: ret
304 return vsetq_lane_p16(a, b, 7);
305 }
306
test_vsetq_lane_f32(float32_t a,float32x4_t b)307 float32x4_t test_vsetq_lane_f32(float32_t a, float32x4_t b) {
308 // CHECK-LABEL: test_vsetq_lane_f32:
309 // CHECK-NEXT: ins.s v1[3], v0[0]
310 // CHECK-NEXT: mov.16b v0, v1
311 // CHECK-NEXT: ret
312 return vsetq_lane_f32(a, b, 3);
313 }
314
test_vsetq_lane_f16(float16_t * a,float16x8_t b)315 float16x8_t test_vsetq_lane_f16(float16_t *a, float16x8_t b) {
316 // CHECK-LABEL: test_vsetq_lane_f16:
317 // CHECK-NEXT: ld1.h { v0 }[7], [x0]
318 // CHECK-NEXT: ret
319 return vsetq_lane_f16(*a, b, 7);
320 }
321
test_vset_lane_s64(int64_t a,int64x1_t b)322 int64x1_t test_vset_lane_s64(int64_t a, int64x1_t b) {
323 // CHECK-LABEL: test_vset_lane_s64:
324 // CHECK-NEXT: fmov d0, x0
325 // CHECK-NEXT: ret
326 return vset_lane_s64(a, b, 0);
327 }
328
test_vset_lane_u64(uint64_t a,uint64x1_t b)329 uint64x1_t test_vset_lane_u64(uint64_t a, uint64x1_t b) {
330 // CHECK-LABEL: test_vset_lane_u64:
331 // CHECK-NEXT: fmov d0, x0
332 // CHECK-NEXT: ret
333 return vset_lane_u64(a, b, 0);
334 }
335
test_vsetq_lane_s64(int64_t a,int64x2_t b)336 int64x2_t test_vsetq_lane_s64(int64_t a, int64x2_t b) {
337 // CHECK-LABEL: test_vsetq_lane_s64:
338 // CHECK-NEXT: ins.d v0[1], x0
339 // CHECK-NEXT: ret
340 return vsetq_lane_s64(a, b, 1);
341 }
342
test_vsetq_lane_u64(uint64_t a,uint64x2_t b)343 uint64x2_t test_vsetq_lane_u64(uint64_t a, uint64x2_t b) {
344 // CHECK-LABEL: test_vsetq_lane_u64:
345 // CHECK-NEXT: ins.d v0[1], x0
346 // CHECK-NEXT: ret
347 return vsetq_lane_u64(a, b, 1);
348 }
349