[RS6000] dg-do !compile and scan-assembler
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / vec-blend-runnable.c
blobd63dfeec5686fd0415904c85937a0ded630dfdff
1 /* { dg-do run { target { power10_hw } } } */
2 /* { dg-do link { target { ! power10_hw } } } */
3 /* { dg-require-effective-target power10_ok } */
4 /* { dg-options "-mdejagnu-cpu=power10 -save-temps" } */
5 #include <altivec.h>
7 #define DEBUG 0
9 #if DEBUG
10 #include <stdio.h>
11 #endif
13 extern void abort (void);
15 int
16 main (int argc, char *argv [])
18 int i;
19 vector signed char vsrc_a_char, vsrc_b_char;
20 vector signed char vresult_char;
21 vector signed char expected_vresult_char;
23 vector unsigned char vsrc_a_uchar, vsrc_b_uchar, vsrc_c_uchar;
24 vector unsigned char vresult_uchar;
25 vector unsigned char expected_vresult_uchar;
27 vector signed short vsrc_a_short, vsrc_b_short, vsrc_c_short;
28 vector signed short vresult_short;
29 vector signed short expected_vresult_short;
31 vector unsigned short vsrc_a_ushort, vsrc_b_ushort, vsrc_c_ushort;
32 vector unsigned short vresult_ushort;
33 vector unsigned short expected_vresult_ushort;
35 vector int vsrc_a_int, vsrc_b_int, vsrc_c_int;
36 vector int vresult_int;
37 vector int expected_vresult_int;
39 vector unsigned int vsrc_a_uint, vsrc_b_uint, vsrc_c_uint;
40 vector unsigned int vresult_uint;
41 vector unsigned int expected_vresult_uint;
43 vector long long int vsrc_a_ll, vsrc_b_ll, vsrc_c_ll;
44 vector long long int vresult_ll;
45 vector long long int expected_vresult_ll;
47 vector unsigned long long int vsrc_a_ull, vsrc_b_ull, vsrc_c_ull;
48 vector unsigned long long int vresult_ull;
49 vector unsigned long long int expected_vresult_ull;
51 vector float vresult_f;
52 vector float expected_vresult_f;
53 vector float vsrc_a_f, vsrc_b_f;
55 vector double vsrc_a_d, vsrc_b_d;
56 vector double vresult_d;
57 vector double expected_vresult_d;
59 /* Vector blend */
60 vsrc_c_uchar = (vector unsigned char) { 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80,
61 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80 };
63 vsrc_a_char = (vector signed char) { -1, 3, 5, 7, 9, 11, 13, 15,
64 17, 19, 21, 23, 25, 27, 29 };
65 vsrc_b_char = (vector signed char) { 2, -4, 6, 8, 10, 12, 14, 16,
66 18, 20, 22, 24, 26, 28, 30, 32 };
67 vsrc_c_uchar = (vector unsigned char) { 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80,
68 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80 };
69 vresult_char = (vector signed char) { 0, 0, 0, 0, 0, 0, 0, 0,
70 0, 0, 0, 0, 0, 0, 0, 0 };
71 expected_vresult_char = (vector signed char) { -1, -4, 5, 8,
72 9, 12, 13, 16,
73 17, 20, 21, 24,
74 25, 28, 29, 32 };
76 vresult_char = vec_blendv (vsrc_a_char, vsrc_b_char, vsrc_c_uchar);
78 if (!vec_all_eq (vresult_char, expected_vresult_char)) {
79 #if DEBUG
80 printf("ERROR, vec_blendv (vsrc_a_char, vsrc_b_char, vsrc_c_uchar)\n");
81 for(i = 0; i < 16; i++)
82 printf(" vresult_char[%d] = %d, expected_vresult_char[%d] = %d\n",
83 i, vresult_char[i], i, expected_vresult_char[i]);
84 #else
85 abort();
86 #endif
89 vsrc_a_uchar = (vector unsigned char) { 1, 3, 5, 7, 9, 11, 13, 15,
90 17, 19, 21, 23, 25, 27, 29 };
91 vsrc_b_uchar = (vector unsigned char) { 2, 4, 6, 8, 10, 12, 14, 16,
92 18, 20, 22, 24, 26, 28, 30, 32 };
93 vsrc_c_uchar = (vector unsigned char) { 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80,
94 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80 };
95 vresult_uchar = (vector unsigned char) { 0, 0, 0, 0, 0, 0, 0, 0,
96 0, 0, 0, 0, 0, 0, 0, 0 };
97 expected_vresult_uchar = (vector unsigned char) { 1, 4, 5, 8,
98 9, 12, 13, 16,
99 17, 20, 21, 24,
100 25, 28, 29, 32 };
102 vresult_uchar = vec_blendv (vsrc_a_uchar, vsrc_b_uchar, vsrc_c_uchar);
104 if (!vec_all_eq (vresult_uchar, expected_vresult_uchar)) {
105 #if DEBUG
106 printf("ERROR, vec_blendv (vsrc_a_uchar, vsrc_b_uchar, vsrc_c_uchar)\n");
107 for(i = 0; i < 16; i++)
108 printf(" vresult_uchar[%d] = %d, expected_vresult_uchar[%d] = %d\n",
109 i, vresult_uchar[i], i, expected_vresult_uchar[i]);
110 #else
111 abort();
112 #endif
115 vsrc_a_short = (vector signed short) { -1, 3, 5, 7, 9, 11, 13, 15 };
116 vsrc_b_short = (vector signed short) { 2, -4, 6, 8, 10, 12, 14, 16 };
117 vsrc_c_ushort = (vector unsigned short) { 0, 0x8000, 0, 0x8000,
118 0, 0x8000, 0, 0x8000 };
119 vresult_short = (vector signed short) { 0, 0, 0, 0, 0, 0, 0, 0 };
120 expected_vresult_short = (vector signed short) { -1, -4, 5, 8,
121 9, 12, 13, 16 };
123 vresult_short = vec_blendv (vsrc_a_short, vsrc_b_short, vsrc_c_ushort);
125 if (!vec_all_eq (vresult_short, expected_vresult_short)) {
126 #if DEBUG
127 printf("ERROR, vec_blendv (vsrc_a_short, vsrc_b_short, vsrc_c_ushort)\n");
128 for(i = 0; i < 8; i++)
129 printf(" vresult_short[%d] = %d, expected_vresult_short[%d] = %d\n",
130 i, vresult_short[i], i, expected_vresult_short[i]);
131 #else
132 abort();
133 #endif
136 vsrc_a_ushort = (vector unsigned short) { 1, 3, 5, 7, 9, 11, 13, 15 };
137 vsrc_b_ushort = (vector unsigned short) { 2, 4, 6, 8, 10, 12, 14, 16 };
138 vsrc_c_ushort = (vector unsigned short) { 0, 0x8000, 0, 0x8000,
139 0, 0x8000, 0, 0x8000 };
140 vresult_ushort = (vector unsigned short) { 0, 0, 0, 0, 0, 0, 0, 0 };
141 expected_vresult_ushort = (vector unsigned short) { 1, 4, 5, 8,
142 9, 12, 13, 16 };
144 vresult_ushort = vec_blendv (vsrc_a_ushort, vsrc_b_ushort, vsrc_c_ushort);
146 if (!vec_all_eq (vresult_ushort, expected_vresult_ushort)) {
147 #if DEBUG
148 printf("ERROR, vec_blendv (vsrc_a_ushort, vsrc_b_ushort, "
149 "vsrc_c_ushort)\n");
150 for(i = 0; i < 8; i++)
151 printf(" vresult_ushort[%d] = %d, expected_vresult_ushort[%d] = %d\n",
152 i, vresult_ushort[i], i, expected_vresult_ushort[i]);
153 #else
154 abort();
155 #endif
158 vsrc_a_int = (vector signed int) { -1, -3, -5, -7 };
159 vsrc_b_int = (vector signed int) { 2, 4, 6, 8 };
160 vsrc_c_uint = (vector unsigned int) { 0, 0x80000000, 0, 0x80000000};
161 vresult_int = (vector signed int) { 0, 0, 0, 0 };
162 expected_vresult_int = (vector signed int) { -1, 4, -5, 8 };
164 vresult_int = vec_blendv (vsrc_a_int, vsrc_b_int, vsrc_c_uint);
166 if (!vec_all_eq (vresult_int, expected_vresult_int)) {
167 #if DEBUG
168 printf("ERROR, vec_blendv (vsrc_a_int, vsrc_b_int, vsrc_c_uint)\n");
169 for(i = 0; i < 4; i++)
170 printf(" vresult_int[%d] = %d, expected_vresult_int[%d] = %d\n",
171 i, vresult_int[i], i, expected_vresult_int[i]);
172 #else
173 abort();
174 #endif
177 vsrc_a_uint = (vector unsigned int) { 1, 3, 5, 7 };
178 vsrc_b_uint = (vector unsigned int) { 2, 4, 6, 8 };
179 vsrc_c_uint = (vector unsigned int) { 0, 0x80000000, 0, 0x80000000 };
180 vresult_uint = (vector unsigned int) { 0, 0, 0, 0 };
181 expected_vresult_uint = (vector unsigned int) { 1, 4, 5, 8 };
183 vresult_uint = vec_blendv (vsrc_a_uint, vsrc_b_uint, vsrc_c_uint);
185 if (!vec_all_eq (vresult_uint, expected_vresult_uint)) {
186 #if DEBUG
187 printf("ERROR, vec_blendv (vsrc_a_uint, vsrc_b_uint, vsrc_c_uint)\n");
188 for(i = 0; i < 4; i++)
189 printf(" vresult_uint[%d] = %d, expected_vresult_uint[%d] = %d\n",
190 i, vresult_uint[i], i, expected_vresult_uint[i]);
191 #else
192 abort();
193 #endif
196 vsrc_a_ll = (vector signed long long int) { -1, -3 };
197 vsrc_b_ll = (vector signed long long int) { 2, 4, };
198 vsrc_c_ull = (vector unsigned long long int) { 0, 0x8000000000000000ULL };
199 vresult_ll = (vector signed long long int) { 0, 0 };
200 expected_vresult_ll = (vector signed long long int) { -1, 4 };
202 vresult_ll = vec_blendv (vsrc_a_ll, vsrc_b_ll, vsrc_c_ull);
204 if (!vec_all_eq (vresult_ll, expected_vresult_ll)) {
205 #if DEBUG
206 printf("ERROR, vec_blendv (vsrc_a_ll, vsrc_b_ll, vsrc_c_ull)\n");
207 for(i = 0; i < 2; i++)
208 printf(" vresult_ll[%d] = %d, expected_vresult_ll[%d] = %d\n",
209 i, vresult_ll[i], i, expected_vresult_ll[i]);
210 #else
211 abort();
212 #endif
215 vsrc_a_ull = (vector unsigned long long) { 1, 3 };
216 vsrc_b_ull = (vector unsigned long long) { 2, 4 };
217 vsrc_c_ull = (vector unsigned long long int) { 0, 0x8000000000000000ULL };
218 vresult_ull = (vector unsigned long long) { 0, 0 };
219 expected_vresult_ull = (vector unsigned long long) { 1, 4 };
221 vresult_ull = vec_blendv (vsrc_a_ull, vsrc_b_ull, vsrc_c_ull);
223 if (!vec_all_eq (vresult_ull, expected_vresult_ull)) {
224 #if DEBUG
225 printf("ERROR, vec_blendv (vsrc_a_ull, vsrc_b_ull, vsrc_c_ull)\n");
226 for(i = 0; i < 2; i++)
227 printf(" vresult_ull[%d] = %d, expected_vresult_ull[%d] = %d\n",
228 i, vresult_ull[i], i, expected_vresult_ull[i]);
229 #else
230 abort();
231 #endif
234 vsrc_a_f = (vector float) { -1.0, -3.0, -5.0, -7.0 };
235 vsrc_b_f = (vector float) { 2.0, 4.0, 6.0, 8.0 };
236 vsrc_c_uint = (vector unsigned int) { 0, 0x80000000, 0, 0x80000000};
237 vresult_f = (vector float) { 0, 0, 0, 0 };
238 expected_vresult_f = (vector float) { -1, 4, -5, 8 };
240 vresult_f = vec_blendv (vsrc_a_f, vsrc_b_f, vsrc_c_uint);
242 if (!vec_all_eq (vresult_f, expected_vresult_f)) {
243 #if DEBUG
244 printf("ERROR, vec_blendv (vsrc_a_f, vsrc_b_f, vsrc_c_uint)\n");
245 for(i = 0; i < 4; i++)
246 printf(" vresult_f[%d] = %d, expected_vresult_f[%d] = %d\n",
247 i, vresult_f[i], i, expected_vresult_f[i]);
248 #else
249 abort();
250 #endif
253 vsrc_a_d = (vector double) { -1.0, -3.0 };
254 vsrc_b_d = (vector double) { 2.0, 4.0 };
255 vsrc_c_ull = (vector unsigned long long int) { 0, 0x8000000000000000ULL };
256 vresult_d = (vector double) { 0, 0 };
257 expected_vresult_d = (vector double) { -1, 4 };
259 vresult_d = vec_blendv (vsrc_a_d, vsrc_b_d, vsrc_c_ull);
261 if (!vec_all_eq (vresult_d, expected_vresult_d)) {
262 #if DEBUG
263 printf("ERROR, vec_blendv (vsrc_a_d, vsrc_b_d, vsrc_c_ull)\n");
264 for(i = 0; i < 4; i++)
265 printf(" vresult_d[%d] = %d, expected_vresult_d[%d] = %d\n",
266 i, vresult_d[i], i, expected_vresult_d[i]);
267 #else
268 abort();
269 #endif
272 return 0;
275 /* { dg-final { scan-assembler-times {\mxxblendvb\M} 2 } } */
276 /* { dg-final { scan-assembler-times {\mxxblendvh\M} 2 } } */
277 /* { dg-final { scan-assembler-times {\mxxblendvw\M} 3 } } */
278 /* { dg-final { scan-assembler-times {\mxxblendvd\M} 3 } } */