|
|
1.1 root 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: #ifndef OP_SHIFTD
9:
10: #ifdef OP_NOBYTE
11: #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
12: asm ("push %4\n\t"\
13: "popf\n\t"\
14: stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \
15: "pushf\n\t"\
16: "pop %1\n\t"\
17: : "=g" (res), "=g" (flags)\
18: : "r" (s1), "0" (res), "1" (flags));
19: #else
20: #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
21: asm ("push %4\n\t"\
22: "popf\n\t"\
23: stringify(OP) size " %%cl, %" rsize "0\n\t" \
24: "pushf\n\t"\
25: "pop %1\n\t"\
26: : "=q" (res), "=g" (flags)\
27: : "c" (s1), "0" (res), "1" (flags));
28: #endif
29:
30: #if defined(__x86_64__)
31: void exec_opq(long s2, long s0, long s1, long iflags)
32: {
33: long res, flags;
34: res = s0;
35: flags = iflags;
36: EXECSHIFT("q", "", res, s1, s2, flags);
37: /* overflow is undefined if count != 1 */
38: if (s1 != 1)
39: flags &= ~CC_O;
40: printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
41: stringify(OP) "q", s0, s1, res, iflags, flags & CC_MASK);
42: }
43: #endif
44:
45: void exec_opl(long s2, long s0, long s1, long iflags)
46: {
47: long res, flags;
48: res = s0;
49: flags = iflags;
50: EXECSHIFT("l", "k", res, s1, s2, flags);
51: /* overflow is undefined if count != 1 */
52: if (s1 != 1)
53: flags &= ~CC_O;
54: printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
55: stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK);
56: }
57:
58: void exec_opw(long s2, long s0, long s1, long iflags)
59: {
60: long res, flags;
61: res = s0;
62: flags = iflags;
63: EXECSHIFT("w", "w", res, s1, s2, flags);
64: /* overflow is undefined if count != 1 */
65: if (s1 != 1)
66: flags &= ~CC_O;
67: printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
68: stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK);
69: }
70:
71: #else
72: #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
73: asm ("push %4\n\t"\
74: "popf\n\t"\
75: stringify(OP) size " %%cl, %" rsize "5, %" rsize "0\n\t" \
76: "pushf\n\t"\
77: "pop %1\n\t"\
78: : "=g" (res), "=g" (flags)\
79: : "c" (s1), "0" (res), "1" (flags), "r" (s2));
80:
81: #if defined(__x86_64__)
82: void exec_opq(long s2, long s0, long s1, long iflags)
83: {
84: long res, flags;
85: res = s0;
86: flags = iflags;
87: EXECSHIFT("q", "", res, s1, s2, flags);
88: /* overflow is undefined if count != 1 */
89: if (s1 != 1)
90: flags &= ~CC_O;
91: printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
92: stringify(OP) "q", s0, s2, s1, res, iflags, flags & CC_MASK);
93: }
94: #endif
95:
96: void exec_opl(long s2, long s0, long s1, long iflags)
97: {
98: long res, flags;
99: res = s0;
100: flags = iflags;
101: EXECSHIFT("l", "k", res, s1, s2, flags);
102: /* overflow is undefined if count != 1 */
103: if (s1 != 1)
104: flags &= ~CC_O;
105: printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
106: stringify(OP) "l", s0, s2, s1, res, iflags, flags & CC_MASK);
107: }
108:
109: void exec_opw(long s2, long s0, long s1, long iflags)
110: {
111: long res, flags;
112: res = s0;
113: flags = iflags;
114: EXECSHIFT("w", "w", res, s1, s2, flags);
115: /* overflow is undefined if count != 1 */
116: if (s1 != 1)
117: flags &= ~CC_O;
118: printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
119: stringify(OP) "w", s0, s2, s1, res, iflags, flags & CC_MASK);
120: }
121:
122: #endif
123:
124: #ifndef OP_NOBYTE
125: void exec_opb(long s0, long s1, long iflags)
126: {
127: long res, flags;
128: res = s0;
129: flags = iflags;
130: EXECSHIFT("b", "b", res, s1, 0, flags);
131: /* overflow is undefined if count != 1 */
132: if (s1 != 1)
133: flags &= ~CC_O;
134: printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
135: stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK);
136: }
137: #endif
138:
139: void exec_op(long s2, long s0, long s1)
140: {
141: s2 = i2l(s2);
142: s0 = i2l(s0);
143: #if defined(__x86_64__)
144: exec_opq(s2, s0, s1, 0);
145: #endif
146: exec_opl(s2, s0, s1, 0);
147: #ifdef OP_SHIFTD
148: if (s1 <= 15)
149: exec_opw(s2, s0, s1, 0);
150: #else
151: exec_opw(s2, s0, s1, 0);
152: #endif
153: #ifndef OP_NOBYTE
154: exec_opb(s0, s1, 0);
155: #endif
156: #ifdef OP_CC
157: #if defined(__x86_64__)
158: exec_opq(s2, s0, s1, CC_C);
159: #endif
160: exec_opl(s2, s0, s1, CC_C);
161: exec_opw(s2, s0, s1, CC_C);
162: exec_opb(s0, s1, CC_C);
163: #endif
164: }
165:
166: void glue(test_, OP)(void)
167: {
168: int i, n;
169: #if defined(__x86_64__)
170: n = 64;
171: #else
172: n = 32;
173: #endif
174: for(i = 0; i < n; i++)
175: exec_op(0x21ad3d34, 0x12345678, i);
176: for(i = 0; i < n; i++)
1.1.1.2 ! root 177: exec_op(0x813f3421, 0x82345679, i);
1.1 root 178: }
179:
180: void *glue(_test_, OP) __init_call = glue(test_, OP);
181:
182: #undef OP
183: #undef OP_CC
184: #undef OP_SHIFTD
185: #undef OP_NOBYTE
186: #undef EXECSHIFT
187:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.