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