154 |
FORCE_RET(); |
FORCE_RET(); |
155 |
} |
} |
156 |
|
|
157 |
#define OPSUB(sub, sbc, T0, T1) \ |
#define OPSUB(sub, sbc, res, T0, T1) \ |
158 |
\ |
\ |
159 |
void OPPROTO op_ ## sub ## l_T0_T1(void) \ |
void OPPROTO op_ ## sub ## l_T0_T1(void) \ |
160 |
{ \ |
{ \ |
161 |
T0 -= T1; \ |
res = T0 - T1; \ |
162 |
} \ |
} \ |
163 |
\ |
\ |
164 |
void OPPROTO op_ ## sub ## l_T0_T1_cc(void) \ |
void OPPROTO op_ ## sub ## l_T0_T1_cc(void) \ |
167 |
src1 = T0; \ |
src1 = T0; \ |
168 |
T0 -= T1; \ |
T0 -= T1; \ |
169 |
env->NZF = T0; \ |
env->NZF = T0; \ |
170 |
env->CF = src1 < T1; \ |
env->CF = src1 >= T1; \ |
171 |
env->VF = (src1 ^ T1) & (src1 ^ T0); \ |
env->VF = (src1 ^ T1) & (src1 ^ T0); \ |
172 |
|
res = T0; \ |
173 |
} \ |
} \ |
174 |
\ |
\ |
175 |
void OPPROTO op_ ## sbc ## l_T0_T1(void) \ |
void OPPROTO op_ ## sbc ## l_T0_T1(void) \ |
176 |
{ \ |
{ \ |
177 |
T0 = T0 - T1 + env->CF - 1; \ |
res = T0 - T1 + env->CF - 1; \ |
178 |
} \ |
} \ |
179 |
\ |
\ |
180 |
void OPPROTO op_ ## sbc ## l_T0_T1_cc(void) \ |
void OPPROTO op_ ## sbc ## l_T0_T1_cc(void) \ |
183 |
src1 = T0; \ |
src1 = T0; \ |
184 |
if (!env->CF) { \ |
if (!env->CF) { \ |
185 |
T0 = T0 - T1 - 1; \ |
T0 = T0 - T1 - 1; \ |
186 |
T0 += T1; \ |
env->CF = src1 >= T1; \ |
|
env->CF = src1 < T1; \ |
|
187 |
} else { \ |
} else { \ |
188 |
T0 = T0 - T1; \ |
T0 = T0 - T1; \ |
189 |
env->CF = src1 <= T1; \ |
env->CF = src1 > T1; \ |
190 |
} \ |
} \ |
191 |
env->VF = (src1 ^ T1) & (src1 ^ T0); \ |
env->VF = (src1 ^ T1) & (src1 ^ T0); \ |
192 |
env->NZF = T0; \ |
env->NZF = T0; \ |
193 |
|
res = T0; \ |
194 |
FORCE_RET(); \ |
FORCE_RET(); \ |
195 |
} |
} |
196 |
|
|
197 |
OPSUB(sub, sbc, T0, T1) |
OPSUB(sub, sbc, T0, T0, T1) |
198 |
|
|
199 |
OPSUB(rsb, rsc, T1, T0) |
OPSUB(rsb, rsc, T0, T1, T0) |
200 |
|
|
201 |
void OPPROTO op_andl_T0_T1(void) |
void OPPROTO op_andl_T0_T1(void) |
202 |
{ |
{ |
223 |
T1 = ~T1; |
T1 = ~T1; |
224 |
} |
} |
225 |
|
|
226 |
void OPPROTO op_logic_cc(void) |
void OPPROTO op_logic_T0_cc(void) |
227 |
{ |
{ |
228 |
env->NZF = T0; |
env->NZF = T0; |
229 |
} |
} |
230 |
|
|
231 |
|
void OPPROTO op_logic_T1_cc(void) |
232 |
|
{ |
233 |
|
env->NZF = T1; |
234 |
|
} |
235 |
|
|
236 |
#define EIP (env->regs[15]) |
#define EIP (env->regs[15]) |
237 |
|
|
238 |
void OPPROTO op_test_eq(void) |
void OPPROTO op_test_eq(void) |
340 |
|
|
341 |
void OPPROTO op_movl_T0_psr(void) |
void OPPROTO op_movl_T0_psr(void) |
342 |
{ |
{ |
343 |
int ZF; |
T0 = compute_cpsr(); |
|
ZF = (env->NZF == 0); |
|
|
T0 = env->cpsr | (env->NZF & 0x80000000) | (ZF << 30) | |
|
|
(env->CF << 29) | ((env->VF & 0x80000000) >> 3); |
|
344 |
} |
} |
345 |
|
|
346 |
/* NOTE: N = 1 and Z = 1 cannot be stored currently */ |
/* NOTE: N = 1 and Z = 1 cannot be stored currently */ |