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