|
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, rsize, res, s1, flags) \ |
|
9 asm ("push %4\n\t"\ |
|
10 "popf\n\t"\ |
|
11 stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \ |
|
12 "pushf\n\t"\ |
|
13 "pop %1\n\t"\ |
|
14 : "=q" (res), "=g" (flags)\ |
|
15 : "q" (s1), "0" (res), "1" (flags)); \ |
|
16 printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \ |
|
17 stringify(OP) size, s0, s1, res, iflags, flags & CC_MASK); |
|
18 |
|
19 #define EXECOP1(size, rsize, res, flags) \ |
|
20 asm ("push %3\n\t"\ |
|
21 "popf\n\t"\ |
|
22 stringify(OP) size " %" rsize "0\n\t" \ |
|
23 "pushf\n\t"\ |
|
24 "pop %1\n\t"\ |
|
25 : "=q" (res), "=g" (flags)\ |
|
26 : "0" (res), "1" (flags)); \ |
|
27 printf("%-10s A=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \ |
|
28 stringify(OP) size, s0, res, iflags, flags & CC_MASK); |
|
29 |
|
30 #ifdef OP1 |
|
31 #if defined(__x86_64__) |
|
32 void exec_opq(long s0, long s1, long iflags) |
|
33 { |
|
34 long res, flags; |
|
35 res = s0; |
|
36 flags = iflags; |
|
37 EXECOP1("q", "", res, flags); |
|
38 } |
|
39 #endif |
|
40 |
|
41 void exec_opl(long s0, long s1, long iflags) |
|
42 { |
|
43 long res, flags; |
|
44 res = s0; |
|
45 flags = iflags; |
|
46 EXECOP1("l", "k", res, flags); |
|
47 } |
|
48 |
|
49 void exec_opw(long s0, long s1, long iflags) |
|
50 { |
|
51 long res, flags; |
|
52 res = s0; |
|
53 flags = iflags; |
|
54 EXECOP1("w", "w", res, flags); |
|
55 } |
|
56 |
|
57 void exec_opb(long s0, long s1, long iflags) |
|
58 { |
|
59 long res, flags; |
|
60 res = s0; |
|
61 flags = iflags; |
|
62 EXECOP1("b", "b", res, flags); |
|
63 } |
|
64 #else |
|
65 #if defined(__x86_64__) |
|
66 void exec_opq(long s0, long s1, long iflags) |
|
67 { |
|
68 long res, flags; |
|
69 res = s0; |
|
70 flags = iflags; |
|
71 EXECOP2("q", "", res, s1, flags); |
|
72 } |
|
73 #endif |
|
74 |
|
75 void exec_opl(long s0, long s1, long iflags) |
|
76 { |
|
77 long res, flags; |
|
78 res = s0; |
|
79 flags = iflags; |
|
80 EXECOP2("l", "k", res, s1, flags); |
|
81 } |
|
82 |
|
83 void exec_opw(long s0, long s1, long iflags) |
|
84 { |
|
85 long res, flags; |
|
86 res = s0; |
|
87 flags = iflags; |
|
88 EXECOP2("w", "w", res, s1, flags); |
|
89 } |
|
90 |
|
91 void exec_opb(long s0, long s1, long iflags) |
|
92 { |
|
93 long res, flags; |
|
94 res = s0; |
|
95 flags = iflags; |
|
96 EXECOP2("b", "b", res, s1, flags); |
|
97 } |
|
98 #endif |
|
99 |
|
100 void exec_op(long s0, long s1) |
|
101 { |
|
102 s0 = i2l(s0); |
|
103 s1 = i2l(s1); |
|
104 #if defined(__x86_64__) |
|
105 exec_opq(s0, s1, 0); |
|
106 #endif |
|
107 exec_opl(s0, s1, 0); |
|
108 exec_opw(s0, s1, 0); |
|
109 exec_opb(s0, s1, 0); |
|
110 #ifdef OP_CC |
|
111 #if defined(__x86_64__) |
|
112 exec_opq(s0, s1, CC_C); |
|
113 #endif |
|
114 exec_opl(s0, s1, CC_C); |
|
115 exec_opw(s0, s1, CC_C); |
|
116 exec_opb(s0, s1, CC_C); |
|
117 #endif |
|
118 } |
|
119 |
|
120 void glue(test_, OP)(void) |
|
121 { |
|
122 exec_op(0x12345678, 0x812FADA); |
|
123 exec_op(0x12341, 0x12341); |
|
124 exec_op(0x12341, -0x12341); |
|
125 exec_op(0xffffffff, 0); |
|
126 exec_op(0xffffffff, -1); |
|
127 exec_op(0xffffffff, 1); |
|
128 exec_op(0xffffffff, 2); |
|
129 exec_op(0x7fffffff, 0); |
|
130 exec_op(0x7fffffff, 1); |
|
131 exec_op(0x7fffffff, -1); |
|
132 exec_op(0x80000000, -1); |
|
133 exec_op(0x80000000, 1); |
|
134 exec_op(0x80000000, -2); |
|
135 exec_op(0x12347fff, 0); |
|
136 exec_op(0x12347fff, 1); |
|
137 exec_op(0x12347fff, -1); |
|
138 exec_op(0x12348000, -1); |
|
139 exec_op(0x12348000, 1); |
|
140 exec_op(0x12348000, -2); |
|
141 exec_op(0x12347f7f, 0); |
|
142 exec_op(0x12347f7f, 1); |
|
143 exec_op(0x12347f7f, -1); |
|
144 exec_op(0x12348080, -1); |
|
145 exec_op(0x12348080, 1); |
|
146 exec_op(0x12348080, -2); |
|
147 } |
|
148 |
|
149 void *glue(_test_, OP) __init_call = glue(test_, OP); |
|
150 |
|
151 #undef OP |
|
152 #undef OP_CC |