1 /* { dg-do run { target { powerpc*-*-* && lp64 } } } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-options "-mvsx" } */
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 PR89626 after that pr is addressed.  */
14 #ifdef PR89626
15 #define SIGNED
16 #else
17 #define SIGNED signed
18 #endif
19 
20 #define CONST0		(((__int128) 31415926539) << 60)
21 
22 /* Test that indices > length of vector are applied modulo the vector
23    length.  */
24 
25 
26 /* Test for variable selector and vector residing in register.  */
27 __attribute__((noinline))
ei(vector SIGNED __int128 v,int i)28 __int128 ei (vector SIGNED __int128 v, int i)
29 {
30   return __builtin_vec_ext_v1ti (v, i);
31 }
32 
33 /* Test for variable selector and vector residing in memory.  */
mei(vector SIGNED __int128 * vp,int i)34 __int128 mei (vector SIGNED __int128 *vp, int i)
35 {
36   return __builtin_vec_ext_v1ti (*vp, i);
37 }
38 
main(int argc,char * argv[])39 int main (int argc, char *argv[]) {
40   vector SIGNED __int128 dv = { CONST0 };
41   __int128 d;
42 
43   d = ei (dv, 0);
44   if (d != CONST0)
45     abort ();
46 
47   d = ei (dv, 1);
48   if (d != CONST0)
49     abort ();
50 
51   d = ei (dv, 2);
52   if (d != CONST0)
53     abort ();
54 
55   d = ei (dv, 3);
56   if (d != CONST0)
57     abort ();
58 
59   d = mei (&dv, 0);
60   if (d != CONST0)
61     abort ();
62 
63   d = mei (&dv, 1);
64   if (d != CONST0)
65     abort ();
66 
67   d = mei (&dv, 2);
68   if (d != CONST0)
69     abort ();
70 
71   d = mei (&dv, 3);
72   if (d != CONST0)
73     abort ();
74 
75   return 0;
76 }
77