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