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