1 /* Test vdup_lane intrinsics work correctly. */
3 /* { dg-options "-O1 --save-temps" } */
7 #define force_simd(V1) asm volatile ("mov %d0, %1.d[0]" \
12 extern void abort (void);
14 float32_t
__attribute__ ((noinline
))
15 wrap_vdups_lane_f32_0 (float32x2_t dummy
, float32x2_t a
)
17 return vdups_lane_f32 (a
, 0);
20 float32_t
__attribute__ ((noinline
))
21 wrap_vdups_lane_f32_1 (float32x2_t a
)
23 return vdups_lane_f32 (a
, 1);
26 int __attribute__ ((noinline
))
27 test_vdups_lane_f32 ()
31 float32_t c
[2] = { 0.0, 1.0 };
34 b
= wrap_vdups_lane_f32_0 (a
, a
);
37 b
= wrap_vdups_lane_f32_1 (a
);
43 float64_t
__attribute__ ((noinline
))
44 wrap_vdupd_lane_f64_0 (float64x1_t dummy
, float64x1_t a
)
46 return vdupd_lane_f64 (a
, 0);
49 int __attribute__ ((noinline
))
50 test_vdupd_lane_f64 ()
54 float64_t c
[1] = { 0.0 };
56 b
= wrap_vdupd_lane_f64_0 (a
, a
);
62 int8_t __attribute__ ((noinline
))
63 wrap_vdupb_lane_s8_0 (int8x8_t dummy
, int8x8_t a
)
65 int8_t result
= vdupb_lane_s8 (a
, 0);
70 int8_t __attribute__ ((noinline
))
71 wrap_vdupb_lane_s8_1 (int8x8_t a
)
73 int8_t result
= vdupb_lane_s8 (a
, 1);
78 int __attribute__ ((noinline
))
83 int8_t c
[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
86 b
= wrap_vdupb_lane_s8_0 (a
, a
);
89 b
= wrap_vdupb_lane_s8_1 (a
);
96 uint8_t __attribute__ ((noinline
))
97 wrap_vdupb_lane_u8_0 (uint8x8_t dummy
, uint8x8_t a
)
99 uint8_t result
= vdupb_lane_u8 (a
, 0);
104 uint8_t __attribute__ ((noinline
))
105 wrap_vdupb_lane_u8_1 (uint8x8_t a
)
107 uint8_t result
= vdupb_lane_u8 (a
, 1);
112 int __attribute__ ((noinline
))
113 test_vdupb_lane_u8 ()
117 uint8_t c
[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
120 b
= wrap_vdupb_lane_u8_0 (a
, a
);
123 b
= wrap_vdupb_lane_u8_1 (a
);
129 int16_t __attribute__ ((noinline
))
130 wrap_vduph_lane_s16_0 (int16x4_t dummy
, int16x4_t a
)
132 int16_t result
= vduph_lane_s16 (a
, 0);
137 int16_t __attribute__ ((noinline
))
138 wrap_vduph_lane_s16_1 (int16x4_t a
)
140 int16_t result
= vduph_lane_s16 (a
, 1);
145 int __attribute__ ((noinline
))
146 test_vduph_lane_s16 ()
150 int16_t c
[4] = { 0, 1, 2, 3 };
153 b
= wrap_vduph_lane_s16_0 (a
, a
);
156 b
= wrap_vduph_lane_s16_1 (a
);
162 uint16_t __attribute__ ((noinline
))
163 wrap_vduph_lane_u16_0 (uint16x4_t dummy
, uint16x4_t a
)
165 uint16_t result
= vduph_lane_u16 (a
, 0);
170 uint16_t __attribute__ ((noinline
))
171 wrap_vduph_lane_u16_1 (uint16x4_t a
)
173 uint16_t result
= vduph_lane_u16 (a
, 1);
178 int __attribute__ ((noinline
))
179 test_vduph_lane_u16 ()
183 uint16_t c
[4] = { 0, 1, 2, 3 };
186 b
= wrap_vduph_lane_u16_0 (a
, a
);
189 b
= wrap_vduph_lane_u16_1 (a
);
195 int32_t __attribute__ ((noinline
))
196 wrap_vdups_lane_s32_0 (int32x2_t dummy
, int32x2_t a
)
198 int32_t result
= vdups_lane_s32 (a
, 0);
203 int32_t __attribute__ ((noinline
))
204 wrap_vdups_lane_s32_1 (int32x2_t a
)
206 int32_t result
= vdups_lane_s32 (a
, 1);
211 int __attribute__ ((noinline
))
212 test_vdups_lane_s32 ()
216 int32_t c
[2] = { 0, 1 };
219 b
= wrap_vdups_lane_s32_0 (vcreate_s32 (0), a
);
222 b
= wrap_vdups_lane_s32_1 (a
);
228 uint32_t __attribute__ ((noinline
))
229 wrap_vdups_lane_u32_0 (uint32x2_t dummy
, uint32x2_t a
)
231 uint32_t result
= vdups_lane_u32 (a
, 0);
236 uint32_t __attribute__ ((noinline
))
237 wrap_vdups_lane_u32_1 (uint32x2_t a
)
239 uint32_t result
= vdups_lane_u32 (a
, 1);
244 int __attribute__ ((noinline
))
245 test_vdups_lane_u32 ()
249 uint32_t c
[2] = { 0, 1 };
251 b
= wrap_vdups_lane_u32_0 (a
, a
);
254 b
= wrap_vdups_lane_u32_1 (a
);
260 uint64_t __attribute__ ((noinline
))
261 wrap_vdupd_lane_u64_0 (uint64x1_t dummy
, uint64x1_t a
)
263 return vdupd_lane_u64 (a
, 0);;
266 int __attribute__ ((noinline
))
267 test_vdupd_lane_u64 ()
271 uint64_t c
[1] = { 0 };
274 b
= wrap_vdupd_lane_u64_0 (a
, a
);
280 int64_t __attribute__ ((noinline
))
281 wrap_vdupd_lane_s64_0 (int64x1_t dummy
, int64x1_t a
)
283 return vdupd_lane_s64 (a
, 0);
286 int __attribute__ ((noinline
))
287 test_vdupd_lane_s64 ()
291 int64_t c
[1] = { 0 };
294 b
= wrap_vdupd_lane_s64_0 (a
, a
);
303 if (test_vdups_lane_f32 ())
305 if (test_vdupd_lane_f64 ())
307 if (test_vdupb_lane_s8 ())
309 if (test_vdupb_lane_u8 ())
311 if (test_vduph_lane_s16 ())
313 if (test_vduph_lane_u16 ())
315 if (test_vdups_lane_s32 ())
317 if (test_vdups_lane_u32 ())
319 if (test_vdupd_lane_s64 ())
321 if (test_vdupd_lane_u64 ())
326 /* Asm check for vdupb_lane_s8, vdupb_lane_u8. */
327 /* { dg-final { scan-assembler-not "dup\\tb\[0-9\]+, v\[0-9\]+\.b\\\[0\\\]" } } */
328 /* { dg-final { scan-assembler-times "dup\\tb\[0-9\]+, v\[0-9\]+\.b\\\[1\\\]" 2 } } */
330 /* Asm check for vduph_lane_h16, vduph_lane_h16. */
331 /* { dg-final { scan-assembler-not "dup\\th\[0-9\]+, v\[0-9\]+\.h\\\[0\\\]" } } */
332 /* { dg-final { scan-assembler-times "dup\\th\[0-9\]+, v\[0-9\]+\.h\\\[1\\\]" 2 } } */
334 /* Asm check for vdups_lane_f32, vdups_lane_s32, vdups_lane_u32. */
335 /* Can't generate "dup s<n>, v<m>[0]" for vdups_lane_s32 and vdups_lane_u32. */
336 /* { dg-final { scan-assembler-times {fmov\ts0, s1} 1 } } */
337 /* { dg-final { scan-assembler-times "dup\\ts\[0-9\]+, v\[0-9\]+\.s\\\[1\\\]" 3 } } */
339 /* Asm check for vdupd_lane_f64, vdupd_lane_s64, vdupd_lane_u64. */
340 /* Attempts to make the compiler generate vdupd are not practical. */
341 /* { dg-final { scan-assembler-not "dup\\td\[0-9\]+, v\[0-9\]+\.d\\\[0\\\]" } } */