blob: cf8d571c3d734eacb90dbd4130005c365fffd3f9 [file] [log] [blame]
sewardj918345e2006-02-12 18:56:16 +00001
2#include <stdio.h>
3
4typedef unsigned long long int ULong;
5
6/* ------------------------ SRADI ------------------------ */
7
8#define INSN_SRADI(nnn) \
9 void do_sradi_##nnn ( ULong arg, /*OUT*/ULong* res, /*OUT*/ULong* xer ) \
10 { \
11 ULong argW = arg; \
12 ULong resW = 0; \
13 ULong xerW = 0; \
14 __asm__ __volatile__( \
15 "sradi %0,%2, " #nnn "\n\t" \
16 "mfxer %1" \
17 : /*out*/ "=b"(resW), "=b"(xerW) \
18 : /*in*/ "b"(argW) \
19 : /*trash*/ "cc" \
20 ); \
21 *res = resW; \
22 *xer = xerW; \
23 }
24
25INSN_SRADI(0)
26INSN_SRADI(1)
27INSN_SRADI(2)
28INSN_SRADI(3)
29INSN_SRADI(4)
30INSN_SRADI(5)
31INSN_SRADI(6)
32INSN_SRADI(7)
33INSN_SRADI(8)
34INSN_SRADI(9)
35INSN_SRADI(10)
36INSN_SRADI(11)
37INSN_SRADI(12)
38INSN_SRADI(13)
39INSN_SRADI(14)
40INSN_SRADI(15)
41INSN_SRADI(16)
42INSN_SRADI(17)
43INSN_SRADI(18)
44INSN_SRADI(19)
45INSN_SRADI(20)
46INSN_SRADI(21)
47INSN_SRADI(22)
48INSN_SRADI(23)
49INSN_SRADI(24)
50INSN_SRADI(25)
51INSN_SRADI(26)
52INSN_SRADI(27)
53INSN_SRADI(28)
54INSN_SRADI(29)
55INSN_SRADI(30)
56INSN_SRADI(31)
57INSN_SRADI(32)
58INSN_SRADI(33)
59INSN_SRADI(34)
60INSN_SRADI(35)
61INSN_SRADI(36)
62INSN_SRADI(37)
63INSN_SRADI(38)
64INSN_SRADI(39)
65INSN_SRADI(40)
66INSN_SRADI(41)
67INSN_SRADI(42)
68INSN_SRADI(43)
69INSN_SRADI(44)
70INSN_SRADI(45)
71INSN_SRADI(46)
72INSN_SRADI(47)
73INSN_SRADI(48)
74INSN_SRADI(49)
75INSN_SRADI(50)
76INSN_SRADI(51)
77INSN_SRADI(52)
78INSN_SRADI(53)
79INSN_SRADI(54)
80INSN_SRADI(55)
81INSN_SRADI(56)
82INSN_SRADI(57)
83INSN_SRADI(58)
84INSN_SRADI(59)
85INSN_SRADI(60)
86INSN_SRADI(61)
87INSN_SRADI(62)
88INSN_SRADI(63)
89
90static void* all_sradi[64]
91 = {
92 (void*)&do_sradi_0,
93 (void*)&do_sradi_1,
94 (void*)&do_sradi_2,
95 (void*)&do_sradi_3,
96 (void*)&do_sradi_4,
97 (void*)&do_sradi_5,
98 (void*)&do_sradi_6,
99 (void*)&do_sradi_7,
100 (void*)&do_sradi_8,
101 (void*)&do_sradi_9,
102 (void*)&do_sradi_10,
103 (void*)&do_sradi_11,
104 (void*)&do_sradi_12,
105 (void*)&do_sradi_13,
106 (void*)&do_sradi_14,
107 (void*)&do_sradi_15,
108 (void*)&do_sradi_16,
109 (void*)&do_sradi_17,
110 (void*)&do_sradi_18,
111 (void*)&do_sradi_19,
112 (void*)&do_sradi_20,
113 (void*)&do_sradi_21,
114 (void*)&do_sradi_22,
115 (void*)&do_sradi_23,
116 (void*)&do_sradi_24,
117 (void*)&do_sradi_25,
118 (void*)&do_sradi_26,
119 (void*)&do_sradi_27,
120 (void*)&do_sradi_28,
121 (void*)&do_sradi_29,
122 (void*)&do_sradi_30,
123 (void*)&do_sradi_31,
124 (void*)&do_sradi_32,
125 (void*)&do_sradi_33,
126 (void*)&do_sradi_34,
127 (void*)&do_sradi_35,
128 (void*)&do_sradi_36,
129 (void*)&do_sradi_37,
130 (void*)&do_sradi_38,
131 (void*)&do_sradi_39,
132 (void*)&do_sradi_40,
133 (void*)&do_sradi_41,
134 (void*)&do_sradi_42,
135 (void*)&do_sradi_43,
136 (void*)&do_sradi_44,
137 (void*)&do_sradi_45,
138 (void*)&do_sradi_46,
139 (void*)&do_sradi_47,
140 (void*)&do_sradi_48,
141 (void*)&do_sradi_49,
142 (void*)&do_sradi_50,
143 (void*)&do_sradi_51,
144 (void*)&do_sradi_52,
145 (void*)&do_sradi_53,
146 (void*)&do_sradi_54,
147 (void*)&do_sradi_55,
148 (void*)&do_sradi_56,
149 (void*)&do_sradi_57,
150 (void*)&do_sradi_58,
151 (void*)&do_sradi_59,
152 (void*)&do_sradi_60,
153 (void*)&do_sradi_61,
154 (void*)&do_sradi_62,
155 (void*)&do_sradi_63
156 };
157
158/* ------------------------ SRAWI ------------------------ */
159
160#define INSN_SRAWI(nnn) \
161 void do_srawi_##nnn ( ULong arg, /*OUT*/ULong* res, /*OUT*/ULong* xer ) \
162 { \
163 ULong argW = arg; \
164 ULong resW = 0; \
165 ULong xerW = 0; \
166 __asm__ __volatile__( \
167 "srawi %0,%2, " #nnn "\n\t" \
168 "mfxer %1" \
169 : /*out*/ "=b"(resW), "=b"(xerW) \
170 : /*in*/ "b"(argW) \
171 : /*trash*/ "cc" \
172 ); \
173 *res = resW; \
174 *xer = xerW; \
175 }
176
177INSN_SRAWI(0)
178INSN_SRAWI(1)
179INSN_SRAWI(2)
180INSN_SRAWI(3)
181INSN_SRAWI(4)
182INSN_SRAWI(5)
183INSN_SRAWI(6)
184INSN_SRAWI(7)
185INSN_SRAWI(8)
186INSN_SRAWI(9)
187INSN_SRAWI(10)
188INSN_SRAWI(11)
189INSN_SRAWI(12)
190INSN_SRAWI(13)
191INSN_SRAWI(14)
192INSN_SRAWI(15)
193INSN_SRAWI(16)
194INSN_SRAWI(17)
195INSN_SRAWI(18)
196INSN_SRAWI(19)
197INSN_SRAWI(20)
198INSN_SRAWI(21)
199INSN_SRAWI(22)
200INSN_SRAWI(23)
201INSN_SRAWI(24)
202INSN_SRAWI(25)
203INSN_SRAWI(26)
204INSN_SRAWI(27)
205INSN_SRAWI(28)
206INSN_SRAWI(29)
207INSN_SRAWI(30)
208INSN_SRAWI(31)
209
210static void* all_srawi[32]
211 = {
212 (void*)&do_srawi_0,
213 (void*)&do_srawi_1,
214 (void*)&do_srawi_2,
215 (void*)&do_srawi_3,
216 (void*)&do_srawi_4,
217 (void*)&do_srawi_5,
218 (void*)&do_srawi_6,
219 (void*)&do_srawi_7,
220 (void*)&do_srawi_8,
221 (void*)&do_srawi_9,
222 (void*)&do_srawi_10,
223 (void*)&do_srawi_11,
224 (void*)&do_srawi_12,
225 (void*)&do_srawi_13,
226 (void*)&do_srawi_14,
227 (void*)&do_srawi_15,
228 (void*)&do_srawi_16,
229 (void*)&do_srawi_17,
230 (void*)&do_srawi_18,
231 (void*)&do_srawi_19,
232 (void*)&do_srawi_20,
233 (void*)&do_srawi_21,
234 (void*)&do_srawi_22,
235 (void*)&do_srawi_23,
236 (void*)&do_srawi_24,
237 (void*)&do_srawi_25,
238 (void*)&do_srawi_26,
239 (void*)&do_srawi_27,
240 (void*)&do_srawi_28,
241 (void*)&do_srawi_29,
242 (void*)&do_srawi_30,
243 (void*)&do_srawi_31
244 };
245
246/* ------------------------ SRAD ------------------------ */
247
248void do_srad ( ULong arg1, ULong arg2,
249 /*OUT*/ULong* res, /*OUT*/ULong* xer )
250{
251 ULong arg1W = arg1;
252 ULong arg2W = arg2;
253 ULong resW = 0;
254 ULong xerW = 0;
255 __asm__ __volatile__(
256 "srad %0,%2,%3\n\t"
257 "mfxer %1"
258 : /*out*/ "=b"(resW), "=b"(xerW)
259 : /*in*/ "b"(arg1W), "b"(arg2W)
260 : /*trash*/ "cc"
261 );
262 *res = resW;
263 *xer = xerW;
264}
265
266
267/* ------------------------ SRAW ------------------------ */
268
269void do_sraw ( ULong arg1, ULong arg2,
270 /*OUT*/ULong* res, /*OUT*/ULong* xer )
271{
272 ULong arg1W = arg1;
273 ULong arg2W = arg2;
274 ULong resW = 0;
275 ULong xerW = 0;
276 __asm__ __volatile__(
277 "sraw %0,%2,%3\n\t"
278 "mfxer %1"
279 : /*out*/ "=b"(resW), "=b"(xerW)
280 : /*in*/ "b"(arg1W), "b"(arg2W)
281 : /*trash*/ "cc"
282 );
283 *res = resW;
284 *xer = xerW;
285}
286
287/* ------------------------ SRD ------------------------ */
288
289void do_srd ( ULong arg1, ULong arg2,
290 /*OUT*/ULong* res, /*OUT*/ULong* xer )
291{
292 ULong arg1W = arg1;
293 ULong arg2W = arg2;
294 ULong resW = 0;
295 ULong xerW = 0;
296 __asm__ __volatile__(
297 "srd %0,%2,%3\n\t"
298 "mfxer %1"
299 : /*out*/ "=b"(resW), "=b"(xerW)
300 : /*in*/ "b"(arg1W), "b"(arg2W)
301 : /*trash*/ "cc"
302 );
303 *res = resW;
304 *xer = xerW;
305}
306
307
308/* ------------------------ SRW ------------------------ */
309
310void do_srw ( ULong arg1, ULong arg2,
311 /*OUT*/ULong* res, /*OUT*/ULong* xer )
312{
313 ULong arg1W = arg1;
314 ULong arg2W = arg2;
315 ULong resW = 0;
316 ULong xerW = 0;
317 __asm__ __volatile__(
318 "srw %0,%2,%3\n\t"
319 "mfxer %1"
320 : /*out*/ "=b"(resW), "=b"(xerW)
321 : /*in*/ "b"(arg1W), "b"(arg2W)
322 : /*trash*/ "cc"
323 );
324 *res = resW;
325 *xer = xerW;
326}
327
328
329/* ------------------------ SLD ------------------------ */
330
331void do_sld ( ULong arg1, ULong arg2,
332 /*OUT*/ULong* res, /*OUT*/ULong* xer )
333{
334 ULong arg1W = arg1;
335 ULong arg2W = arg2;
336 ULong resW = 0;
337 ULong xerW = 0;
338 __asm__ __volatile__(
339 "sld %0,%2,%3\n\t"
340 "mfxer %1"
341 : /*out*/ "=b"(resW), "=b"(xerW)
342 : /*in*/ "b"(arg1W), "b"(arg2W)
343 : /*trash*/ "cc"
344 );
345 *res = resW;
346 *xer = xerW;
347}
348
349
350/* ------------------------ SLW ------------------------ */
351
352void do_slw ( ULong arg1, ULong arg2,
353 /*OUT*/ULong* res, /*OUT*/ULong* xer )
354{
355 ULong arg1W = arg1;
356 ULong arg2W = arg2;
357 ULong resW = 0;
358 ULong xerW = 0;
359 __asm__ __volatile__(
360 "slw %0,%2,%3\n\t"
361 "mfxer %1"
362 : /*out*/ "=b"(resW), "=b"(xerW)
363 : /*in*/ "b"(arg1W), "b"(arg2W)
364 : /*trash*/ "cc"
365 );
366 *res = resW;
367 *xer = xerW;
368}
369
370
371/* ------------------------ ------------------------ */
372/* ------------------------ ------------------------ */
373/* ------------------------ ------------------------ */
374
375#define N_ARGS64 41
376
377ULong args64[N_ARGS64] = {
378 0x0000000000000000ULL,
379
380 0x0000000000000001ULL,
381 0x0000000031415927ULL,
382 0x000000007FFFFFFFULL,
383 0x0000000080000000ULL,
384 0x00000000FFFFFFFFULL,
385
386 0x0000000100000000ULL,
387 0x3141592700000000ULL,
388 0x7FFFFFFF00000000ULL,
389 0x8000000000000000ULL,
390 0xFFFFFFFF00000000ULL,
391
392 0x7FFFFFFF00000001ULL,
393 0x7FFFFFFF31415927ULL,
394 0x7FFFFFFF7FFFFFFFULL,
395 0x7FFFFFFF80000000ULL,
396 0x7FFFFFFFFFFFFFFFULL,
397
398 0x000000017FFFFFFFULL,
399 0x314159277FFFFFFFULL,
400 0x7FFFFFFF7FFFFFFFULL,
401 0x800000007FFFFFFFULL,
402 0xFFFFFFFF7FFFFFFFULL,
403
404 0x8000000000000001ULL,
405 0x8000000031415927ULL,
406 0x800000007FFFFFFFULL,
407 0x8000000080000000ULL,
408 0x80000000FFFFFFFFULL,
409
410 0x0000000180000000ULL,
411 0x3141592780000000ULL,
412 0x7FFFFFFF80000000ULL,
413 0x8000000080000000ULL,
414 0xFFFFFFFF80000000ULL,
415
416 0xFFFFFFFF00000001ULL,
417 0xFFFFFFFF31415927ULL,
418 0xFFFFFFFF7FFFFFFFULL,
419 0xFFFFFFFF80000000ULL,
420 0xFFFFFFFFFFFFFFFFULL,
421
422 0x00000001FFFFFFFFULL,
423 0x31415927FFFFFFFFULL,
424 0x7FFFFFFFFFFFFFFFULL,
425 0x80000000FFFFFFFFULL,
426 0xFFFFFFFFFFFFFFFFULL
427};
428
429void do_unary ( char* name, void** fns, int n_fns )
430{
431 int i, j;
432 ULong arg, res, xer;
433 void(*fn)(ULong,ULong*,ULong*);
434 for (i = 0; i < n_fns; i++) { /* shift */
435 for (j = 0; j < N_ARGS64; j++) { /* arg */
436 arg = args64[j];
437 res = xer = 0;
438 fn = fns[i];
439 fn( arg, &res, &xer );
440 printf("%5s(0x%016llx, %2d) = 0x%016llx, %d\n",
441 name, arg, (int)i, res, (int)((xer >> 29 & 1)));
442 }
443 }
444}
445
446void do_binary ( char* name, void* fnV )
447{
448 int i, j;
449 ULong arg1, arg2, res, xer;
450 void(*fn)(ULong,ULong,ULong*,ULong*);
451 for (i = 0; i < 64+10; i++) { /* shift */
452 for (j = 0; j < N_ARGS64; j++) { /* arg */
453 arg1 = args64[j];
454 arg2 = i;
455 res = xer = 0;
456 fn = fnV;
457 fn( arg1, arg2, &res, &xer );
458 printf("%5s(0x%016llx, %2d) = 0x%016llx, %d\n",
459 name, arg1, (int)arg2, res, (int)((xer >> 29 & 1)));
460 }
461 }
462}
463
464int main ( void )
465{
466 do_unary("sradi", all_sradi, 64);
467 do_unary("srawi", all_srawi, 32);
468 do_binary("srad", do_srad);
469 do_binary("sraw", do_sraw);
470 do_binary("srd", do_srd);
471 do_binary("srw", do_srw);
472 do_binary("sld", do_sld);
473 do_binary("slw", do_slw);
474 return 0;
475}
476
477/*
4780
4791
4802
4813
4824
4835
4846
4857
4868
4879
48810
48911
49012
49113
49214
49315
49416
49517
49618
49719
49820
49921
50022
50123
50224
50325
50426
50527
50628
50729
50830
50931
51032
51133
51234
51335
51436
51537
51638
51739
51840
51941
52042
52143
52244
52345
52446
52547
52648
52749
52850
52951
53052
53153
53254
53355
53456
53557
53658
53759
53860
53961
54062
54163
542*/
543