1 /* { dg-do run { target { powerpc*-*-linux* && { p8vector_hw } } } } */
2 /* { dg-require-effective-target p8vector_hw } */
3 /* { dg-options "-mdejagnu-cpu=power8" } */
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_result_sp(int check,vector float vec_result,vector float vec_expected)83 void test_result_sp(int check, vector float vec_result,
84 		    vector float vec_expected)
85 {
86 	int i;
87 	for(i = 0; i<4; i++) {
88 
89 		switch (check) {
90 		case ALL:
91 			break;
92 		case EVEN:
93 			if (i%2 == 0)
94 				break;
95 			else
96 				continue;
97 		case ODD:
98 			if (i%2 != 0)
99 				break;
100 			else
101 				continue;
102 		}
103 
104 		if (vec_result[i] != vec_expected[i]) {
105 #ifdef DEBUG
106 			printf("Test_result_sp: ");
107 			printf("vec_result[%d] (%f) != vec_expected[%d] (%f)\n",
108 			       i, vec_result[i], i, vec_expected[i]);
109 #else
110 			abort();
111 #endif
112 		}
113 	}
114 }
115 
main()116 int main()
117 {
118 	int i;
119 	vector unsigned int vec_unint, vec_uns_int_expected, vec_uns_int_result;
120 	vector signed int vec_int, vec_int_expected, vec_int_result;
121 	vector float  vec_flt, vec_flt_result, vec_flt_expected;
122 	vector long long int vec_ll_int0, vec_ll_int1;
123 	vector long long unsigned int vec_ll_uns_int0, vec_ll_uns_int1;
124 	vector double vec_dble0, vec_dble1, vec_dble_result, vec_dble_expected;
125 
126 	vec_ll_int0 = (vector long long int){ -12, -12345678901234 };
127 	vec_ll_int1 = (vector long long int){ 12, 9876543210 };
128 	vec_ll_uns_int0 = (vector unsigned long long int){ 102, 9753108642 };
129 	vec_ll_uns_int1 = (vector unsigned long long int){ 23, 29 };
130 
131 	/* Convert two double precision vector float to vector int */
132 	vec_dble0 = (vector double){-124.930, 81234.49};
133 	vec_dble1 = (vector double){-24.370, 8354.99};
134 	vec_int_expected = (vector signed int){-124, 81234, -24, 8354};
135 	vec_int_result = vec_signed2 (vec_dble0, vec_dble1);
136 	test_int_result (ALL, vec_int_result, vec_int_expected);
137 
138 	/* Convert two double precision vector float to vector unsigned int */
139 	vec_dble0 = (vector double){124.930, 8134.49};
140 	vec_dble1 = (vector double){24.370, 834.99};
141 	vec_uns_int_expected = (vector unsigned int){124, 8134, 24, 834};
142 	vec_uns_int_result = vec_unsigned2 (vec_dble0, vec_dble1);
143 	test_unsigned_int_result (ALL, vec_uns_int_result,
144 				  vec_uns_int_expected);
145 
146 	/* conversion of two double precision vectors to single precision vector */
147 	vec_flt_expected = (vector float){-12.00, -12345678901234.00, 12.00, 9876543210.00};
148 	vec_flt_result = vec_float2 (vec_ll_int0, vec_ll_int1);
149 	test_result_sp(ALL, vec_flt_result, vec_flt_expected);
150 
151 	vec_flt_expected = (vector float){102.00, 9753108642.00, 23.00, 29.00};
152 	vec_flt_result = vec_float2 (vec_ll_uns_int0, vec_ll_uns_int1);
153 	test_result_sp(ALL, vec_flt_result, vec_flt_expected);
154 
155 	vec_dble0 = (vector double){ 34.0, 97.0 };
156 	vec_dble1 = (vector double){ 214.0, -5.5 };
157 	vec_flt_expected = (vector float){34.0, 97.0, 214.0, -5.5};
158 	vec_flt_result = vec_float2 (vec_dble0, vec_dble1);
159 	test_result_sp(ALL, vec_flt_result, vec_flt_expected);
160 }
161 
162