12 #define TRACE(STRING, NUM) \
15 fprintf (stderr, "%s: %2d\n", STRING, (int) NUM); \
21 #define FAIL_FORMAT "%ld"
22 #define FAIL_CAST(X) ((long)(X))
25 #define FAIL(EXP, GOT) \
28 fprintf (stderr, "Expected: " FAIL_FORMAT ", got " FAIL_FORMAT "\n", \
29 FAIL_CAST (EXP), FAIL_CAST (GOT)); \
36 #define TRACE(STRING, NUM)
37 #define FAIL(EXP, GOT) abort ()
41 check (RTYPE
, RTYPE
) __attribute__((__noinline__
));
44 deoptimize (vector TYPE
) __attribute__((__noinline__
));
47 *deoptimize_ptr (vector TYPE
*) __attribute__((__noinline__
));
50 check (RTYPE expected
, RTYPE got
)
57 deoptimize (vector TYPE a
)
59 __asm__ (" # %x0" : "+v" (a
));
64 deoptimize_ptr (vector TYPE
*p
)
66 __asm__ (" # %0" : "+r" (p
));
72 get_auto_0 (vector TYPE a
)
74 TRACE ("get_auto_", 0);
75 return (RTYPE
) vec_extract (a
, 0);
79 get_auto_1 (vector TYPE a
)
81 TRACE ("get_auto_", 1);
82 return (RTYPE
) vec_extract (a
, 1);
87 get_auto_2 (vector TYPE a
)
89 return (RTYPE
) vec_extract (a
, 2);
93 get_auto_3 (vector TYPE a
)
95 return (RTYPE
) vec_extract (a
, 3);
100 get_auto_4 (vector TYPE a
)
102 return (RTYPE
) vec_extract (a
, 4);
106 get_auto_5 (vector TYPE a
)
108 return (RTYPE
) vec_extract (a
, 5);
112 get_auto_6 (vector TYPE a
)
114 return (RTYPE
) vec_extract (a
, 6);
118 get_auto_7 (vector TYPE a
)
120 return (RTYPE
) vec_extract (a
, 7);
125 get_auto_8 (vector TYPE a
)
127 return (RTYPE
) vec_extract (a
, 8);
131 get_auto_9 (vector TYPE a
)
133 return (RTYPE
) vec_extract (a
, 9);
137 get_auto_10 (vector TYPE a
)
139 return (RTYPE
) vec_extract (a
, 10);
143 get_auto_11 (vector TYPE a
)
145 return (RTYPE
) vec_extract (a
, 11);
149 get_auto_12 (vector TYPE a
)
151 return (RTYPE
) vec_extract (a
, 12);
155 get_auto_13 (vector TYPE a
)
157 return (RTYPE
) vec_extract (a
, 13);
161 get_auto_14 (vector TYPE a
)
163 return (RTYPE
) vec_extract (a
, 14);
167 get_auto_15 (vector TYPE a
)
169 return (RTYPE
) vec_extract (a
, 15);
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__
))
182 /* gcc issues warning: always_inline function might not be inlinable
184 __attribute__ ((__always_inline__))
188 get_auto_n (vector TYPE a
, ssize_t n
)
190 return (RTYPE
) vec_extract (a
, n
);
193 typedef RTYPE (*auto_func_type
) (vector TYPE
);
195 static auto_func_type get_auto_const
[] = {
220 extern void do_auto (vector TYPE a
) __attribute__((__noinline__
));
223 do_auto (vector TYPE a
)
227 for (i
= 1; i
< 40; i
+= 3)
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
));
239 /* Main program to test all of the possibilities. */
244 vector TYPE x
= INITIAL
;
245 vector TYPE
*p
, *p2
, a
, y
;