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