1 #include <stdlib.h>
2 #include <stddef.h>
3 #include <altivec.h>
4 
5 #ifndef RTYPE
6 #define RTYPE TYPE
7 #endif
8 
9 #ifdef DO_TRACE
10 #include <stdio.h>
11 
12 #define TRACE(STRING, NUM)						\
13 do									\
14   {									\
15     fprintf (stderr, "%s: %2d\n", STRING, (int) NUM);			\
16     fflush (stderr);							\
17   }									\
18 while (0)
19 
20 #ifndef FAIL_FORMAT
21 #define FAIL_FORMAT "%ld"
22 #define FAIL_CAST(X) ((long)(X))
23 #endif
24 
25 #define FAIL(EXP, GOT)							 \
26 do									 \
27   {									 \
28     fprintf (stderr, "Expected: " FAIL_FORMAT ", got " FAIL_FORMAT "\n", \
29 	     FAIL_CAST (EXP), FAIL_CAST (GOT));				 \
30     fflush (stderr);							 \
31     abort ();								 \
32   }									 \
33 while (0)
34 
35 #else
36 #define TRACE(STRING, NUM)
37 #define FAIL(EXP, GOT) abort ()
38 #endif
39 
40 static void
41 check (RTYPE, RTYPE) __attribute__((__noinline__));
42 
43 static vector TYPE
44 deoptimize (vector TYPE) __attribute__((__noinline__));
45 
46 static vector TYPE
47 *deoptimize_ptr (vector TYPE *)	__attribute__((__noinline__));
48 
49 static void
check(RTYPE expected,RTYPE got)50 check (RTYPE expected, RTYPE got)
51 {
52   if (expected != got)
53     FAIL (expected, got);
54 }
55 
56 static vector TYPE
deoptimize(vector TYPE a)57 deoptimize (vector TYPE a)
58 {
59   __asm__ (" # %x0" : "+v" (a));
60   return a;
61 }
62 
63 static vector TYPE *
deoptimize_ptr(vector TYPE * p)64 deoptimize_ptr (vector TYPE *p)
65 {
66   __asm__ (" # %0" : "+r" (p));
67   return p;
68 }
69 
70 
71 RTYPE
get_auto_0(vector TYPE a)72 get_auto_0 (vector TYPE a)
73 {
74   TRACE ("get_auto_", 0);
75   return (RTYPE) vec_extract (a, 0);
76 }
77 
78 RTYPE
get_auto_1(vector TYPE a)79 get_auto_1 (vector TYPE a)
80 {
81   TRACE ("get_auto_", 1);
82   return (RTYPE) vec_extract (a, 1);
83 }
84 
85 #if ELEMENTS >= 4
86 RTYPE
get_auto_2(vector TYPE a)87 get_auto_2 (vector TYPE a)
88 {
89   return (RTYPE) vec_extract (a, 2);
90 }
91 
92 RTYPE
get_auto_3(vector TYPE a)93 get_auto_3 (vector TYPE a)
94 {
95   return (RTYPE) vec_extract (a, 3);
96 }
97 
98 #if ELEMENTS >= 8
99 RTYPE
get_auto_4(vector TYPE a)100 get_auto_4 (vector TYPE a)
101 {
102   return (RTYPE) vec_extract (a, 4);
103 }
104 
105 RTYPE
get_auto_5(vector TYPE a)106 get_auto_5 (vector TYPE a)
107 {
108   return (RTYPE) vec_extract (a, 5);
109 }
110 
111 RTYPE
get_auto_6(vector TYPE a)112 get_auto_6 (vector TYPE a)
113 {
114   return (RTYPE) vec_extract (a, 6);
115 }
116 
117 RTYPE
get_auto_7(vector TYPE a)118 get_auto_7 (vector TYPE a)
119 {
120   return (RTYPE) vec_extract (a, 7);
121 }
122 
123 #if ELEMENTS >= 16
124 RTYPE
get_auto_8(vector TYPE a)125 get_auto_8 (vector TYPE a)
126 {
127   return (RTYPE) vec_extract (a, 8);
128 }
129 
130 RTYPE
get_auto_9(vector TYPE a)131 get_auto_9 (vector TYPE a)
132 {
133   return (RTYPE) vec_extract (a, 9);
134 }
135 
136 RTYPE
get_auto_10(vector TYPE a)137 get_auto_10 (vector TYPE a)
138 {
139   return (RTYPE) vec_extract (a, 10);
140 }
141 
142 RTYPE
get_auto_11(vector TYPE a)143 get_auto_11 (vector TYPE a)
144 {
145   return (RTYPE) vec_extract (a, 11);
146 }
147 
148 RTYPE
get_auto_12(vector TYPE a)149 get_auto_12 (vector TYPE a)
150 {
151   return (RTYPE) vec_extract (a, 12);
152 }
153 
154 RTYPE
get_auto_13(vector TYPE a)155 get_auto_13 (vector TYPE a)
156 {
157   return (RTYPE) vec_extract (a, 13);
158 }
159 
160 RTYPE
get_auto_14(vector TYPE a)161 get_auto_14 (vector TYPE a)
162 {
163   return (RTYPE) vec_extract (a, 14);
164 }
165 
166 RTYPE
get_auto_15(vector TYPE a)167 get_auto_15 (vector TYPE a)
168 {
169   return (RTYPE) vec_extract (a, 15);
170 }
171 
172 #endif
173 #endif
174 #endif
175 
176 
177 /* Tests for the normal case of vec_extract where the vector is in a register
178    and returning the result in a register as a return value.  */
179 #ifdef DISABLE_INLINE_OF_GET_AUTO_N
180 __attribute__ ((__noinline__))
181 #else
182 /* gcc issues warning: always_inline function might not be inlinable
183 
184    __attribute__ ((__always_inline__))
185 */
186 #endif
187 RTYPE
get_auto_n(vector TYPE a,ssize_t n)188 get_auto_n (vector TYPE a, ssize_t n)
189 {
190   return (RTYPE) vec_extract (a, n);
191 }
192 
193 typedef RTYPE (*auto_func_type) (vector TYPE);
194 
195 static auto_func_type get_auto_const[] = {
196   get_auto_0,
197   get_auto_1,
198 #if ELEMENTS >= 4
199   get_auto_2,
200   get_auto_3,
201 #if ELEMENTS >= 8
202   get_auto_4,
203   get_auto_5,
204   get_auto_6,
205   get_auto_7,
206 #if ELEMENTS >= 16
207   get_auto_8,
208   get_auto_9,
209   get_auto_10,
210   get_auto_11,
211   get_auto_12,
212   get_auto_13,
213   get_auto_14,
214   get_auto_15,
215 #endif
216 #endif
217 #endif
218 };
219 
220 extern void do_auto (vector TYPE a) __attribute__((__noinline__));
221 
222 void
do_auto(vector TYPE a)223 do_auto (vector TYPE a)
224 {
225   size_t i;
226 
227   for (i = 1; i < 40; i += 3)
228     {
229       TRACE ("do_auto, i: ", i);
230       TRACE ("  get_auto_const[i] returns: ",
231 	     (*get_auto_const [i % ELEMENTS]) (a));
232       TRACE ("  get_auto_n returns", get_auto_n (a, i));
233       check (get_auto_n (a, i), (*get_auto_const [i % ELEMENTS]) (a));
234     }
235 }
236 
237 
238 
239 /* Main program to test all of the possibilities.  */
240 int
main(void)241 main (void)
242 {
243   size_t i;
244   vector TYPE x = INITIAL;
245   vector TYPE *p, *p2, a, y;
246   vector TYPE z[2];
247 
248   a = deoptimize (x);
249 
250   do_auto (a);
251 
252   return 0;
253 }
254