Statistics
| Branch: | Revision:

root / op_string.h @ 2c1794c4

History | View | Annotate | Download (5.1 kB)

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