From 6fbe23d50ed24044ac2d12281b0e7d580a2374d9 Mon Sep 17 00:00:00 2001 From: pbrook Date: Tue, 1 Apr 2008 17:19:11 +0000 Subject: ARM N=Z=1 flag fix. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4156 c046a42c-6fe2-441c-8c8c-71466251a162 --- target-arm/helper.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'target-arm/helper.c') diff --git a/target-arm/helper.c b/target-arm/helper.c index a2dd7b1..3f7a01d 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -259,8 +259,8 @@ void cpu_arm_close(CPUARMState *env) uint32_t cpsr_read(CPUARMState *env) { int ZF; - ZF = (env->NZF == 0); - return env->uncached_cpsr | (env->NZF & 0x80000000) | (ZF << 30) | + ZF = (env->ZF == 0); + return env->uncached_cpsr | (env->NF & 0x80000000) | (ZF << 30) | (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27) | (env->thumb << 5) | ((env->condexec_bits & 3) << 25) | ((env->condexec_bits & 0xfc) << 8) @@ -269,9 +269,9 @@ uint32_t cpsr_read(CPUARMState *env) void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) { - /* NOTE: N = 1 and Z = 1 cannot be stored currently */ if (mask & CPSR_NZCV) { - env->NZF = (val & 0xc0000000) ^ 0x40000000; + env->ZF = (~val) & CPSR_Z; + env->NF = val; env->CF = (val >> 29) & 1; env->VF = (val << 3) & 0x80000000; } @@ -1690,10 +1690,8 @@ uint32_t HELPER(get_cp15)(CPUState *env, uint32_t insn) } } case 7: /* Cache control. */ - /* ??? This is for test, clean and invaidate operations that set the - Z flag. We can't represent N = Z = 1, so it also clears - the N flag. Oh well. */ - env->NZF = 0; + /* FIXME: Should only clear Z flag if destination is r15. */ + env->ZF = 0; return 0; case 8: /* MMU TLB control. */ goto bad_reg; -- cgit v1.1