1 
2 #define FULLTXT 1
3 
4 #define exec_op glue(exec_, OP)
5 #define exec_opl glue(glue(exec_, OP), l)
6 #define exec_opw glue(glue(exec_, OP), w)
7 #define exec_opb glue(glue(exec_, OP), b)
8 
9 #define EXECOP2(size, res, s1, flags) \
10     asm ("push %4\n\t"\
11          "popf\n\t"\
12          stringify(OP) size " %" size "2, %" size "0\n\t" \
13          "pushf\n\t"\
14          "popl %1\n\t"\
15          : "=q" (res), "=g" (flags)\
16          : "q" (s1), "0" (res), "1" (flags));
17 
18 #define EXECOP1(size, res, flags) \
19     asm ("push %3\n\t"\
20          "popf\n\t"\
21          stringify(OP) size " %" size "0\n\t" \
22          "pushf\n\t"\
23          "popl %1\n\t"\
24          : "=q" (res), "=g" (flags)\
25          : "0" (res), "1" (flags));
26 
27 #ifdef OP1
exec_opl(int s0,int s1,int iflags)28 inline void exec_opl(int s0, int s1, int iflags)
29 {
30     int res, flags;
31     res = s0;
32     flags = iflags;
33     EXECOP1("", res, flags);
34     if (FULLTXT)
35        printf("%-6s A=%08x R=%08x CCIN=%04x CC=%04x\n",
36               stringify(OP) "l", s0, res, iflags, flags & CC_MASK);
37     else
38        printf("%08x %04x %04x\n",
39                res, iflags, flags & CC_MASK);
40 
41 }
exec_opw(int s0,int s1,int iflags)42 inline void exec_opw(int s0, int s1, int iflags)
43 {
44     int res, flags;
45     res = s0;
46     flags = iflags;
47     EXECOP1("w", res, flags);
48     if (FULLTXT)
49        printf("%-6s A=%08x R=%08x CCIN=%04x CC=%04x\n",
50               stringify(OP) "w", s0, res, iflags, flags & CC_MASK);
51     else
52        printf("%08x %04x %04x\n",
53               res, iflags, flags & CC_MASK);
54 
55 }
exec_opb(int s0,int s1,int iflags)56 inline void exec_opb(int s0, int s1, int iflags)
57 {
58     int res, flags;
59     res = s0;
60     flags = iflags;
61     EXECOP1("b", res, flags);
62     if (FULLTXT)
63        printf("%-6s A=%08x R=%08x CCIN=%04x CC=%04x\n",
64               stringify(OP) "b", s0, res, iflags, flags & CC_MASK);
65     else
66        printf("%08x %04x %04x\n",
67               res, iflags, flags & CC_MASK);
68 
69 }
70 #else
exec_opl(int s0,int s1,int iflags)71 inline void exec_opl(int s0, int s1, int iflags)
72 {
73     int res, flags;
74     res = s0;
75     flags = iflags;
76     EXECOP2("", res, s1, flags);
77     if (FULLTXT)
78        printf("%-6s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
79               stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK);
80     else
81        printf("%08x %04x %04x\n",
82               res, iflags, flags & CC_MASK);
83 }
84 
exec_opw(int s0,int s1,int iflags)85 inline void exec_opw(int s0, int s1, int iflags)
86 {
87     int res, flags;
88     res = s0;
89     flags = iflags;
90     EXECOP2("w", res, s1, flags);
91     if (FULLTXT)
92        printf("%-6s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
93               stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK);
94     else
95        printf("%08x %04x %04x\n",
96               res, iflags, flags & CC_MASK);
97 }
98 
exec_opb(int s0,int s1,int iflags)99 inline void exec_opb(int s0, int s1, int iflags)
100 {
101     int res, flags;
102     res = s0;
103     flags = iflags;
104     EXECOP2("b", res, s1, flags);
105     if (FULLTXT)
106        printf("%-6s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
107               stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK);
108     else
109        printf("%08x %04x %04x\n",
110               res, iflags, flags & CC_MASK);
111 }
112 #endif
113 
exec_op(int s0,int s1)114 void exec_op(int s0, int s1)
115 {
116 #if 1
117   int o,s,z,a,c,p,flags_in;
118   for (o = 0; o < 2; o++) {
119   for (s = 0; s < 2; s++) {
120   for (z = 0; z < 2; z++) {
121   for (a = 0; a < 2; a++) {
122   for (c = 0; c < 2; c++) {
123   for (p = 0; p < 2; p++) {
124 
125     flags_in = (o ? CC_O : 0)
126              | (s ? CC_S : 0)
127              | (z ? CC_Z : 0)
128              | (a ? CC_A : 0)
129              | (c ? CC_C : 0)
130              | (p ? CC_P : 0);
131     exec_opl(s0, s1, flags_in);
132     exec_opw(s0, s1, flags_in);
133     exec_opb(s0, s1, flags_in);
134   }}}}}}
135 #else
136     exec_opl(s0, s1, 0);
137     exec_opw(s0, s1, 0);
138     exec_opb(s0, s1, 0);
139     exec_opl(s0, s1, CC_C);
140     exec_opw(s0, s1, CC_C);
141     exec_opb(s0, s1, CC_C);
142 #endif
143 }
144 
glue(test_,OP)145 void glue(test_, OP)(void)
146 {
147 #define NVALS 57
148    int i, j;
149    static unsigned int val[NVALS]
150     = { 0x00, 0x01, 0x02, 0x03,
151         0x3F, 0x40, 0x41,
152         0x7E, 0x7F, 0x80, 0x81, 0x82,
153         0xBF, 0xC0, 0xC1,
154         0xFC, 0xFD, 0xFE, 0xFF,
155 
156         0xFF00, 0xFF01, 0xFF02, 0xFF03,
157         0xFF3F, 0xFF40, 0xFF41,
158         0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82,
159         0xFFBF, 0xFFC0, 0xFFC1,
160         0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF,
161 
162         0xFFFFFF00, 0xFFFFFF01, 0xFFFFFF02, 0xFFFFFF03,
163         0xFFFFFF3F, 0xFFFFFF40, 0xFFFFFF41,
164         0xFFFFFF7E, 0xFFFFFF7F, 0xFFFFFF80, 0xFFFFFF81, 0xFFFFFF82,
165         0xFFFFFFBF, 0xFFFFFFC0, 0xFFFFFFC1,
166         0xFFFFFFFC, 0xFFFFFFFD, 0xFFFFFFFE, 0xFFFFFFFF
167       };
168 
169     exec_op(0x12345678, 0x812FADA);
170     exec_op(0x12341, 0x12341);
171     exec_op(0x12341, -0x12341);
172     exec_op(0xffffffff, 0);
173     exec_op(0xffffffff, -1);
174     exec_op(0xffffffff, 1);
175     exec_op(0xffffffff, 2);
176     exec_op(0x7fffffff, 0);
177     exec_op(0x7fffffff, 1);
178     exec_op(0x7fffffff, -1);
179     exec_op(0x80000000, -1);
180     exec_op(0x80000000, 1);
181     exec_op(0x80000000, -2);
182     exec_op(0x12347fff, 0);
183     exec_op(0x12347fff, 1);
184     exec_op(0x12347fff, -1);
185     exec_op(0x12348000, -1);
186     exec_op(0x12348000, 1);
187     exec_op(0x12348000, -2);
188     exec_op(0x12347f7f, 0);
189     exec_op(0x12347f7f, 1);
190     exec_op(0x12347f7f, -1);
191     exec_op(0x12348080, -1);
192     exec_op(0x12348080, 1);
193     exec_op(0x12348080, -2);
194 
195 #if TEST_INTEGER_VERBOSE
196     if (1)
197     for (i = 0; i < NVALS; i++)
198       for (j = 0; j < NVALS; j++)
199 	exec_op(val[i], val[j]);
200 #endif
201 
202 #undef NVALS
203 }
204 
205 void *glue(_test_, OP) __init_call = glue(test_, OP);
206 
207 #undef OP
208 #undef OP_CC
209 
210 #undef FULLTXT
211