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) \
24 #insn " %[out],%[a],%[b]" \
29 printf("\t%016lx %016lx\n", out[0], out[1]); \
32 #define TEST_EXEC(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); \
46 #define XTEST TEST_GENERATE
50 static void test_all_single_bitshifts()
52 #define XTEST TEST_EXEC
60 /* -- Vector load element-/byte-swapped -- */
62 #define TEST_EXEC(opc1,opc2,insn,m3) \
64 puts(#insn " " #m3); \
65 test_##insn##_##m3(vec_a); \
66 test_##insn##_##m3(vec_b); \
69 #define TEST_GENERATE(opc1,opc2,insn,m3) \
70 static void test_##insn##_##m3(ulong_v a) \
72 ulong_v out = vec_ini; \
74 ".insn vrx,0x" #opc1 "00000000" #opc2 ",%[out],%[a]," #m3 \
78 printf("\t%016lx %016lx\n", out[0], out[1]); \
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
109 static void test_all_swapped_loads()
111 #define XTEST TEST_EXEC
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; \
126 ".insn vrx,0x" #opc1 "00000000" #opc2 ",%[a],%[out]," #m3 \
130 printf("\t%016lx %016lx\n", out[0], out[1]); \
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
154 static void test_all_swapped_stores()
156 #define XTEST TEST_EXEC
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; \
172 ".insn vrr,0x" #opc1 "00000000" #opc2 \
173 ",%[out],%[a],%[b],0," #i4 ",0" \
178 printf("\t%016lx %016lx\n", out[0], out[1]); \
181 #define TEST_EXEC(opc1,opc2,insn,i4) \
183 puts(#insn " " #i4); \
184 test_##insn##_##i4(vec_a, vec_one); \
185 test_##insn##_##i4(vec_b, vec_a); \
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); \
196 #define XTEST TEST_GENERATE
200 static void test_all_double_bitshifts()
202 #define XTEST TEST_EXEC
211 /* -- Vector integer -> FP conversions -- */
213 #define TEST_GENERATE(opc1,opc2,insn,m4) \
214 static void test_##insn##_##m4(ulong_v a) \
218 ".insn vrr,0x" #opc1 "00000000" #opc2 \
219 ",%[out],%[a],0,2," #m4 ",0" \
224 printf("\t%a - - -\n", out[0]); \
226 printf("\t%a %a %a %a\n", out[0], out[1], out[2], out[3]); \
229 #define TEST_EXEC(opc1,opc2,insn,m4) \
231 puts(#insn " " #m4); \
232 test_##insn##_##m4(vec_a); \
233 test_##insn##_##m4(vec_c); \
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
246 static void test_all_int_fp_conversions()
248 #define XTEST TEST_EXEC
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; \
264 ".insn vrr,0x" #opc1 "00000000" #opc2 \
265 ",%[out],%[a],0,2," #m4 ",0" \
270 printf("\t%08x - - -\n", out[0]); \
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) \
278 puts(#insn " " #m4); \
279 test_##insn##_##m4(vec_fa); \
280 test_##insn##_##m4(vec_fb); \
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
293 static void test_all_fp_int_conversions()
295 #define XTEST TEST_EXEC
304 /* -- Vector generate mask -- */
306 #define XTEST(insn, i2, i3) \
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]); \
314 static void test_all_generate_mask()
317 XTEST(vgmb
, 0xf7, 0x30);
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();