Revision 6fbe23d5 target-arm/helper.c
b/target-arm/helper.c | ||
---|---|---|
259 | 259 |
uint32_t cpsr_read(CPUARMState *env) |
260 | 260 |
{ |
261 | 261 |
int ZF; |
262 |
ZF = (env->NZF == 0);
|
|
263 |
return env->uncached_cpsr | (env->NZF & 0x80000000) | (ZF << 30) |
|
|
262 |
ZF = (env->ZF == 0); |
|
263 |
return env->uncached_cpsr | (env->NF & 0x80000000) | (ZF << 30) | |
|
264 | 264 |
(env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27) |
265 | 265 |
| (env->thumb << 5) | ((env->condexec_bits & 3) << 25) |
266 | 266 |
| ((env->condexec_bits & 0xfc) << 8) |
... | ... | |
269 | 269 |
|
270 | 270 |
void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) |
271 | 271 |
{ |
272 |
/* NOTE: N = 1 and Z = 1 cannot be stored currently */ |
|
273 | 272 |
if (mask & CPSR_NZCV) { |
274 |
env->NZF = (val & 0xc0000000) ^ 0x40000000; |
|
273 |
env->ZF = (~val) & CPSR_Z; |
|
274 |
env->NF = val; |
|
275 | 275 |
env->CF = (val >> 29) & 1; |
276 | 276 |
env->VF = (val << 3) & 0x80000000; |
277 | 277 |
} |
... | ... | |
1690 | 1690 |
} |
1691 | 1691 |
} |
1692 | 1692 |
case 7: /* Cache control. */ |
1693 |
/* ??? This is for test, clean and invaidate operations that set the |
|
1694 |
Z flag. We can't represent N = Z = 1, so it also clears |
|
1695 |
the N flag. Oh well. */ |
|
1696 |
env->NZF = 0; |
|
1693 |
/* FIXME: Should only clear Z flag if destination is r15. */ |
|
1694 |
env->ZF = 0; |
|
1697 | 1695 |
return 0; |
1698 | 1696 |
case 8: /* MMU TLB control. */ |
1699 | 1697 |
goto bad_reg; |
Also available in: Unified diff