1 /* { dg-do run { target { vsx_hw } } } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-options "-maltivec -mvsx" } */
4 
5 #include <altivec.h> // vector
6 
7 #ifdef DEBUG
8 #include <stdio.h>
9 #endif
10 
11 #define ALL  1
12 #define EVEN 2
13 #define ODD  3
14 
15 void abort (void);
16 
test_int_result(int check,vector int vec_result,vector int vec_expected)17 void test_int_result(int check, vector int vec_result, vector int vec_expected)
18 {
19 	int i;
20 
21 	for (i = 0; i < 4; i++) {
22 		switch (check) {
23 		case ALL:
24 			break;
25 		case EVEN:
26 			if (i%2 == 0)
27 				break;
28 			else
29 				continue;
30 		case ODD:
31 			if (i%2 != 0)
32 				break;
33 			else
34 				continue;
35 		}
36 
37 		if (vec_result[i] != vec_expected[i]) {
38 #ifdef DEBUG
39 			printf("Test_int_result: ");
40 			printf("vec_result[%d] (%d) != vec_expected[%d] (%d)\n",
41 			       i, vec_result[i], i, vec_expected[i]);
42 #else
43 			abort();
44 #endif
45 		}
46 	}
47 }
48 
test_unsigned_int_result(int check,vector unsigned int vec_result,vector unsigned int vec_expected)49 void test_unsigned_int_result(int check, vector unsigned int vec_result,
50 			      vector unsigned int vec_expected)
51 {
52 	int i;
53 
54 	for (i = 0; i < 4; i++) {
55 		switch (check) {
56 		case ALL:
57 			break;
58 		case EVEN:
59 			if (i%2 == 0)
60 				break;
61 			else
62 				continue;
63 		case ODD:
64 			if (i%2 != 0)
65 				break;
66 			else
67 				continue;
68 		}
69 
70 		if (vec_result[i] != vec_expected[i]) {
71 #ifdef DEBUG
72 			printf("Test_unsigned int_result: ");
73 			printf("vec_result[%d] (%d) != vec_expected[%d] (%d)\n",
74 			       i, vec_result[i], i, vec_expected[i]);
75 #else
76 			abort();
77 #endif
78 		}
79 
80 	}
81 }
82 
test_ll_int_result(vector long long int vec_result,vector long long int vec_expected)83 void test_ll_int_result(vector long long int vec_result,
84 			vector long long int vec_expected)
85 {
86 	int i;
87 
88 	for (i = 0; i < 2; i++)
89 		if (vec_result[i] != vec_expected[i]) {
90 #ifdef DEBUG
91 			printf("Test_ll_int_result: ");
92 			printf("vec_result[%d] (%lld) != vec_expected[%d] (%lld)\n",
93 			       i, vec_result[i], i, vec_expected[i]);
94 #else
95 			abort();
96 #endif
97 		}
98 }
99 
test_ll_unsigned_int_result(vector long long unsigned int vec_result,vector long long unsigned int vec_expected)100 void test_ll_unsigned_int_result(vector long long unsigned int vec_result,
101 				 vector long long unsigned int vec_expected)
102 {
103 	int i;
104 
105 	for (i = 0; i < 2; i++)
106 		if (vec_result[i] != vec_expected[i]) {
107 #ifdef DEBUG
108 			printf("Test_ll_unsigned_int_result: ");
109 			printf("vec_result[%d] (%lld) != vec_expected[%d] (%lld)\n",
110 			       i, vec_result[i], i, vec_expected[i]);
111 #else
112 			abort();
113 #endif
114 		}
115 }
116 
test_result_sp(int check,vector float vec_result,vector float vec_expected)117 void test_result_sp(int check, vector float vec_result,
118 		    vector float vec_expected)
119 {
120 	int i;
121 	for(i = 0; i<4; i++) {
122 
123 		switch (check) {
124 		case ALL:
125 			break;
126 		case EVEN:
127 			if (i%2 == 0)
128 				break;
129 			else
130 				continue;
131 		case ODD:
132 			if (i%2 != 0)
133 				break;
134 			else
135 				continue;
136 		}
137 
138 		if (vec_result[i] != vec_expected[i]) {
139 #ifdef DEBUG
140 			printf("Test_result_sp: ");
141 			printf("vec_result[%d] (%f) != vec_expected[%d] (%f)\n",
142 			       i, vec_result[i], i, vec_expected[i]);
143 #else
144 			abort();
145 #endif
146 		}
147 	}
148 }
149 
test_result_dp(vector double vec_result,vector double vec_expected)150 void test_result_dp(vector double vec_result, vector double vec_expected)
151 {
152 	if (vec_result[0] != vec_expected[0]) {
153 #ifdef DEBUG
154 		printf("Test_result_dp: ");
155 		printf("vec_result[0] (%f) != vec_expected[0] (%f)\n",
156 		       vec_result[0], vec_expected[0]);
157 #else
158 		abort();
159 #endif
160 	}
161 
162 	if (vec_result[1] != vec_expected[1]) {
163 #ifdef DEBUG
164 		printf("Test_result_dp: ");
165 		printf("vec_result[1] (%lld) != vec_expected[1] (%lld)\n",
166 		       vec_result[1], vec_expected[1]);
167 #else
168 		abort();
169 #endif
170 	}
171 }
172 
main()173 int main()
174 {
175 	int i;
176 	vector unsigned int vec_unint, vec_uns_int_expected, vec_uns_int_result;
177 	vector signed int vec_int, vec_int_expected, vec_int_result;
178 	vector long long int vec_ll_int0, vec_ll_int1;
179 	vector long long int vec_ll_int_expected, vec_ll_int_result;
180 	vector long long unsigned int vec_ll_uns_int0, vec_ll_uns_int1;
181 	vector long long unsigned int vec_ll_uns_int_expected, vec_ll_uns_int_result;
182 	vector float  vec_flt0, vec_flt1, vec_flt_result, vec_flt_expected;
183 	vector double vec_dble0, vec_dble1, vec_dble_result, vec_dble_expected;
184 
185 	vec_int = (vector signed int){ -1, 3, -5, 1234567 };
186 	vec_ll_int0 = (vector long long int){ -12, -12345678901234 };
187 	vec_ll_int1 = (vector long long int){ 12, 9876543210 };
188 	vec_unint = (vector unsigned int){ 9, 11, 15, 2468013579 };
189 	vec_ll_uns_int0 = (vector unsigned long long int){ 102, 9753108642 };
190 	vec_ll_uns_int1 = (vector unsigned long long int){ 23, 29 };
191 	vec_flt0 = (vector float){ -21., 3.5, -53., 78. };
192 	vec_dble0 = (vector double){ 34.0, 97.0 };
193 	vec_dble1 = (vector double){ 214.0, -5.5 };
194 
195 	/* conversion of words 0 and 2 */
196 	vec_dble_expected = (vector double){-1.000000, -5.000000};
197 	vec_dble_result = vec_doublee (vec_int);
198 	test_result_dp(vec_dble_result, vec_dble_expected);
199 
200 	vec_dble_expected = (vector double){9.000000, 15.000000};
201 	vec_dble_result = vec_doublee (vec_unint);
202 	test_result_dp(vec_dble_result, vec_dble_expected);
203 
204 	vec_dble_expected = (vector double){-21.000000, -53.000000};
205 	vec_dble_result = vec_doublee (vec_flt0);
206 	test_result_dp(vec_dble_result, vec_dble_expected);
207 
208 
209 	/* conversion of words 1 and 3 */
210 	vec_dble_expected = (vector double){3.000000, 1234567.000000};
211 	vec_dble_result = vec_doubleo (vec_int);
212 	test_result_dp(vec_dble_result, vec_dble_expected);
213 
214 	vec_dble_expected = (vector double){11.000000, 2468013579.000000};
215 	vec_dble_result = vec_doubleo (vec_unint);
216 	test_result_dp(vec_dble_result, vec_dble_expected);
217 
218 	vec_dble_expected = (vector double){3.500000, 78.000000};
219 	vec_dble_result = vec_doubleo (vec_flt0);
220 	test_result_dp(vec_dble_result, vec_dble_expected);
221 
222 
223 	/* conversion of words 0 and 1 */
224 	vec_dble_expected = (vector double){-5.000000, 1234567.000000};
225 	vec_dble_result = vec_doublel (vec_int);
226 	test_result_dp(vec_dble_result, vec_dble_expected);
227 
228 	vec_dble_expected = (vector double){15.000000, 2468013579.000000};
229 	vec_dble_result = vec_doublel (vec_unint);
230 	test_result_dp(vec_dble_result, vec_dble_expected);
231 
232 	vec_dble_expected = (vector double){-53.000000, 78.000000};
233 	vec_dble_result = vec_doublel (vec_flt0);
234 	test_result_dp(vec_dble_result, vec_dble_expected);
235 
236 
237 	/* conversion of words 2 and 3 */
238 	vec_dble_expected = (vector double){-1.000000, 3.000000};
239 	vec_dble_result = vec_doubleh (vec_int);
240 	test_result_dp(vec_dble_result, vec_dble_expected);
241 
242 	vec_dble_expected = (vector double){9.000000, 11.000000};
243 	vec_dble_result = vec_doubleh (vec_unint);
244 	test_result_dp(vec_dble_result, vec_dble_expected);
245 
246 	vec_dble_expected = (vector double){-21.000000, 3.500000};
247 	vec_dble_result = vec_doubleh (vec_flt0);
248 	test_result_dp(vec_dble_result, vec_dble_expected);
249 
250 	/* conversion of integer vector to single precision float vector */
251 	vec_flt_expected = (vector float){-1.00, 3.00, -5.00, 1234567.00};
252 	vec_flt_result = vec_float (vec_int);
253 	test_result_sp(ALL, vec_flt_result, vec_flt_expected);
254 
255 	vec_flt_expected = (vector float){9.00, 11.00, 15.00, 2468013579.0};
256 	vec_flt_result = vec_float (vec_unint);
257 	test_result_sp(ALL, vec_flt_result, vec_flt_expected);
258 
259 	/* conversion of even words in double precision vector to single precision vector */
260 	vec_flt_expected = (vector float){-12.00, 00.00, -12345678901234.00, 0.00};
261 	vec_flt_result = vec_floate (vec_ll_int0);
262 	test_result_sp(EVEN, vec_flt_result, vec_flt_expected);
263 
264 	vec_flt_expected = (vector float){102.00, 0.00, 9753108642.00, 0.00};
265 	vec_flt_result = vec_floate (vec_ll_uns_int0);
266 	test_result_sp(EVEN, vec_flt_result, vec_flt_expected);
267 
268 	vec_flt_expected = (vector float){34.00, 0.00, 97.00, 0.00};
269 	vec_flt_result = vec_floate (vec_dble0);
270 	test_result_sp(EVEN, vec_flt_result, vec_flt_expected);
271 
272 	/* conversion of odd words in double precision vector to single precision vector */
273 	vec_flt_expected = (vector float){0.00, -12.00, 00.00, -12345678901234.00};
274 	vec_flt_result = vec_floato (vec_ll_int0);
275 	test_result_sp(ODD, vec_flt_result, vec_flt_expected);
276 
277 	vec_flt_expected = (vector float){0.00, 102.00, 0.00, 9753108642.00};
278 	vec_flt_result = vec_floato (vec_ll_uns_int0);
279 	test_result_sp(ODD, vec_flt_result, vec_flt_expected);
280 
281 	vec_flt_expected = (vector float){0.00, 34.00, 0.00, 97.00};
282 	vec_flt_result = vec_floato (vec_dble0);
283 	test_result_sp(ODD, vec_flt_result, vec_flt_expected);
284 
285 	/* Convert single precision float to int */
286 	vec_flt0 = (vector float){-14.30, 34.00, 22.00, 97.00};
287 	vec_int_expected = (vector signed int){-14, 34, 22, 97};
288 	vec_int_result = vec_signed (vec_flt0);
289 	test_int_result (ALL, vec_int_result, vec_int_expected);
290 
291 	/* Convert double precision float to long long int */
292 	vec_dble0 = (vector double){-124.930, 81234.49};
293 	vec_ll_int_expected = (vector long long signed int){-124, 81234};
294 	vec_ll_int_result = vec_signed (vec_dble0);
295 	test_ll_int_result (vec_ll_int_result, vec_ll_int_expected);
296 
297 	/* Convert double precision vector float to vector int, even words */
298 	vec_dble0 = (vector double){-124.930, 81234.49};
299 	vec_int_expected = (vector signed int){-124, 0, 81234, 0};
300 	vec_int_result = vec_signede (vec_dble0);
301 	test_int_result (EVEN, vec_int_result, vec_int_expected);
302 
303 	/* Convert double precision vector float to vector int, odd words */
304 	vec_dble0 = (vector double){-124.930, 81234.49};
305 	vec_int_expected = (vector signed int){0, -124, 0, 81234};
306 	vec_int_result = vec_signedo (vec_dble0);
307 	test_int_result (ODD, vec_int_result, vec_int_expected);
308 
309 	/* Convert single precision float to  unsigned int */
310 	vec_flt0 = (vector float){124.930, 8134.49, 23.3, 45.4};
311 	vec_uns_int_expected = (vector unsigned int){124, 8134, 23, 45};
312 	vec_uns_int_result = vec_unsigned (vec_flt0);
313 	test_unsigned_int_result (ALL, vec_uns_int_result,
314 				  vec_uns_int_expected);
315 
316 	/* Convert double precision float to long long unsigned int */
317 	vec_dble0 = (vector double){124.930, 8134.49};
318 	vec_ll_uns_int_expected = (vector long long unsigned int){124, 8134};
319 	vec_ll_uns_int_result = vec_unsigned (vec_dble0);
320 	test_ll_unsigned_int_result (vec_ll_uns_int_result,
321 				     vec_ll_uns_int_expected);
322 
323 	/* Convert double precision vector float to vector unsigned int,
324 	   even words */
325 	vec_dble0 = (vector double){3124.930, 8234.49};
326 	vec_uns_int_expected = (vector unsigned int){3124, 0, 8234, 0};
327 	vec_uns_int_result = vec_unsignede (vec_dble0);
328 	test_unsigned_int_result (EVEN, vec_uns_int_result,
329 				  vec_uns_int_expected);
330 
331 	/* Convert double precision vector float to vector unsigned int,
332 	   odd words */
333 	vec_dble0 = (vector double){1924.930, 81234.49};
334 	vec_uns_int_expected = (vector unsigned int){0, 1924, 0, 81234};
335 	vec_uns_int_result = vec_unsignedo (vec_dble0);
336 	test_unsigned_int_result (ODD, vec_uns_int_result,
337 				  vec_uns_int_expected);
338 }
339 
340