update
[qemu] / op_string.h
1
2 void OPPROTO glue(glue(op_movs, SUFFIX), STRING_SUFFIX)(void)
3 {
4     int v, inc;
5     inc = (DF << SHIFT);
6     v = glue(ldu, SUFFIX)(SI_ADDR);
7     glue(st, SUFFIX)(DI_ADDR, v);
8     inc = (DF << SHIFT);
9     INC_SI();
10     INC_DI();
11 }
12
13 void OPPROTO glue(glue(op_rep_movs, SUFFIX), STRING_SUFFIX)(void)
14 {
15     int v, inc;
16     inc = (DF << SHIFT);
17     while (CX != 0) {
18         v = glue(ldu, SUFFIX)(SI_ADDR);
19         glue(st, SUFFIX)(DI_ADDR, v);
20         INC_SI();
21         INC_DI();
22         DEC_CX();
23     }
24     FORCE_RET();
25 }
26
27 void OPPROTO glue(glue(op_stos, SUFFIX), STRING_SUFFIX)(void)
28 {
29     int inc;
30     glue(st, SUFFIX)(DI_ADDR, EAX);
31     inc = (DF << SHIFT);
32     INC_DI();
33 }
34
35 void OPPROTO glue(glue(op_rep_stos, SUFFIX), STRING_SUFFIX)(void)
36 {
37     int inc;
38     inc = (DF << SHIFT);
39     while (CX != 0) {
40         glue(st, SUFFIX)(DI_ADDR, EAX);
41         INC_DI();
42         DEC_CX();
43     }
44     FORCE_RET();
45 }
46
47 void OPPROTO glue(glue(op_lods, SUFFIX), STRING_SUFFIX)(void)
48 {
49     int v, inc;
50     v = glue(ldu, SUFFIX)(SI_ADDR);
51 #if SHIFT == 0
52     EAX = (EAX & ~0xff) | v;
53 #elif SHIFT == 1
54     EAX = (EAX & ~0xffff) | v;
55 #else
56     EAX = v;
57 #endif
58     inc = (DF << SHIFT);
59     INC_SI();
60 }
61
62 /* don't know if it is used */
63 void OPPROTO glue(glue(op_rep_lods, SUFFIX), STRING_SUFFIX)(void)
64 {
65     int v, inc;
66     inc = (DF << SHIFT);
67     while (CX != 0) {
68         v = glue(ldu, SUFFIX)(SI_ADDR);
69 #if SHIFT == 0
70         EAX = (EAX & ~0xff) | v;
71 #elif SHIFT == 1
72         EAX = (EAX & ~0xffff) | v;
73 #else
74         EAX = v;
75 #endif
76         INC_SI();
77         DEC_CX();
78     }
79     FORCE_RET();
80 }
81
82 void OPPROTO glue(glue(op_scas, SUFFIX), STRING_SUFFIX)(void)
83 {
84     int v, inc;
85
86     v = glue(ldu, SUFFIX)(DI_ADDR);
87     inc = (DF << SHIFT);
88     INC_DI();
89     CC_SRC = EAX;
90     CC_DST = EAX - v;
91 }
92
93 void OPPROTO glue(glue(op_repz_scas, SUFFIX), STRING_SUFFIX)(void)
94 {
95     int v1, v2, inc;
96
97     if (CX != 0) {
98         /* NOTE: the flags are not modified if CX == 0 */
99         v1 = EAX & DATA_MASK;
100         inc = (DF << SHIFT);
101         do {
102             v2 = glue(ldu, SUFFIX)(DI_ADDR);
103             INC_DI();
104             DEC_CX();
105             if (v1 != v2)
106                 break;
107         } while (CX != 0);
108         CC_SRC = v1;
109         CC_DST = v1 - v2;
110         CC_OP = CC_OP_SUBB + SHIFT;
111     }
112     FORCE_RET();
113 }
114
115 void OPPROTO glue(glue(op_repnz_scas, SUFFIX), STRING_SUFFIX)(void)
116 {
117     int v1, v2, inc;
118
119     if (CX != 0) {
120         /* NOTE: the flags are not modified if CX == 0 */
121         v1 = EAX & DATA_MASK;
122         inc = (DF << SHIFT);
123         do {
124             v2 = glue(ldu, SUFFIX)(DI_ADDR);
125             INC_DI();
126             DEC_CX();
127             if (v1 == v2)
128                 break;
129         } while (CX != 0);
130         CC_SRC = v1;
131         CC_DST = v1 - v2;
132         CC_OP = CC_OP_SUBB + SHIFT;
133     }
134     FORCE_RET();
135 }
136
137 void OPPROTO glue(glue(op_cmps, SUFFIX), STRING_SUFFIX)(void)
138 {
139     int v1, v2, inc;
140     v1 = glue(ldu, SUFFIX)(SI_ADDR);
141     v2 = glue(ldu, SUFFIX)(DI_ADDR);
142     inc = (DF << SHIFT);
143     INC_SI();
144     INC_DI();
145     CC_SRC = v1;
146     CC_DST = v1 - v2;
147 }
148
149 void OPPROTO glue(glue(op_repz_cmps, SUFFIX), STRING_SUFFIX)(void)
150 {
151     int v1, v2, inc;
152     if (CX != 0) {
153         inc = (DF << SHIFT);
154         do {
155             v1 = glue(ldu, SUFFIX)(SI_ADDR);
156             v2 = glue(ldu, SUFFIX)(DI_ADDR);
157             INC_SI();
158             INC_DI();
159             DEC_CX();
160             if (v1 != v2)
161                 break;
162         } while (CX != 0);
163         CC_SRC = v1;
164         CC_DST = v1 - v2;
165         CC_OP = CC_OP_SUBB + SHIFT;
166     }
167     FORCE_RET();
168 }
169
170 void OPPROTO glue(glue(op_repnz_cmps, SUFFIX), STRING_SUFFIX)(void)
171 {
172     int v1, v2, inc;
173     if (CX != 0) {
174         inc = (DF << SHIFT);
175         do {
176             v1 = glue(ldu, SUFFIX)(SI_ADDR);
177             v2 = glue(ldu, SUFFIX)(DI_ADDR);
178             INC_SI();
179             INC_DI();
180             DEC_CX();
181             if (v1 == v2)
182                 break;
183         } while (CX != 0);
184         CC_SRC = v1;
185         CC_DST = v1 - v2;
186         CC_OP = CC_OP_SUBB + SHIFT;
187     }
188     FORCE_RET();
189 }
190
191 void OPPROTO glue(glue(op_outs, SUFFIX), STRING_SUFFIX)(void)
192 {
193     int v, dx, inc;
194     dx = EDX & 0xffff;
195     v = glue(ldu, SUFFIX)(SI_ADDR);
196     glue(cpu_x86_out, SUFFIX)(dx, v);
197     inc = (DF << SHIFT);
198     INC_SI();
199 }
200
201 void OPPROTO glue(glue(op_rep_outs, SUFFIX), STRING_SUFFIX)(void)
202 {
203     int v, dx, inc;
204     inc = (DF << SHIFT);
205     dx = EDX & 0xffff;
206     while (CX != 0) {
207         v = glue(ldu, SUFFIX)(SI_ADDR);
208         glue(cpu_x86_out, SUFFIX)(dx, v);
209         INC_SI();
210         DEC_CX();
211     }
212     FORCE_RET();
213 }
214
215 void OPPROTO glue(glue(op_ins, SUFFIX), STRING_SUFFIX)(void)
216 {
217     int v, dx, inc;
218     dx = EDX & 0xffff;
219     v = glue(cpu_x86_in, SUFFIX)(dx);
220     glue(st, SUFFIX)(DI_ADDR, v);
221     inc = (DF << SHIFT);
222     INC_DI();
223 }
224
225 void OPPROTO glue(glue(op_rep_ins, SUFFIX), STRING_SUFFIX)(void)
226 {
227     int v, dx, inc;
228     inc = (DF << SHIFT);
229     dx = EDX & 0xffff;
230     while (CX != 0) {
231         v = glue(cpu_x86_in, SUFFIX)(dx);
232         glue(st, SUFFIX)(DI_ADDR, v);
233         INC_DI();
234         DEC_CX();
235     }
236     FORCE_RET();
237 }
238
239 #undef STRING_SUFFIX
240 #undef SI_ADDR
241 #undef DI_ADDR
242 #undef INC_SI
243 #undef INC_DI
244 #undef CX
245 #undef DEC_CX