FreeBSD: add file descriptor tracking for _umtx_op
[valgrind.git] / none / tests / s390x / vec2.c
blob0d549cb235fb43384eca4f0dd404bb54bce7cb36
1 #include <stdio.h>
3 #define VECTOR __attribute__ ((vector_size (16)))
5 typedef unsigned long VECTOR ulong_v;
6 typedef float VECTOR float_v;
8 static const ulong_v vec_a = { 0x0123456789abcdef, 0xfedcba9876543210 };
9 static const ulong_v vec_b = { 0xfedcba9876543210, 0x0123456789abcdef };
10 static const ulong_v vec_c = { 0x8040201008040201, 0x7fbfdfeff7fbfdfe };
11 static const ulong_v vec_one = { -1, -1 };
12 static const ulong_v vec_ini = { 0x0112233445566778, 0x899aabbccddeeff0 };
14 static const float_v vec_fa = { 16777215., -16777215., 42.5, 10000. };
15 static const float_v vec_fb = { 4., 3., 2., 1. };
17 /* -- Vector shift -- */
19 #define TEST_GENERATE(insn) \
20 static void test_##insn(ulong_v a, ulong_v b) \
21 { \
22 ulong_v out; \
23 __asm__( \
24 #insn " %[out],%[a],%[b]" \
25 : [out] "=v" (out) \
26 : [a] "v" (a), \
27 [b] "v" (b) \
28 : ); \
29 printf("\t%016lx %016lx\n", out[0], out[1]); \
32 #define TEST_EXEC(insn) \
33 do { \
34 puts(#insn); \
35 test_##insn(vec_a, vec_b); \
36 test_##insn(vec_b, vec_a); \
37 test_##insn(vec_c, vec_a); \
38 test_##insn(vec_one, vec_b); \
39 } while (0)
41 #define INSNS \
42 XTEST(vsl); \
43 XTEST(vsrl); \
44 XTEST(vsra);
46 #define XTEST TEST_GENERATE
47 INSNS
48 #undef XTEST
50 static void test_all_single_bitshifts()
52 #define XTEST TEST_EXEC
53 INSNS
54 #undef XTEST
56 #undef INSNS
57 #undef TEST_EXEC
58 #undef TEST_GENERATE
60 /* -- Vector load element-/byte-swapped -- */
62 #define TEST_EXEC(opc1,opc2,insn,m3) \
63 do { \
64 puts(#insn " " #m3); \
65 test_##insn##_##m3(vec_a); \
66 test_##insn##_##m3(vec_b); \
67 } while (0)
69 #define TEST_GENERATE(opc1,opc2,insn,m3) \
70 static void test_##insn##_##m3(ulong_v a) \
71 { \
72 ulong_v out = vec_ini; \
73 __asm__( \
74 ".insn vrx,0x" #opc1 "00000000" #opc2 ",%[out],%[a]," #m3 \
75 : [out] "+v" (out) \
76 : [a] "R" (a) \
77 : ); \
78 printf("\t%016lx %016lx\n", out[0], out[1]); \
81 #define INSNS \
82 XTEST(e6,01, vlebrh, 0); \
83 XTEST(e6,01, vlebrh, 7); \
84 XTEST(e6,01, vlebrh, 2); \
85 XTEST(e6,03, vlebrf, 0); \
86 XTEST(e6,03, vlebrf, 3); \
87 XTEST(e6,03, vlebrf, 1); \
88 XTEST(e6,02, vlebrg, 0); \
89 XTEST(e6,02, vlebrg, 1); \
90 XTEST(e6,04, vllebrz, 1); \
91 XTEST(e6,04, vllebrz, 2); \
92 XTEST(e6,04, vllebrz, 3); \
93 XTEST(e6,04, vllebrz, 6); \
94 XTEST(e6,05, vlbrrep, 1); \
95 XTEST(e6,05, vlbrrep, 2); \
96 XTEST(e6,05, vlbrrep, 3); \
97 XTEST(e6,06, vlbr, 1); \
98 XTEST(e6,06, vlbr, 2); \
99 XTEST(e6,06, vlbr, 3); \
100 XTEST(e6,06, vlbr, 4); \
101 XTEST(e6,07, vler, 1); \
102 XTEST(e6,07, vler, 2); \
103 XTEST(e6,07, vler, 3);
105 #define XTEST TEST_GENERATE
106 INSNS
107 #undef XTEST
109 static void test_all_swapped_loads()
111 #define XTEST TEST_EXEC
112 INSNS
113 #undef XTEST
116 #undef INSNS
117 #undef TEST_GENERATE
119 /* -- Vector store element-/byte-swapped -- */
121 #define TEST_GENERATE(opc1,opc2,insn,m3) \
122 static void test_##insn##_##m3(ulong_v a) \
124 ulong_v out = vec_ini; \
125 __asm__( \
126 ".insn vrx,0x" #opc1 "00000000" #opc2 ",%[a],%[out]," #m3 \
127 : [out] "+R" (out) \
128 : [a] "v" (a) \
129 : ); \
130 printf("\t%016lx %016lx\n", out[0], out[1]); \
133 #define INSNS \
134 XTEST(e6,09, vstebrh, 0); \
135 XTEST(e6,09, vstebrh, 7); \
136 XTEST(e6,09, vstebrh, 2); \
137 XTEST(e6,0b, vstebrf, 0); \
138 XTEST(e6,0b, vstebrf, 3); \
139 XTEST(e6,0b, vstebrf, 1); \
140 XTEST(e6,0a, vstebrg, 0); \
141 XTEST(e6,0a, vstebrg, 1); \
142 XTEST(e6,0e, vstbr, 1); \
143 XTEST(e6,0e, vstbr, 2); \
144 XTEST(e6,0e, vstbr, 3); \
145 XTEST(e6,0e, vstbr, 4); \
146 XTEST(e6,0f, vster, 1); \
147 XTEST(e6,0f, vster, 2); \
148 XTEST(e6,0f, vster, 3);
150 #define XTEST TEST_GENERATE
151 INSNS
152 #undef XTEST
154 static void test_all_swapped_stores()
156 #define XTEST TEST_EXEC
157 INSNS
158 #undef XTEST
161 #undef INSNS
162 #undef TEST_EXEC
163 #undef TEST_GENERATE
165 /* -- Vector shift double by bit -- */
167 #define TEST_GENERATE(opc1,opc2,insn,i4) \
168 static void test_##insn##_##i4(ulong_v a, ulong_v b) \
170 ulong_v out = vec_ini; \
171 __asm__( \
172 ".insn vrr,0x" #opc1 "00000000" #opc2 \
173 ",%[out],%[a],%[b],0," #i4 ",0" \
174 : [out] "+v" (out) \
175 : [a] "v" (a), \
176 [b] "v" (b) \
177 : ); \
178 printf("\t%016lx %016lx\n", out[0], out[1]); \
181 #define TEST_EXEC(opc1,opc2,insn,i4) \
182 do { \
183 puts(#insn " " #i4); \
184 test_##insn##_##i4(vec_a, vec_one); \
185 test_##insn##_##i4(vec_b, vec_a); \
186 } while (0)
188 #define INSNS \
189 XTEST(e7,86,vsld,0); \
190 XTEST(e7,86,vsld,7); \
191 XTEST(e7,86,vsld,4); \
192 XTEST(e7,87,vsrd,0); \
193 XTEST(e7,87,vsrd,7); \
194 XTEST(e7,87,vsrd,4);
196 #define XTEST TEST_GENERATE
197 INSNS
198 #undef XTEST
200 static void test_all_double_bitshifts()
202 #define XTEST TEST_EXEC
203 INSNS
204 #undef XTEST
207 #undef INSNS
208 #undef TEST_EXEC
209 #undef TEST_GENERATE
211 /* -- Vector integer -> FP conversions -- */
213 #define TEST_GENERATE(opc1,opc2,insn,m4) \
214 static void test_##insn##_##m4(ulong_v a) \
216 float_v out; \
217 __asm__( \
218 ".insn vrr,0x" #opc1 "00000000" #opc2 \
219 ",%[out],%[a],0,2," #m4 ",0" \
220 : [out] "=v" (out) \
221 : [a] "v" (a) \
222 : ); \
223 if (m4 & 8) \
224 printf("\t%a - - -\n", out[0]); \
225 else \
226 printf("\t%a %a %a %a\n", out[0], out[1], out[2], out[3]); \
229 #define TEST_EXEC(opc1,opc2,insn,m4) \
230 do { \
231 puts(#insn " " #m4); \
232 test_##insn##_##m4(vec_a); \
233 test_##insn##_##m4(vec_c); \
234 } while (0)
236 #define INSNS \
237 XTEST(e7,c1,vcfpl,0); \
238 XTEST(e7,c1,vcfpl,8); \
239 XTEST(e7,c3,vcfps,0); \
240 XTEST(e7,c3,vcfps,8);
242 #define XTEST TEST_GENERATE
243 INSNS
244 #undef XTEST
246 static void test_all_int_fp_conversions()
248 #define XTEST TEST_EXEC
249 INSNS
250 #undef XTEST
253 #undef INSNS
254 #undef TEST_EXEC
255 #undef TEST_GENERATE
257 /* -- Vector FP -> integer conversions -- */
259 #define TEST_GENERATE(opc1,opc2,insn,m4) \
260 static void test_##insn##_##m4(float_v a) \
262 unsigned int VECTOR out; \
263 __asm__( \
264 ".insn vrr,0x" #opc1 "00000000" #opc2 \
265 ",%[out],%[a],0,2," #m4 ",0" \
266 : [out] "=v" (out) \
267 : [a] "v" (a) \
268 : ); \
269 if (m4 & 8) \
270 printf("\t%08x - - -\n", out[0]); \
271 else \
272 printf("\t%08x %08x %08x %08x\n", \
273 out[0], out[1], out[2], out[3]); \
276 #define TEST_EXEC(opc1,opc2,insn,m4) \
277 do { \
278 puts(#insn " " #m4); \
279 test_##insn##_##m4(vec_fa); \
280 test_##insn##_##m4(vec_fb); \
281 } while (0)
283 #define INSNS \
284 XTEST(e7,c0,vclfp,0); \
285 XTEST(e7,c0,vclfp,8); \
286 XTEST(e7,c2,vcsfp,0); \
287 XTEST(e7,c2,vcsfp,8);
289 #define XTEST TEST_GENERATE
290 INSNS
291 #undef XTEST
293 static void test_all_fp_int_conversions()
295 #define XTEST TEST_EXEC
296 INSNS
297 #undef XTEST
300 #undef INSNS
301 #undef TEST_EXEC
302 #undef TEST_GENERATE
304 /* -- Vector generate mask -- */
306 #define XTEST(insn, i2, i3) \
307 do { \
308 ulong_v out = vec_ini; \
309 puts(#insn " " #i2 "," #i3); \
310 __asm__(#insn " %[out]," #i2 "," #i3 : [out] "+v"(out) : :); \
311 printf("\t%016lx %016lx\n", out[0], out[1]); \
312 } while (0)
314 static void test_all_generate_mask()
316 XTEST(vgmb, 2, 1);
317 XTEST(vgmb, 0xf7, 0x30);
318 XTEST(vgmb, 0, 0);
319 XTEST(vgmh, 3, 2);
320 XTEST(vgmh, 15, 15);
321 XTEST(vgmf, 4, 3);
322 XTEST(vgmf, 16, 17);
323 XTEST(vgmg, 55, 63);
324 XTEST(vgmg, 43, 55);
325 XTEST(vgmg, 63, 2);
328 #undef XTEST
330 int main()
332 test_all_single_bitshifts();
333 test_all_swapped_loads();
334 test_all_swapped_stores();
335 test_all_double_bitshifts();
336 test_all_int_fp_conversions();
337 test_all_fp_int_conversions();
338 test_all_generate_mask();
339 return 0;