#include <stdio.h>
typedef unsigned long long int ULong;
/* ------------------------ SRADI ------------------------ */
#define INSN_SRADI(nnn) \
void do_sradi_##nnn ( ULong arg, /*OUT*/ULong* res, /*OUT*/ULong* xer ) \
{ \
ULong argW = arg; \
ULong resW = 0; \
ULong xerW = 0; \
__asm__ __volatile__( \
"sradi %0,%2, " #nnn "\n\t" \
"mfxer %1" \
: /*out*/ "=b"(resW), "=b"(xerW) \
: /*in*/ "b"(argW) \
: /*trash*/ "cc" \
); \
*res = resW; \
*xer = xerW; \
}
INSN_SRADI(0)
INSN_SRADI(1)
INSN_SRADI(2)
INSN_SRADI(3)
INSN_SRADI(4)
INSN_SRADI(5)
INSN_SRADI(6)
INSN_SRADI(7)
INSN_SRADI(8)
INSN_SRADI(9)
INSN_SRADI(10)
INSN_SRADI(11)
INSN_SRADI(12)
INSN_SRADI(13)
INSN_SRADI(14)
INSN_SRADI(15)
INSN_SRADI(16)
INSN_SRADI(17)
INSN_SRADI(18)
INSN_SRADI(19)
INSN_SRADI(20)
INSN_SRADI(21)
INSN_SRADI(22)
INSN_SRADI(23)
INSN_SRADI(24)
INSN_SRADI(25)
INSN_SRADI(26)
INSN_SRADI(27)
INSN_SRADI(28)
INSN_SRADI(29)
INSN_SRADI(30)
INSN_SRADI(31)
INSN_SRADI(32)
INSN_SRADI(33)
INSN_SRADI(34)
INSN_SRADI(35)
INSN_SRADI(36)
INSN_SRADI(37)
INSN_SRADI(38)
INSN_SRADI(39)
INSN_SRADI(40)
INSN_SRADI(41)
INSN_SRADI(42)
INSN_SRADI(43)
INSN_SRADI(44)
INSN_SRADI(45)
INSN_SRADI(46)
INSN_SRADI(47)
INSN_SRADI(48)
INSN_SRADI(49)
INSN_SRADI(50)
INSN_SRADI(51)
INSN_SRADI(52)
INSN_SRADI(53)
INSN_SRADI(54)
INSN_SRADI(55)
INSN_SRADI(56)
INSN_SRADI(57)
INSN_SRADI(58)
INSN_SRADI(59)
INSN_SRADI(60)
INSN_SRADI(61)
INSN_SRADI(62)
INSN_SRADI(63)
static void* all_sradi[64]
= {
(void*)&do_sradi_0,
(void*)&do_sradi_1,
(void*)&do_sradi_2,
(void*)&do_sradi_3,
(void*)&do_sradi_4,
(void*)&do_sradi_5,
(void*)&do_sradi_6,
(void*)&do_sradi_7,
(void*)&do_sradi_8,
(void*)&do_sradi_9,
(void*)&do_sradi_10,
(void*)&do_sradi_11,
(void*)&do_sradi_12,
(void*)&do_sradi_13,
(void*)&do_sradi_14,
(void*)&do_sradi_15,
(void*)&do_sradi_16,
(void*)&do_sradi_17,
(void*)&do_sradi_18,
(void*)&do_sradi_19,
(void*)&do_sradi_20,
(void*)&do_sradi_21,
(void*)&do_sradi_22,
(void*)&do_sradi_23,
(void*)&do_sradi_24,
(void*)&do_sradi_25,
(void*)&do_sradi_26,
(void*)&do_sradi_27,
(void*)&do_sradi_28,
(void*)&do_sradi_29,
(void*)&do_sradi_30,
(void*)&do_sradi_31,
(void*)&do_sradi_32,
(void*)&do_sradi_33,
(void*)&do_sradi_34,
(void*)&do_sradi_35,
(void*)&do_sradi_36,
(void*)&do_sradi_37,
(void*)&do_sradi_38,
(void*)&do_sradi_39,
(void*)&do_sradi_40,
(void*)&do_sradi_41,
(void*)&do_sradi_42,
(void*)&do_sradi_43,
(void*)&do_sradi_44,
(void*)&do_sradi_45,
(void*)&do_sradi_46,
(void*)&do_sradi_47,
(void*)&do_sradi_48,
(void*)&do_sradi_49,
(void*)&do_sradi_50,
(void*)&do_sradi_51,
(void*)&do_sradi_52,
(void*)&do_sradi_53,
(void*)&do_sradi_54,
(void*)&do_sradi_55,
(void*)&do_sradi_56,
(void*)&do_sradi_57,
(void*)&do_sradi_58,
(void*)&do_sradi_59,
(void*)&do_sradi_60,
(void*)&do_sradi_61,
(void*)&do_sradi_62,
(void*)&do_sradi_63
};
/* ------------------------ SRAWI ------------------------ */
#define INSN_SRAWI(nnn) \
void do_srawi_##nnn ( ULong arg, /*OUT*/ULong* res, /*OUT*/ULong* xer ) \
{ \
ULong argW = arg; \
ULong resW = 0; \
ULong xerW = 0; \
__asm__ __volatile__( \
"srawi %0,%2, " #nnn "\n\t" \
"mfxer %1" \
: /*out*/ "=b"(resW), "=b"(xerW) \
: /*in*/ "b"(argW) \
: /*trash*/ "cc" \
); \
*res = resW; \
*xer = xerW; \
}
INSN_SRAWI(0)
INSN_SRAWI(1)
INSN_SRAWI(2)
INSN_SRAWI(3)
INSN_SRAWI(4)
INSN_SRAWI(5)
INSN_SRAWI(6)
INSN_SRAWI(7)
INSN_SRAWI(8)
INSN_SRAWI(9)
INSN_SRAWI(10)
INSN_SRAWI(11)
INSN_SRAWI(12)
INSN_SRAWI(13)
INSN_SRAWI(14)
INSN_SRAWI(15)
INSN_SRAWI(16)
INSN_SRAWI(17)
INSN_SRAWI(18)
INSN_SRAWI(19)
INSN_SRAWI(20)
INSN_SRAWI(21)
INSN_SRAWI(22)
INSN_SRAWI(23)
INSN_SRAWI(24)
INSN_SRAWI(25)
INSN_SRAWI(26)
INSN_SRAWI(27)
INSN_SRAWI(28)
INSN_SRAWI(29)
INSN_SRAWI(30)
INSN_SRAWI(31)
static void* all_srawi[32]
= {
(void*)&do_srawi_0,
(void*)&do_srawi_1,
(void*)&do_srawi_2,
(void*)&do_srawi_3,
(void*)&do_srawi_4,
(void*)&do_srawi_5,
(void*)&do_srawi_6,
(void*)&do_srawi_7,
(void*)&do_srawi_8,
(void*)&do_srawi_9,
(void*)&do_srawi_10,
(void*)&do_srawi_11,
(void*)&do_srawi_12,
(void*)&do_srawi_13,
(void*)&do_srawi_14,
(void*)&do_srawi_15,
(void*)&do_srawi_16,
(void*)&do_srawi_17,
(void*)&do_srawi_18,
(void*)&do_srawi_19,
(void*)&do_srawi_20,
(void*)&do_srawi_21,
(void*)&do_srawi_22,
(void*)&do_srawi_23,
(void*)&do_srawi_24,
(void*)&do_srawi_25,
(void*)&do_srawi_26,
(void*)&do_srawi_27,
(void*)&do_srawi_28,
(void*)&do_srawi_29,
(void*)&do_srawi_30,
(void*)&do_srawi_31
};
/* ------------------------ SRAD ------------------------ */
void do_srad ( ULong arg1, ULong arg2,
/*OUT*/ULong* res, /*OUT*/ULong* xer )
{
ULong arg1W = arg1;
ULong arg2W = arg2;
ULong resW = 0;
ULong xerW = 0;
__asm__ __volatile__(
"srad %0,%2,%3\n\t"
"mfxer %1"
: /*out*/ "=b"(resW), "=b"(xerW)
: /*in*/ "b"(arg1W), "b"(arg2W)
: /*trash*/ "cc"
);
*res = resW;
*xer = xerW;
}
/* ------------------------ SRAW ------------------------ */
void do_sraw ( ULong arg1, ULong arg2,
/*OUT*/ULong* res, /*OUT*/ULong* xer )
{
ULong arg1W = arg1;
ULong arg2W = arg2;
ULong resW = 0;
ULong xerW = 0;
__asm__ __volatile__(
"sraw %0,%2,%3\n\t"
"mfxer %1"
: /*out*/ "=b"(resW), "=b"(xerW)
: /*in*/ "b"(arg1W), "b"(arg2W)
: /*trash*/ "cc"
);
*res = resW;
*xer = xerW;
}
/* ------------------------ SRD ------------------------ */
void do_srd ( ULong arg1, ULong arg2,
/*OUT*/ULong* res, /*OUT*/ULong* xer )
{
ULong arg1W = arg1;
ULong arg2W = arg2;
ULong resW = 0;
ULong xerW = 0;
__asm__ __volatile__(
"srd %0,%2,%3\n\t"
"mfxer %1"
: /*out*/ "=b"(resW), "=b"(xerW)
: /*in*/ "b"(arg1W), "b"(arg2W)
: /*trash*/ "cc"
);
*res = resW;
*xer = xerW;
}
/* ------------------------ SRW ------------------------ */
void do_srw ( ULong arg1, ULong arg2,
/*OUT*/ULong* res, /*OUT*/ULong* xer )
{
ULong arg1W = arg1;
ULong arg2W = arg2;
ULong resW = 0;
ULong xerW = 0;
__asm__ __volatile__(
"srw %0,%2,%3\n\t"
"mfxer %1"
: /*out*/ "=b"(resW), "=b"(xerW)
: /*in*/ "b"(arg1W), "b"(arg2W)
: /*trash*/ "cc"
);
*res = resW;
*xer = xerW;
}
/* ------------------------ SLD ------------------------ */
void do_sld ( ULong arg1, ULong arg2,
/*OUT*/ULong* res, /*OUT*/ULong* xer )
{
ULong arg1W = arg1;
ULong arg2W = arg2;
ULong resW = 0;
ULong xerW = 0;
__asm__ __volatile__(
"sld %0,%2,%3\n\t"
"mfxer %1"
: /*out*/ "=b"(resW), "=b"(xerW)
: /*in*/ "b"(arg1W), "b"(arg2W)
: /*trash*/ "cc"
);
*res = resW;
*xer = xerW;
}
/* ------------------------ SLW ------------------------ */
void do_slw ( ULong arg1, ULong arg2,
/*OUT*/ULong* res, /*OUT*/ULong* xer )
{
ULong arg1W = arg1;
ULong arg2W = arg2;
ULong resW = 0;
ULong xerW = 0;
__asm__ __volatile__(
"slw %0,%2,%3\n\t"
"mfxer %1"
: /*out*/ "=b"(resW), "=b"(xerW)
: /*in*/ "b"(arg1W), "b"(arg2W)
: /*trash*/ "cc"
);
*res = resW;
*xer = xerW;
}
/* ------------------------ ------------------------ */
/* ------------------------ ------------------------ */
/* ------------------------ ------------------------ */
#define N_ARGS64 41
ULong args64[N_ARGS64] = {
0x0000000000000000ULL,
0x0000000000000001ULL,
0x0000000031415927ULL,
0x000000007FFFFFFFULL,
0x0000000080000000ULL,
0x00000000FFFFFFFFULL,
0x0000000100000000ULL,
0x3141592700000000ULL,
0x7FFFFFFF00000000ULL,
0x8000000000000000ULL,
0xFFFFFFFF00000000ULL,
0x7FFFFFFF00000001ULL,
0x7FFFFFFF31415927ULL,
0x7FFFFFFF7FFFFFFFULL,
0x7FFFFFFF80000000ULL,
0x7FFFFFFFFFFFFFFFULL,
0x000000017FFFFFFFULL,
0x314159277FFFFFFFULL,
0x7FFFFFFF7FFFFFFFULL,
0x800000007FFFFFFFULL,
0xFFFFFFFF7FFFFFFFULL,
0x8000000000000001ULL,
0x8000000031415927ULL,
0x800000007FFFFFFFULL,
0x8000000080000000ULL,
0x80000000FFFFFFFFULL,
0x0000000180000000ULL,
0x3141592780000000ULL,
0x7FFFFFFF80000000ULL,
0x8000000080000000ULL,
0xFFFFFFFF80000000ULL,
0xFFFFFFFF00000001ULL,
0xFFFFFFFF31415927ULL,
0xFFFFFFFF7FFFFFFFULL,
0xFFFFFFFF80000000ULL,
0xFFFFFFFFFFFFFFFFULL,
0x00000001FFFFFFFFULL,
0x31415927FFFFFFFFULL,
0x7FFFFFFFFFFFFFFFULL,
0x80000000FFFFFFFFULL,
0xFFFFFFFFFFFFFFFFULL
};
void do_unary ( char* name, void** fns, int n_fns )
{
int i, j;
ULong arg, res, xer;
void(*fn)(ULong,ULong*,ULong*);
for (i = 0; i < n_fns; i++) { /* shift */
for (j = 0; j < N_ARGS64; j++) { /* arg */
arg = args64[j];
res = xer = 0;
fn = fns[i];
fn( arg, &res, &xer );
printf("%5s(0x%016llx, %2d) = 0x%016llx, %d\n",
name, arg, (int)i, res, (int)((xer >> 29 & 1)));
}
}
}
void do_binary ( char* name, void* fnV )
{
int i, j;
ULong arg1, arg2, res, xer;
void(*fn)(ULong,ULong,ULong*,ULong*);
for (i = 0; i < 64+10; i++) { /* shift */
for (j = 0; j < N_ARGS64; j++) { /* arg */
arg1 = args64[j];
arg2 = i;
res = xer = 0;
fn = fnV;
fn( arg1, arg2, &res, &xer );
printf("%5s(0x%016llx, %2d) = 0x%016llx, %d\n",
name, arg1, (int)arg2, res, (int)((xer >> 29 & 1)));
}
}
}
int main ( void )
{
do_unary("sradi", all_sradi, 64);
do_unary("srawi", all_srawi, 32);
do_binary("srad", do_srad);
do_binary("sraw", do_sraw);
do_binary("srd", do_srd);
do_binary("srw", do_srw);
do_binary("sld", do_sld);
do_binary("slw", do_slw);
return 0;
}
/*
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
*/