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