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