1 /* Test vdup_lane intrinsics work correctly. */
3 /* { dg-options "-O1 --save-temps" } */
7 extern void abort (void);
9 float32x2_t
__attribute__ ((noinline
))
10 wrap_vdup_n_f32 (float32_t a
)
12 return vdup_n_f32 (a
);
15 int __attribute__ ((noinline
))
23 b
= wrap_vdup_n_f32 (a
);
25 for (i
= 0; i
< 2; i
++)
31 float32x4_t
__attribute__ ((noinline
))
32 wrap_vdupq_n_f32 (float32_t a
)
34 return vdupq_n_f32 (a
);
37 int __attribute__ ((noinline
))
45 b
= wrap_vdupq_n_f32 (a
);
47 for (i
= 0; i
< 4; i
++)
53 float64x1_t
__attribute__ ((noinline
))
54 wrap_vdup_n_f64 (float64_t a
)
56 return vdup_n_f64 (a
);
59 int __attribute__ ((noinline
))
67 b
= wrap_vdup_n_f64 (a
);
69 for (i
= 0; i
< 1; i
++)
75 float64x2_t
__attribute__ ((noinline
))
76 wrap_vdupq_n_f64 (float64_t a
)
78 return vdupq_n_f64 (a
);
81 int __attribute__ ((noinline
))
89 b
= wrap_vdupq_n_f64 (a
);
91 for (i
= 0; i
< 2; i
++)
97 poly8x8_t
__attribute__ ((noinline
))
98 wrap_vdup_n_p8 (poly8_t a
)
100 return vdup_n_p8 (a
);
103 int __attribute__ ((noinline
))
111 b
= wrap_vdup_n_p8 (a
);
113 for (i
= 0; i
< 8; i
++)
119 poly8x16_t
__attribute__ ((noinline
))
120 wrap_vdupq_n_p8 (poly8_t a
)
122 return vdupq_n_p8 (a
);
125 int __attribute__ ((noinline
))
133 b
= wrap_vdupq_n_p8 (a
);
135 for (i
= 0; i
< 16; i
++)
141 int8x8_t
__attribute__ ((noinline
))
142 wrap_vdup_n_s8 (int8_t a
)
144 return vdup_n_s8 (a
);
147 int __attribute__ ((noinline
))
155 b
= wrap_vdup_n_s8 (a
);
157 for (i
= 0; i
< 8; i
++)
163 int8x16_t
__attribute__ ((noinline
))
164 wrap_vdupq_n_s8 (int8_t a
)
166 return vdupq_n_s8 (a
);
169 int __attribute__ ((noinline
))
177 b
= wrap_vdupq_n_s8 (a
);
179 for (i
= 0; i
< 16; i
++)
185 uint8x8_t
__attribute__ ((noinline
))
186 wrap_vdup_n_u8 (uint8_t a
)
188 return vdup_n_u8 (a
);
191 int __attribute__ ((noinline
))
199 b
= wrap_vdup_n_u8 (a
);
201 for (i
= 0; i
< 8; i
++)
207 uint8x16_t
__attribute__ ((noinline
))
208 wrap_vdupq_n_u8 (uint8_t a
)
210 return vdupq_n_u8 (a
);
213 int __attribute__ ((noinline
))
221 b
= wrap_vdupq_n_u8 (a
);
223 for (i
= 0; i
< 16; i
++)
229 poly16x4_t
__attribute__ ((noinline
))
230 wrap_vdup_n_p16 (poly16_t a
)
232 return vdup_n_p16 (a
);
235 int __attribute__ ((noinline
))
243 b
= wrap_vdup_n_p16 (a
);
245 for (i
= 0; i
< 4; i
++)
251 poly16x8_t
__attribute__ ((noinline
))
252 wrap_vdupq_n_p16 (poly16_t a
)
254 return vdupq_n_p16 (a
);
257 int __attribute__ ((noinline
))
265 b
= wrap_vdupq_n_p16 (a
);
267 for (i
= 0; i
< 8; i
++)
273 int16x4_t
__attribute__ ((noinline
))
274 wrap_vdup_n_s16 (int16_t a
)
276 return vdup_n_s16 (a
);
279 int __attribute__ ((noinline
))
287 b
= wrap_vdup_n_s16 (a
);
289 for (i
= 0; i
< 4; i
++)
295 int16x8_t
__attribute__ ((noinline
))
296 wrap_vdupq_n_s16 (int16_t a
)
298 return vdupq_n_s16 (a
);
301 int __attribute__ ((noinline
))
309 b
= wrap_vdupq_n_s16 (a
);
311 for (i
= 0; i
< 8; i
++)
317 uint16x4_t
__attribute__ ((noinline
))
318 wrap_vdup_n_u16 (uint16_t a
)
320 return vdup_n_u16 (a
);
323 int __attribute__ ((noinline
))
331 b
= wrap_vdup_n_u16 (a
);
333 for (i
= 0; i
< 4; i
++)
339 uint16x8_t
__attribute__ ((noinline
))
340 wrap_vdupq_n_u16 (uint16_t a
)
342 return vdupq_n_u16 (a
);
345 int __attribute__ ((noinline
))
353 b
= wrap_vdupq_n_u16 (a
);
355 for (i
= 0; i
< 8; i
++)
361 int32x2_t
__attribute__ ((noinline
))
362 wrap_vdup_n_s32 (int32_t a
)
364 return vdup_n_s32 (a
);
367 int __attribute__ ((noinline
))
375 b
= wrap_vdup_n_s32 (a
);
377 for (i
= 0; i
< 2; i
++)
383 int32x4_t
__attribute__ ((noinline
))
384 wrap_vdupq_n_s32 (int32_t a
)
386 return vdupq_n_s32 (a
);
389 int __attribute__ ((noinline
))
397 b
= wrap_vdupq_n_s32 (a
);
399 for (i
= 0; i
< 4; i
++)
405 uint32x2_t
__attribute__ ((noinline
))
406 wrap_vdup_n_u32 (uint32_t a
)
408 return vdup_n_u32 (a
);
411 int __attribute__ ((noinline
))
419 b
= wrap_vdup_n_u32 (a
);
421 for (i
= 0; i
< 2; i
++)
427 uint32x4_t
__attribute__ ((noinline
))
428 wrap_vdupq_n_u32 (uint32_t a
)
430 return vdupq_n_u32 (a
);
433 int __attribute__ ((noinline
))
441 b
= wrap_vdupq_n_u32 (a
);
443 for (i
= 0; i
< 4; i
++)
449 int64x1_t
__attribute__ ((noinline
))
450 wrap_vdup_n_s64 (int64_t a
)
452 return vdup_n_s64 (a
);
455 int __attribute__ ((noinline
))
463 b
= wrap_vdup_n_s64 (a
);
465 for (i
= 0; i
< 1; i
++)
471 int64x2_t
__attribute__ ((noinline
))
472 wrap_vdupq_n_s64 (int64_t a
)
474 return vdupq_n_s64 (a
);
477 int __attribute__ ((noinline
))
485 b
= wrap_vdupq_n_s64 (a
);
487 for (i
= 0; i
< 2; i
++)
493 uint64x1_t
__attribute__ ((noinline
))
494 wrap_vdup_n_u64 (uint64_t a
)
496 return vdup_n_u64 (a
);
499 int __attribute__ ((noinline
))
507 b
= wrap_vdup_n_u64 (a
);
509 for (i
= 0; i
< 1; i
++)
515 uint64x2_t
__attribute__ ((noinline
))
516 wrap_vdupq_n_u64 (uint64_t a
)
518 return vdupq_n_u64 (a
);
521 int __attribute__ ((noinline
))
529 b
= wrap_vdupq_n_u64 (a
);
531 for (i
= 0; i
< 2; i
++)
540 if (test_vdup_n_f32 ())
542 if (test_vdup_n_f64 ())
544 if (test_vdup_n_p8 ())
546 if (test_vdup_n_u8 ())
548 if (test_vdup_n_s8 ())
550 if (test_vdup_n_p16 ())
552 if (test_vdup_n_s16 ())
554 if (test_vdup_n_u16 ())
556 if (test_vdup_n_s32 ())
558 if (test_vdup_n_u32 ())
560 if (test_vdup_n_s64 ())
562 if (test_vdup_n_u64 ())
564 if (test_vdupq_n_f32 ())
566 if (test_vdupq_n_f64 ())
568 if (test_vdupq_n_p8 ())
570 if (test_vdupq_n_u8 ())
572 if (test_vdupq_n_s8 ())
574 if (test_vdupq_n_p16 ())
576 if (test_vdupq_n_s16 ())
578 if (test_vdupq_n_u16 ())
580 if (test_vdupq_n_s32 ())
582 if (test_vdupq_n_u32 ())
584 if (test_vdupq_n_s64 ())
586 if (test_vdupq_n_u64 ())
591 /* No asm checks for vdup_n_f32, vdupq_n_f32, vdup_n_f64 and vdupq_n_f64.
592 Cannot force floating point value in general purpose regester. */
594 /* Asm check for test_vdup_n_p8, test_vdup_n_s8, test_vdup_n_u8. */
595 /* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.8b, w\[0-9\]+" 3 } } */
597 /* Asm check for test_vdupq_n_p8, test_vdupq_n_s8, test_vdupq_n_u8. */
598 /* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.16b, w\[0-9\]+" 3 } } */
600 /* Asm check for test_vdup_n_p16, test_vdup_n_s16, test_vdup_n_u16. */
601 /* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.4h, w\[0-9\]+" 3 } } */
603 /* Asm check for test_vdupq_n_p16, test_vdupq_n_s16, test_vdupq_n_u16. */
604 /* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.8h, w\[0-9\]+" 3 } } */
606 /* Asm check for test_vdup_n_s32, test_vdup_n_u32. */
607 /* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.2s, w\[0-9\]+" 2 } } */
609 /* Asm check for test_vdupq_n_s32, test_vdupq_n_u32. */
610 /* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.4s, w\[0-9\]+" 2 } } */
612 /* Asm check for test_vdup_n_s64, test_vdup_n_u64 are left out.
613 Attempts to make the compiler generate "dup\\td\[0-9\]+, x\[0-9\]+"
614 are not practical. */
616 /* Asm check for test_vdupq_n_s64, test_vdupq_n_u64. */
617 /* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.2d, x\[0-9\]+" 2 } } */
619 /* { dg-final { cleanup-saved-temps } } */