• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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