1 /* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
2 /* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
3 /* { dg-require-effective-target powerpc_altivec_ok } */
4 /* { dg-options "-maltivec" } */
5 /* Test the vec_extract VMX intrinsics. */
6 #include <altivec.h>
7
8 extern void abort (void);
9
10 vector int a = {0, 1, 2, 3};
11 vector short b = {0, 1, 2, 3, 4, 5, 6, 7};
12
f(vector int a,int b)13 int f(vector int a, int b)
14 {
15 return vec_extract (a, b);
16 }
17
f0(vector int a)18 int f0 (vector int a)
19 {
20 return vec_extract (a, 0);
21 }
f1(vector int a)22 int f1 (vector int a)
23 {
24 return vec_extract (a, 1);
25 }
f2(vector int a)26 int f2 (vector int a)
27 {
28 return vec_extract (a, 2);
29 }
f3(vector int a)30 int f3 (vector int a)
31 {
32 return vec_extract (a, 3);
33 }
f4(vector int a)34 int f4 (vector int a)
35 {
36 return vec_extract (a, 4);
37 }
38
g(vector short a,int b)39 int g(vector short a, int b)
40 {
41 return vec_extract (a, b);
42 }
43
g0(vector short a)44 int g0 (vector short a)
45 {
46 return vec_extract (a, 0);
47 }
g1(vector short a)48 int g1 (vector short a)
49 {
50 return vec_extract (a, 1);
51 }
g2(vector short a)52 int g2 (vector short a)
53 {
54 return vec_extract (a, 2);
55 }
g3(vector short a)56 int g3 (vector short a)
57 {
58 return vec_extract (a, 3);
59 }
60
g4(vector short a)61 int g4 (vector short a)
62 {
63 return vec_extract (a, 4);
64 }
g5(vector short a)65 int g5 (vector short a)
66 {
67 return vec_extract (a, 5);
68 }
g6(vector short a)69 int g6 (vector short a)
70 {
71 return vec_extract (a, 6);
72 }
g7(vector short a)73 int g7 (vector short a)
74 {
75 return vec_extract (a, 7);
76 }
g8(vector short a)77 int g8 (vector short a)
78 {
79 return vec_extract (a, 8);
80 }
81 int main1(void) __attribute__((noinline));
main1(void)82 int main1(void)
83 {
84 int i;
85 /* Check vec_extract with a non constant element numbering */
86 for(i=0;i<10;i++)
87 {
88 if (f(a, i) != (i&0x3))
89 abort ();
90 }
91
92 /* Check vec_extract with a constant element numbering */
93 if (f0(a) != 0)
94 abort ();
95 if (f1(a) != 1)
96 abort ();
97 if (f2(a) != 2)
98 abort ();
99 if (f3(a) != 3)
100 abort ();
101 /* Check that vec_extract works with a constant element higher than
102 the number of elements. */
103 if (f4(a) != 0)
104 abort ();
105
106 /* Check vec_extract with a non constant element numbering */
107 for(i=0;i<10;i++)
108 {
109 if (g(b, i) != (i&0x7))
110 abort ();
111 }
112
113 /* Check vec_extract with a constant element numbering */
114 if (g0(b) != 0)
115 abort ();
116 if (g1(b) != 1)
117 abort ();
118 if (g2(b) != 2)
119 abort ();
120 if (g3(b) != 3)
121 abort ();
122 if (g4(b) != 4)
123 abort ();
124 if (g5(b) != 5)
125 abort ();
126 if (g6(b) != 6)
127 abort ();
128 if (g7(b) != 7)
129 abort ();
130 /* Check that vec_extract works with a constant element higher than
131 the number of elements. */
132 if (g8(b) != 0)
133 abort ();
134
135 return 0;
136 }
137
main(void)138 int main(void)
139 {
140 return main1 ();
141 }
142