blob: 4ea12a3e39c51436f3b052714ceeec5f0a21dac4 [file] [log] [blame]
sewardj5484c142004-08-24 22:43:26 +00001
sewardj08497722006-12-17 14:24:05 +00002#define FULLTXT 1
3
sewardj5484c142004-08-24 22:43:26 +00004#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);
sewardj08497722006-12-17 14:24:05 +000034 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
sewardj5484c142004-08-24 22:43:26 +000041}
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);
sewardj08497722006-12-17 14:24:05 +000048 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
sewardj5484c142004-08-24 22:43:26 +000055}
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);
sewardj08497722006-12-17 14:24:05 +000062 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
sewardj5484c142004-08-24 22:43:26 +000069}
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);
sewardj08497722006-12-17 14:24:05 +000077 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);
sewardj5484c142004-08-24 22:43:26 +000083}
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);
sewardj08497722006-12-17 14:24:05 +000091 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);
sewardj5484c142004-08-24 22:43:26 +000097}
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);
sewardj08497722006-12-17 14:24:05 +0000105 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);
sewardj5484c142004-08-24 22:43:26 +0000111}
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
sewardj686edb92004-10-15 21:26:24 +0000195#if TEST_INTEGER_VERBOSE
sewardj2b5b7512004-08-26 11:27:21 +0000196 if (1)
sewardj5484c142004-08-24 22:43:26 +0000197 for (i = 0; i < NVALS; i++)
198 for (j = 0; j < NVALS; j++)
199 exec_op(val[i], val[j]);
sewardj686edb92004-10-15 21:26:24 +0000200#endif
201
sewardj5484c142004-08-24 22:43:26 +0000202#undef NVALS
203}
204
205void *glue(_test_, OP) __init_call = glue(test_, OP);
206
207#undef OP
208#undef OP_CC
sewardj08497722006-12-17 14:24:05 +0000209
210#undef FULLTXT