1 /* { dg-do run { target aarch64_sve_hw } } */
2 /* { dg-options "-O2" } */
3 
4 #include <arm_sve.h>
5 
6 #ifndef TYPE
7 #define TYPE svint8_t
8 #define DUPQ svdupq_lane_s8
9 #define INDEX svindex_s8
10 #define COUNT 16
11 #endif
12 
13 #define BASE 42
14 
15 TYPE __attribute__ ((noipa))
dupq_var(TYPE x,uint64_t y)16 dupq_var (TYPE x, uint64_t y)
17 {
18   return DUPQ (x, y);
19 }
20 
21 TYPE __attribute__ ((noipa))
dupq_0(TYPE x)22 dupq_0 (TYPE x)
23 {
24   return DUPQ (x, 0);
25 }
26 
27 TYPE __attribute__ ((noipa))
dupq_1(TYPE x)28 dupq_1 (TYPE x)
29 {
30   return DUPQ (x, 1);
31 }
32 
33 TYPE __attribute__ ((noipa))
dupq_2(TYPE x)34 dupq_2 (TYPE x)
35 {
36   return DUPQ (x, 2);
37 }
38 
39 TYPE __attribute__ ((noipa))
dupq_3(TYPE x)40 dupq_3 (TYPE x)
41 {
42   return DUPQ (x, 3);
43 }
44 
45 TYPE __attribute__ ((noipa))
dupq_4(TYPE x)46 dupq_4 (TYPE x)
47 {
48   return DUPQ (x, 4);
49 }
50 
51 void __attribute__ ((noipa))
check(TYPE x,uint64_t y)52 check (TYPE x, uint64_t y)
53 {
54   svbool_t pg = svptrue_b8 ();
55   if (y * 2 >= svcntd ())
56     {
57       if (svptest_any (pg, svcmpne (pg, x, 0)))
58 	__builtin_abort ();
59     }
60   else
61     {
62       TYPE repeat = svand_x (pg, INDEX (0, 1), COUNT - 1);
63       TYPE expected = svadd_x (pg, repeat, BASE + y * COUNT);
64       if (svptest_any (pg, svcmpne (pg, x, expected)))
65 	__builtin_abort ();
66     }
67 }
68 
69 int
main()70 main ()
71 {
72   TYPE x = INDEX (BASE, 1);
73 
74   check (dupq_0 (x), 0);
75   check (dupq_1 (x), 1);
76   check (dupq_2 (x), 2);
77   check (dupq_3 (x), 3);
78   check (dupq_4 (x), 4);
79 
80   for (int i = 0; i < 63; ++i)
81     {
82       check (dupq_var (x, i), i);
83       check (dupq_var (x, (uint64_t) 1 << i), (uint64_t) 1 << i);
84     }
85 
86   return 0;
87 }
88