1 /* { dg-do run { target { vsx_hw } } } */
2 /* { dg-options "-O2 -mvsx -mdejagnu-cpu=power7" } */
3 
4 #include <altivec.h> // vector
5 
6 #ifdef DEBUG
7 #include <stdio.h>
8 #endif
9 
10 #define VBC   0
11 #define VSC   1
12 #define VUC   2
13 #define VBS   3
14 #define VSS   4
15 #define VUS   5
16 #define VBI   6
17 #define VI    7
18 #define VUI   8
19 #define VLLB  9
20 #define VLLI  10
21 #define VLLUI 11
22 #define VF    12
23 #define VD    13
24 
25 union vector_value
26 {
27   vector bool char vbc;
28   vector signed char vsc;
29   vector unsigned char vuc;
30   vector bool short vbs;
31   vector signed short vss;
32   vector unsigned short vus;
33   vector bool int vbi;
34   vector signed int vi;
35   vector unsigned int vui;
36   vector bool long long vllb;
37   vector long long signed int vlli;
38   vector long long unsigned int vllui;
39   vector float vf;
40   vector double vd;
41 } vec_element;
42 
43 struct vector_struct
44 {
45   int vector_id;
46   int element_size;  // element size in bytes
47   union vector_value vec;
48 } vec;
49 
50 void abort (void);
51 
test_results(struct vector_struct * vec_result,struct vector_struct * vec_expected)52 void test_results(struct vector_struct *vec_result,
53 		  struct vector_struct *vec_expected)
54 {
55   int i;
56   int num_elements;
57   if (vec_result->element_size != vec_expected->element_size)
58 #ifdef DEBUG
59     printf("vec_result->element_size != vec_expected->element_size\n");
60 #else
61     abort();
62 #endif
63 
64   if (vec_result->vector_id != vec_expected->vector_id)
65 #ifdef DEBUG
66     printf("vec_result->vector_id != vec_expected->vector_id\n");
67 #else
68     abort();
69 #endif
70 
71    num_elements = 16 / vec_result->element_size;
72 
73   for (i = 0; i<num_elements; i++) {
74     switch (vec_result->vector_id) {
75       case VBC:
76 	if (vec_result->vec.vbc[i] != vec_expected->vec.vbc[i])
77 	  {
78 #ifdef DEBUG
79 	     printf("vec_result->vec.vbc[%d] (%d) != ",
80 		    i, vec_result->vec.vbc[i]);
81 	     printf("vec_expected->vec.vbc[%d] (%d)\n",
82 		    i, vec_expected->vec.vbc[i]);
83 #else
84 	     abort();
85 #endif
86 	  }
87 	break;
88 
89       case VSC:
90 	if (vec_result->vec.vsc[i] != vec_expected->vec.vsc[i])
91 	  {
92 #ifdef DEBUG
93 	     printf("vec_result->vec.vsc[%d] (%d) != ",
94 		    i, vec_result->vec.vsc[i]);
95 	     printf("vec_expected->vec.vsc[%d] (%d)\n",
96 		    i, vec_expected->vec.vsc[i]);
97 #else
98 	     abort();
99 #endif
100 	  }
101 	break;
102 
103       case VUC:
104 	if (vec_result->vec.vuc[i] != vec_expected->vec.vuc[i])
105 	  {
106 #ifdef DEBUG
107 	     printf("vec_result->vec.vuc[%d] (%d) != ",
108 		    i, vec_result->vec.vuc[i]);
109 	     printf("vec_expected->vec.vuc[%d] (%d)\n",
110 		    i, vec_expected->vec.vuc[i]);
111 #else
112 	     abort();
113 #endif
114 	  }
115 	break;
116 
117       case VBS:
118 	if (vec_result->vec.vbs[i] != vec_expected->vec.vbs[i])
119 	  {
120 #ifdef DEBUG
121 	     printf("vec_result->vec.vbs[%d] (%d) != ",
122 		    i, vec_result->vec.vbs[i]);
123 	     printf("vec_expected->vec.vbs[%d] (%d)\n",
124 		    i, vec_expected->vec.vbs[i]);
125 #else
126 	    abort();
127 #endif
128 	  }
129 	break;
130 
131       case VSS:
132 	if (vec_result->vec.vss[i] != vec_expected->vec.vss[i])
133 	  {
134 #ifdef DEBUG
135 	    printf("vec_result->vec.vss[%d] (%d) != ",
136 		    i, vec_result->vec.vss[i]);
137 	    printf("vec_expected->vec.vss[%d] (%d)\n",
138 		    i, vec_expected->vec.vss[i]);
139 #else
140 	    abort();
141 #endif
142 	  }
143 	break;
144 
145       case VUS:
146 	if (vec_result->vec.vus[i] != vec_expected->vec.vus[i])
147 	  {
148 #ifdef DEBUG
149 	     printf("vec_result->vec.vus[%d] (%d) != ",
150 		    i, vec_expected->vec.vus[i]);
151 	     printf("vec_expected->vec.vus[%d] (%d)\n",
152 		    i, vec_expected->vec.vus[i]);
153 #else
154 	     abort();
155 #endif
156 	  }
157 	break;
158 
159       case VBI:
160 	if (vec_result->vec.vbi[i] != vec_expected->vec.vbi[i])
161 	  {
162 #ifdef DEBUG
163 	    printf("vec_result->vec.vbi[%d] (%d) != ",
164 		   i, vec_result->vec.vbi[i]);
165 	    printf("vec_expected->vec.vbi[%d] (%d)\n",
166 		   i, vec_expected->vec.vbi[i]);
167 #else
168 	    abort();
169 #endif
170 	  }
171 	break;
172 
173       case VI:
174 	if (vec_result->vec.vi[i] != vec_expected->vec.vi[i])
175 	  {
176 #ifdef DEBUG
177 	    printf("vec_result->vec.vi[%d] (%d) != ",
178 		   i, vec_result->vec.vi[i]);
179 	    printf("vec_expected->vec.vi[%d] (%d)\n",
180 		   i, vec_expected->vec.vi[i]);
181 #else
182 	    abort();
183 #endif
184 	  }
185 	break;
186 
187       case VUI:
188 	if (vec_result->vec.vui[i] != vec_expected->vec.vui[i])
189 	  {
190 #ifdef DEBUG
191 	    printf("vec_result->vec.vui[%d] (%u) != ",
192 		   i, vec_result->vec.vui[i]);
193 	    printf("vec_expected->vec.vui[%u] (%d)\n",
194 		   i, vec_expected->vec.vui[i]);
195 #else
196 	    abort();
197 #endif
198 	  }
199 	break;
200 
201       case VLLB:
202 	if (vec_result->vec.vllb[i] != vec_expected->vec.vllb[i])
203 	  {
204 #ifdef DEBUG
205 	    printf("vec_result->vec.vllb[%d] (%lld != ",
206 		   i, vec_result->vec.vllb[i]);
207 	    printf("vec_expected->vec.vllb[%lld] (%d)\n",
208 		   i, vec_expected->vec.vllb[i]);
209 #else
210 	    abort();
211 #endif
212 	  }
213 	break;
214 
215       case VLLI:
216 	if (vec_result->vec.vlli[i] != vec_expected->vec.vlli[i])
217 	  {
218 #ifdef DEBUG
219 	    printf("vec_result->vec.vlli[%d] (%d) != ",
220 		   i, vec_result->vec.vlli[i]);
221 	    printf("vec_expected->vec.vlli[%d] (%d)\n",
222 		   i, vec_expected->vec.vlli[i]);
223 #else
224 	    abort();
225 #endif
226 	  }
227 	break;
228 
229       case VLLUI:
230 	if (vec_result->vec.vllui[i] != vec_expected->vec.vllui[i])
231 	  {
232 #ifdef DEBUG
233 	    printf("vec_result->vec.vllui[%d] (%llu) != ",
234 		   i, vec_result->vec.vllui[i]);
235 	    printf("vec_expected->vec.vllui[%d] (%llu)\n",
236 		   i, vec_expected->vec.vllui[i]);
237 #else
238 	    abort();
239 #endif
240 	  }
241 	break;
242 
243       case VF:
244 	if (vec_result->vec.vf[i] != vec_expected->vec.vf[i])
245 	  {
246 #ifdef DEBUG
247 	    printf("vec_result->vec.vf[%d] (%f) != ",
248 		   i, vec_result->vec.vf[i]);
249 	    printf("vec_expected->vec.vf[%d] (%f)\n",
250 		   i, vec_expected->vec.vf[i]);
251 #else
252 	    abort();
253 #endif
254 	  }
255 	break;
256 
257       case VD:
258 	if (vec_result->vec.vd[i] != vec_expected->vec.vd[i])
259 	  {
260 #ifdef DEBUG
261 	    printf("vec_result->vec.vd[%d] (%f) != ",
262 		   i, vec_result->vec.vd[i]);
263 	    printf("vec_expected->vec.vd[%d] (%f)\n",
264 		   i, vec_expected->vec.vd[i]);
265 #else
266 	    abort();
267 #endif
268 	  }
269 	   break;
270 
271       default:
272 #ifdef DEBUG
273 	printf("Unknown case.\n");
274 #else
275 	abort();
276 #endif
277       }
278    }
279 }
280 
main()281 int main()
282 {
283   int i;
284   struct vector_struct vec_src, vec_expected, vec_result;
285 
286   vec_src.vec.vbc = (vector bool char){ 0, 1, 0, 0, 1, 1, 0, 0,
287 					0, 1, 1, 1, 0, 0, 0, 0 };
288   vec_expected.vec.vbc = (vector bool char){ 0, 0, 0, 0, 1, 1, 1, 0,
289 					     0, 0, 1, 1, 0, 0, 1, 0 };
290   vec_result.element_size = vec_expected.element_size = 1;
291   vec_result.vector_id = vec_expected.vector_id = VBC;
292   vec_result.vec.vbc = vec_reve (vec_src.vec.vbc);
293   test_results(&vec_result, &vec_expected);
294 
295   vec_src.vec.vsc = (vector signed char){ 0, 1, -2, -3, 4, 5, -6, -7, 8,
296 					  9, -10, -11, 12, 13, -14, -15 };
297   vec_expected.vec.vsc = (vector signed char){ -15, -14, 13, 12, -11, -10,
298 					       9, 8, -7, -6, 5, 4, -3, -2,
299 					       1, 0 };
300   vec_result.element_size = vec_expected.element_size = 1;
301   vec_result.vector_id = vec_expected.vector_id = VSC;
302   vec_result.vec.vsc = vec_reve (vec_src.vec.vsc);
303   test_results (&vec_result, &vec_expected);
304 
305   vec_src.vec.vuc = (vector unsigned char){ 10, 11, 12, 13, 14, 15, 16, 17,
306 					    18, 19, 20, 21, 22, 23, 24, 25 };
307   vec_expected.vec.vuc = (vector unsigned char){ 25, 24, 23, 22, 21, 20,
308 						 19, 18, 17, 16, 15, 14, 13,
309 						 12, 11, 10 };
310   vec_result.element_size = vec_expected.element_size = 1;
311   vec_result.vector_id = vec_expected.vector_id = VUC;
312   vec_result.vec.vuc = vec_reve (vec_src.vec.vuc);
313   test_results (&vec_result, &vec_expected);
314 
315   vec_src.vec.vbs = (vector bool short){ 0, 0, 1, 1, 0, 1, 0, 1 };
316   vec_expected.vec.vbs = (vector bool short){ 1, 0, 1, 0, 1, 1, 0, 0 };
317   vec_result.element_size = vec_expected.element_size = 2;
318   vec_result.vector_id = vec_expected.vector_id = VBS;
319   vec_result.vec.vbs = vec_reve (vec_src.vec.vbs);
320   test_results (&vec_result, &vec_expected);
321 
322   vec_src.vec.vss = (vector signed short){ -1, -2, 3, 4, -5, -6, 7, 8 };
323   vec_expected.vec.vss = (vector signed short){ 8, 7, -6, -5, 4, 3, -2, -1 };
324   vec_result.element_size = vec_expected.element_size = 2;
325   vec_result.vector_id = vec_expected.vector_id = VSS;
326   vec_result.vec.vss = vec_reve (vec_src.vec.vss);
327   test_results (&vec_result, &vec_expected);
328 
329   vec_src.vec.vus = (vector unsigned short){ 11, 22, 33, 44, 55, 66, 77, 88 };
330   vec_expected.vec.vus = (vector unsigned short){ 88, 77, 66, 55,
331 						  44, 33, 22, 11 };
332   vec_result.element_size = vec_expected.element_size = 2;
333   vec_result.vector_id = vec_expected.vector_id = VUS;
334   vec_result.vec.vus = vec_reve (vec_src.vec.vus);
335   test_results (&vec_result, &vec_expected);
336 
337   vec_src.vec.vbi = (vector bool int){ 0, 1, 1, 1 };
338   vec_expected.vec.vbi = (vector bool int){ 1, 1, 1, 0 };
339   vec_result.element_size = vec_expected.element_size = 4;
340   vec_result.vector_id = vec_expected.vector_id = VBI;
341   vec_result.vec.vbi = vec_reve (vec_src.vec.vbi);
342   test_results (&vec_result, &vec_expected);
343 
344   vec_src.vec.vi = (vector signed int){ -1, 3, -5, 1234567 };
345   vec_expected.vec.vi = (vector signed int){1234567, -5, 3, -1};
346   vec_result.element_size = vec_expected.element_size = 4;
347   vec_result.vector_id = vec_expected.vector_id = VI;
348   vec_result.vec.vi = vec_reve (vec_src.vec.vi);
349   test_results (&vec_result, &vec_expected);
350 
351   vec_src.vec.vui = (vector unsigned int){ 9, 11, 15, 2468013579 };
352   vec_expected.vec.vui = (vector unsigned int){2468013579, 15, 11, 9};
353   vec_result.element_size = vec_expected.element_size = 4;
354   vec_result.vector_id = vec_expected.vector_id = VUI;
355   vec_result.vec.vui = vec_reve (vec_src.vec.vui);
356   test_results (&vec_result, &vec_expected);
357 
358   vec_src.vec.vllb = (vector bool long long ){ 0, 1 };
359   vec_expected.vec.vllb = (vector bool long long){1, 0};
360   vec_result.element_size = vec_expected.element_size = 8;
361   vec_result.vector_id = vec_expected.vector_id = VLLB;
362   vec_result.vec.vllb = vec_reve (vec_src.vec.vllb);
363   test_results (&vec_result, &vec_expected);
364 
365   vec_src.vec.vlli = (vector long long int){ -12, -12345678901234 };
366   vec_expected.vec.vlli = (vector long long int){-12345678901234, -12};
367   vec_result.element_size = vec_expected.element_size = 8;
368   vec_result.vector_id = vec_expected.vector_id = VLLI;
369   vec_result.vec.vlli = vec_reve (vec_src.vec.vlli);
370   test_results (&vec_result, &vec_expected);
371 
372   vec_src.vec.vllui = (vector unsigned long long int){ 102, 9753108642 };
373   vec_expected.vec.vllui = (vector unsigned long long int){9753108642, 102};
374   vec_result.element_size = vec_expected.element_size = 8;
375   vec_result.vector_id = vec_expected.vector_id = VLLUI;
376   vec_result.vec.vllui = vec_reve (vec_src.vec.vllui);
377   test_results (&vec_result, &vec_expected);
378 
379   vec_src.vec.vf = (vector float){ -21., 3.5, -53., 78. };
380   vec_expected.vec.vf = (vector float){78., -53, 3.5, -21};
381   vec_result.element_size = vec_expected.element_size = 4;
382   vec_result.vector_id = vec_expected.vector_id = VF;
383   vec_result.vec.vf = vec_reve (vec_src.vec.vf);
384   test_results (&vec_result, &vec_expected);
385 
386   vec_src.vec.vd = (vector double){ 34.0, 97.0 };
387   vec_expected.vec.vd = (vector double){97.0, 34.0};
388   vec_result.element_size = vec_expected.element_size = 8;
389   vec_result.vector_id = vec_expected.vector_id = VD;
390   vec_result.vec.vd = vec_reve (vec_src.vec.vd);
391   test_results (&vec_result, &vec_expected);
392 }
393