Revision a1705768

b/target-arm/cpu.h
453 453

  
454 454
#include "cpu-all.h"
455 455

  
456
/* Bit usage in the TB flags field: */
457
#define ARM_TBFLAG_THUMB_SHIFT      0
458
#define ARM_TBFLAG_THUMB_MASK       (1 << ARM_TBFLAG_THUMB_SHIFT)
459
#define ARM_TBFLAG_VECLEN_SHIFT     1
460
#define ARM_TBFLAG_VECLEN_MASK      (0x7 << ARM_TBFLAG_VECLEN_SHIFT)
461
#define ARM_TBFLAG_VECSTRIDE_SHIFT  4
462
#define ARM_TBFLAG_VECSTRIDE_MASK   (0x3 << ARM_TBFLAG_VECSTRIDE_SHIFT)
463
#define ARM_TBFLAG_PRIV_SHIFT       6
464
#define ARM_TBFLAG_PRIV_MASK        (1 << ARM_TBFLAG_PRIV_SHIFT)
465
#define ARM_TBFLAG_VFPEN_SHIFT      7
466
#define ARM_TBFLAG_VFPEN_MASK       (1 << ARM_TBFLAG_VFPEN_SHIFT)
467
#define ARM_TBFLAG_CONDEXEC_SHIFT   8
468
#define ARM_TBFLAG_CONDEXEC_MASK    (0xff << ARM_TBFLAG_CONDEXEC_SHIFT)
469
/* Bits 31..16 are currently unused. */
470

  
471
/* some convenience accessor macros */
472
#define ARM_TBFLAG_THUMB(F) \
473
    (((F) & ARM_TBFLAG_THUMB_MASK) >> ARM_TBFLAG_THUMB_SHIFT)
474
#define ARM_TBFLAG_VECLEN(F) \
475
    (((F) & ARM_TBFLAG_VECLEN_MASK) >> ARM_TBFLAG_VECLEN_SHIFT)
476
#define ARM_TBFLAG_VECSTRIDE(F) \
477
    (((F) & ARM_TBFLAG_VECSTRIDE_MASK) >> ARM_TBFLAG_VECSTRIDE_SHIFT)
478
#define ARM_TBFLAG_PRIV(F) \
479
    (((F) & ARM_TBFLAG_PRIV_MASK) >> ARM_TBFLAG_PRIV_SHIFT)
480
#define ARM_TBFLAG_VFPEN(F) \
481
    (((F) & ARM_TBFLAG_VFPEN_MASK) >> ARM_TBFLAG_VFPEN_SHIFT)
482
#define ARM_TBFLAG_CONDEXEC(F) \
483
    (((F) & ARM_TBFLAG_CONDEXEC_MASK) >> ARM_TBFLAG_CONDEXEC_SHIFT)
484

  
456 485
static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
457 486
                                        target_ulong *cs_base, int *flags)
458 487
{
459 488
    *pc = env->regs[15];
460 489
    *cs_base = 0;
461
    *flags = env->thumb | (env->vfp.vec_len << 1)
462
            | (env->vfp.vec_stride << 4) | (env->condexec_bits << 8);
463
    if ((env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR)
464
        *flags |= (1 << 6);
465
    if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30))
466
        *flags |= (1 << 7);
490
    *flags = (env->thumb << ARM_TBFLAG_THUMB_SHIFT)
491
        | (env->vfp.vec_len << ARM_TBFLAG_VECLEN_SHIFT)
492
        | (env->vfp.vec_stride << ARM_TBFLAG_VECSTRIDE_SHIFT)
493
        | (env->condexec_bits << ARM_TBFLAG_CONDEXEC_SHIFT);
494
    if ((env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) {
495
        *flags |= ARM_TBFLAG_PRIV_MASK;
496
    }
497
    if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)) {
498
        *flags |= ARM_TBFLAG_VFPEN_MASK;
499
    }
467 500
}
468 501

  
469 502
#endif

Also available in: Unified diff