1 /* { dg-do run { target int128 } } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-options "-mvsx -O2" } */
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. */
15 static vector
unsigned __int128
16 deoptimize_uint128 (vector
unsigned __int128 a
)
18 __asm__ (" # %x0" : "+v" (a
));
22 static vector
unsigned long long int
23 deoptimize_ulong (vector
unsigned long long int a
)
25 __asm__ (" # %x0" : "+v" (a
));
29 static vector
unsigned int
30 deoptimize_uint (vector
unsigned int a
)
32 __asm__ (" # %x0" : "+v" (a
));
36 static vector
unsigned char
37 deoptimize_uchar (vector
unsigned char a
)
39 __asm__ (" # %x0" : "+v" (a
));
43 static vector
unsigned short
44 deoptimize_ushort (vector
unsigned short a
)
46 __asm__ (" # %x0" : "+v" (a
));
50 __attribute ((noinline
))
51 vector
unsigned __int128
52 set_auto_n_uint128 (vector
unsigned __int128 a
, int n
, unsigned __int128 x
)
54 return vec_insert (x
, a
, n
);
57 __attribute ((noinline
))
58 vector
unsigned long long int
59 set_auto_n_ulong (vector
unsigned long long int a
, int n
,
60 unsigned long long int x
)
62 return vec_insert (x
, a
, n
);
65 __attribute ((noinline
))
67 set_auto_n_uint (vector
unsigned int a
, int n
, unsigned int x
)
69 return vec_insert (x
, a
, n
);
72 __attribute ((noinline
))
74 set_auto_n_uchar (vector
unsigned char a
, int n
, unsigned char x
)
76 return vec_insert (x
, a
, n
);
79 __attribute ((noinline
))
81 set_auto_n_ushort (vector
unsigned short a
, int n
, unsigned short x
)
83 return vec_insert (x
, a
, n
);
86 __attribute ((noinline
))
88 get_auto_n_uint128 (vector
unsigned __int128 a
, int n
)
90 return vec_extract (a
, n
);
93 __attribute ((noinline
))
94 unsigned long long int
95 get_auto_n_ulong (vector
unsigned long long int a
, int n
)
97 return vec_extract (a
, n
);
100 __attribute ((noinline
))
102 get_auto_n_uint (vector
unsigned int a
, int n
)
104 return vec_extract (a
, n
);
107 __attribute ((noinline
))
109 get_auto_n_uchar (vector
unsigned char a
, int n
)
111 return vec_extract (a
, n
);
114 __attribute ((noinline
))
116 get_auto_n_ushort (vector
unsigned short a
, int n
)
118 return vec_extract (a
, n
);
121 int check_uint128_element (int i
, unsigned __int128 entry
)
123 printf ("checking uint128 entry at index %d\n", i
);
125 return (entry
== ((((unsigned __int128
) 0xffeeddccbbaa9988ULL
) << 64)
126 | 0x0706050403020100ULL
));
129 unsigned __int128
get_uint128_element (int i
)
131 return ((((unsigned __int128
) 0xffeeddccbbaa9988ULL
) << 64)
132 | 0x0706050403020100ULL
);
135 int check_ulong_element (int i
, unsigned long long int entry
)
137 printf ("checking ulong entry 0x%llx at index %d\n", entry
, i
);
141 case 0: return (entry
== 0x9999901010ULL
);
142 case 1: return (entry
== 0x7777733333ULL
);
148 unsigned long long int get_ulong_element (int i
)
152 case 0: return 0x9999901010ULL
;
153 case 1: return 0x7777733333ULL
;
157 int check_uint_element (int i
, unsigned int entry
)
159 printf ("checking uint entry 0x%x at index %d\n", entry
, i
);
163 case 0: return (entry
== 0x99999);
164 case 1: return (entry
== 0x01010);
165 case 2: return (entry
== 0x77777);
166 case 3: return (entry
== 0x33333);
172 unsigned int get_uint_element (int i
)
176 case 0: return 0x99999;
177 case 1: return 0x01010;
178 case 2: return 0x77777;
179 case 3: return 0x33333;
183 int check_uchar_element (int i
, unsigned char entry
)
185 printf ("checking uchar entry 0x%x at index %d\n", entry
, i
);
188 case 0: return (entry
== 0x90);
189 case 1: return (entry
== 0x80);
190 case 2: return (entry
== 0x70);
191 case 3: return (entry
== 0x60);
192 case 4: return (entry
== 0x50);
193 case 5: return (entry
== 0x40);
194 case 6: return (entry
== 0x30);
195 case 7: return (entry
== 0x20);
196 case 8: return (entry
== 0x10);
197 case 9: return (entry
== 0xf0);
198 case 10: return (entry
== 0xe0);
199 case 11: return (entry
== 0xd0);
200 case 12: return (entry
== 0xc0);
201 case 13: return (entry
== 0xb0);
202 case 14: return (entry
== 0xa0);
203 case 15: return (entry
== 0xff);
209 unsigned char get_uchar_element (int i
)
223 case 10: return 0xe0;
224 case 11: return 0xd0;
225 case 12: return 0xc0;
226 case 13: return 0xb0;
227 case 14: return 0xa0;
228 case 15: return 0xff;
232 int check_ushort_element (int i
, unsigned short entry
)
234 printf ("checking ushort entry 0x%x at index %d\n", entry
, i
);
237 case 0: return (entry
== 0x9988);
238 case 1: return (entry
== 0x8877);
239 case 2: return (entry
== 0x7766);
240 case 3: return (entry
== 0x6655);
241 case 4: return (entry
== 0x5544);
242 case 5: return (entry
== 0x4433);
243 case 6: return (entry
== 0x3322);
244 case 7: return (entry
== 0x2211);
250 unsigned short get_ushort_element (int i
)
254 case 0: return 0x9988;
255 case 1: return 0x8877;
256 case 2: return 0x7766;
257 case 3: return 0x6655;
258 case 4: return 0x5544;
259 case 5: return 0x4433;
260 case 6: return 0x3322;
261 case 7: return 0x2211;
265 vector
unsigned __int128
266 init_auto_uint128 (vector
unsigned __int128 a
)
269 for (i
= 0; i
< 32; i
+= 3)
270 a
= set_auto_n_uint128 (a
, i
, get_uint128_element (i
));
274 void do_auto_uint128 (vector
unsigned __int128 a
)
278 for (i
= 0; i
< 32; i
+= 3)
280 c
= get_auto_n_uint128 (a
, i
);
281 if (!check_uint128_element (i
, c
)) abort ();
285 vector
unsigned long long int
286 init_auto_ulong (vector
unsigned long long int a
)
289 for (i
= 0; i
< 32; i
+= 3)
290 a
= set_auto_n_ulong (a
, i
, get_ulong_element (i
));
294 void do_auto_ulong (vector
unsigned long long int a
)
297 unsigned long long int c
;
298 for (i
= 0; i
< 32; i
+= 3)
300 c
= get_auto_n_ulong (a
, i
);
301 if (!check_ulong_element (i
, c
)) abort ();
305 vector
unsigned int init_auto_uint (vector
unsigned int a
)
308 for (i
= 0; i
< 32; i
+= 3)
309 a
= set_auto_n_uint (a
, i
, get_uint_element (i
));
313 void do_auto_uint (vector
unsigned int a
)
317 for (i
= 0; i
< 32; i
+= 3)
319 c
= get_auto_n_uint (a
, i
);
320 if (!check_uint_element (i
, c
)) abort ();
324 vector
unsigned short init_auto_ushort ( vector
unsigned short a
)
327 for (i
= 0; i
< 32; i
+= 3)
328 a
= set_auto_n_ushort (a
, i
, get_ushort_element (i
));
332 void do_auto_ushort (vector
unsigned short a
)
336 for (i
= 0; i
< 32; i
+= 3)
338 c
= get_auto_n_ushort (a
, i
);
339 if (!check_ushort_element (i
, c
)) abort ();
343 vector
unsigned char init_auto_uchar (vector
unsigned char a
)
346 for (i
= 0; i
< 32; i
+= 3)
347 a
= set_auto_n_uchar (a
, i
, get_uchar_element (i
));
351 void do_auto_uchar (vector
unsigned char a
)
355 for (i
= 0; i
< 32; i
+= 3)
357 c
= get_auto_n_uchar (a
, i
);
358 if (!check_uchar_element (i
, c
)) abort ();
367 vector
unsigned __int128 u
= { 0 };
368 vector
unsigned __int128 du
;
370 vector
unsigned long long int v
= { 0, 0 };
371 vector
unsigned long long int dv
;
373 vector
unsigned int x
= { 0, 0, 0, 0 };
374 vector
unsigned int dx
;
376 vector
unsigned char y
= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
377 vector
unsigned char dy
;
379 vector
unsigned short z
= { 0, 0, 0, 0, 0, 0, 0, 0 };
380 vector
unsigned short dz
;
382 du
= init_auto_uint128 (u
);
383 dv
= init_auto_ulong (v
);
384 dx
= init_auto_uint (x
);
385 dy
= init_auto_uchar (y
);
386 dz
= init_auto_ushort (z
);
388 du
= deoptimize_uint128 (du
);
389 dv
= deoptimize_ulong (dv
);
390 dx
= deoptimize_uint (dx
);
391 dy
= deoptimize_uchar (dy
);
392 dz
= deoptimize_ushort (dz
);
394 do_auto_uint128 (du
);