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
28inline 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}
42inline 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}
56inline 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
71inline 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
85inline 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
99inline 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
114void 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
145void 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
205void *glue(_test_, OP) __init_call = glue(test_, OP);
206
207#undef OP
208#undef OP_CC
209
210#undef FULLTXT
211