1
2 #include <stdio.h>
3
4 typedef 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
25 INSN_SRADI(0)
26 INSN_SRADI(1)
27 INSN_SRADI(2)
28 INSN_SRADI(3)
29 INSN_SRADI(4)
30 INSN_SRADI(5)
31 INSN_SRADI(6)
32 INSN_SRADI(7)
33 INSN_SRADI(8)
34 INSN_SRADI(9)
35 INSN_SRADI(10)
36 INSN_SRADI(11)
37 INSN_SRADI(12)
38 INSN_SRADI(13)
39 INSN_SRADI(14)
40 INSN_SRADI(15)
41 INSN_SRADI(16)
42 INSN_SRADI(17)
43 INSN_SRADI(18)
44 INSN_SRADI(19)
45 INSN_SRADI(20)
46 INSN_SRADI(21)
47 INSN_SRADI(22)
48 INSN_SRADI(23)
49 INSN_SRADI(24)
50 INSN_SRADI(25)
51 INSN_SRADI(26)
52 INSN_SRADI(27)
53 INSN_SRADI(28)
54 INSN_SRADI(29)
55 INSN_SRADI(30)
56 INSN_SRADI(31)
57 INSN_SRADI(32)
58 INSN_SRADI(33)
59 INSN_SRADI(34)
60 INSN_SRADI(35)
61 INSN_SRADI(36)
62 INSN_SRADI(37)
63 INSN_SRADI(38)
64 INSN_SRADI(39)
65 INSN_SRADI(40)
66 INSN_SRADI(41)
67 INSN_SRADI(42)
68 INSN_SRADI(43)
69 INSN_SRADI(44)
70 INSN_SRADI(45)
71 INSN_SRADI(46)
72 INSN_SRADI(47)
73 INSN_SRADI(48)
74 INSN_SRADI(49)
75 INSN_SRADI(50)
76 INSN_SRADI(51)
77 INSN_SRADI(52)
78 INSN_SRADI(53)
79 INSN_SRADI(54)
80 INSN_SRADI(55)
81 INSN_SRADI(56)
82 INSN_SRADI(57)
83 INSN_SRADI(58)
84 INSN_SRADI(59)
85 INSN_SRADI(60)
86 INSN_SRADI(61)
87 INSN_SRADI(62)
88 INSN_SRADI(63)
89
90 static 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
177 INSN_SRAWI(0)
178 INSN_SRAWI(1)
179 INSN_SRAWI(2)
180 INSN_SRAWI(3)
181 INSN_SRAWI(4)
182 INSN_SRAWI(5)
183 INSN_SRAWI(6)
184 INSN_SRAWI(7)
185 INSN_SRAWI(8)
186 INSN_SRAWI(9)
187 INSN_SRAWI(10)
188 INSN_SRAWI(11)
189 INSN_SRAWI(12)
190 INSN_SRAWI(13)
191 INSN_SRAWI(14)
192 INSN_SRAWI(15)
193 INSN_SRAWI(16)
194 INSN_SRAWI(17)
195 INSN_SRAWI(18)
196 INSN_SRAWI(19)
197 INSN_SRAWI(20)
198 INSN_SRAWI(21)
199 INSN_SRAWI(22)
200 INSN_SRAWI(23)
201 INSN_SRAWI(24)
202 INSN_SRAWI(25)
203 INSN_SRAWI(26)
204 INSN_SRAWI(27)
205 INSN_SRAWI(28)
206 INSN_SRAWI(29)
207 INSN_SRAWI(30)
208 INSN_SRAWI(31)
209
210 static 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
do_srad(ULong arg1,ULong arg2,ULong * res,ULong * xer)248 void 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
do_sraw(ULong arg1,ULong arg2,ULong * res,ULong * xer)269 void 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
do_srd(ULong arg1,ULong arg2,ULong * res,ULong * xer)289 void 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
do_srw(ULong arg1,ULong arg2,ULong * res,ULong * xer)310 void 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
do_sld(ULong arg1,ULong arg2,ULong * res,ULong * xer)331 void 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
do_slw(ULong arg1,ULong arg2,ULong * res,ULong * xer)352 void 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
377 ULong 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
do_unary(char * name,void ** fns,int n_fns)429 void 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
do_binary(char * name,void * fnV)446 void 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
main(void)464 int 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 /*
478 0
479 1
480 2
481 3
482 4
483 5
484 6
485 7
486 8
487 9
488 10
489 11
490 12
491 13
492 14
493 15
494 16
495 17
496 18
497 19
498 20
499 21
500 22
501 23
502 24
503 25
504 26
505 27
506 28
507 29
508 30
509 31
510 32
511 33
512 34
513 35
514 36
515 37
516 38
517 39
518 40
519 41
520 42
521 43
522 44
523 45
524 46
525 47
526 48
527 49
528 50
529 51
530 52
531 53
532 54
533 55
534 56
535 57
536 58
537 59
538 60
539 61
540 62
541 63
542 */
543
544