1 /* { dg-do run { target int128 } } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-options "-mvsx -O3" } */
4
5 /* This test should run the same on any target that supports vsx
6 instructions. Intentionally not specifying cpu in order to test
7 all code generation paths. */
8
9 #include <altivec.h>
10
11 extern void abort (void);
12
13 #define CONST0 (31415926539LL)
14 #define CONST1 (2 * 31415926539LL)
15 #define CONST2 (3 * 31415926539LL)
16 #define CONST3 (4 * 31415926539LL)
17 #define CONST4 (5 * 31415926539LL)
18 #define CONST5 (6 * 31415926539LL)
19 #define CONST6 (7 * 31415926539LL)
20 #define CONST7 (8 * 31415926539LL)
21
22 /* Test that indices > length of vector are applied modulo the vector
23 length. */
24
25 /* Test for vector residing in register. */
26 vector unsigned long long int
27 e0 (vector unsigned long long int v, unsigned long long int x)
28 {
29 return vec_insert (x, v, 0);
30 }
31
32 vector unsigned long long int
33 e3 (vector unsigned long long int v, unsigned long long int x)
34 {
35 return vec_insert (x, v, 3);
36 }
37
38 /* Test for vector residing in memory. */
39 vector unsigned long long int
40 me0 (vector unsigned long long int *vp, unsigned long long int x)
41 {
42 return vec_insert (x, *vp, 0);
43 }
44
45 vector unsigned long long int
46 me3 (vector unsigned long long int *vp, unsigned long long int x)
47 {
48 return vec_insert (x, *vp, 3);
49 }
50
51 /* Test the same with variable indices. */
52
53 /* Test for variable selector and vector residing in register. */
54 __attribute__((noinline))
55 vector unsigned long long int
56 ei (vector unsigned long long int v, int i, unsigned long long int x)
57 {
58 return vec_insert (x, v, i);
59 }
60
61 /* Test for variable selector and vector residing in memory. */
62 __attribute__((noinline))
63 vector unsigned long long int
64 mei (vector unsigned long long int *vp, int i, unsigned long long int x)
65 {
66 return vec_insert (x, *vp, i);
67 }
68
69 int main (int argc, char *argv[]) {
70 vector unsigned long long int dv = { CONST0, CONST1 };
71 unsigned long long int d;
72
73 dv = e0 (dv, CONST7);
74 if (dv [0] != CONST7)
75 abort ();
76
77 dv = e3 (dv, CONST2);
78 if (dv [1] != CONST2)
79 abort ();
80
81 dv = me0 (&dv, CONST4);
82 if (dv [0] != CONST4)
83 abort ();
84
85 dv = me3 (&dv, CONST3);
86 if (dv [1] != CONST3)
87 abort ();
88
89 dv = ei (dv, 0, CONST5);
90 if (dv [0] != CONST5)
91 abort ();
92
93 dv = ei (dv, 1, CONST2);
94 if (dv [1] != CONST2)
95 abort ();
96
97 dv = ei (dv, 2, CONST3);
98 if (dv [0] != CONST3)
99 abort ();
100
101 dv = ei (dv, 3, CONST6);
102 if (dv [1] != CONST6)
103 abort ();
104
105 dv = mei (&dv, 0, CONST1);
106 if (dv [0] != CONST1)
107 abort ();
108
109 dv = mei (&dv, 1, CONST3);
110 if (dv [1] != CONST3)
111 abort ();
112
113 dv = mei (&dv, 2, CONST1);
114 if (dv [0] != CONST1)
115 abort ();
116
117 dv = mei (&dv, 3, CONST2);
118 if (dv [1] != CONST2)
119 abort ();
120
121 return 0;
122 }