It makes sense to keep BIMM with D_FLAG, as they can be written
back to iflags at the same time. BIMM_FLAG does not need to be
added to IFLAGS_TB_MASK because it does not affect the next TB,
only the exception path out of the current TB. Renumber IMM_FLAG,
as the value 4 holds no particular significance; pack these two
flags at the bottom of the bitfield.
Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
struct CPUMBState {
uint32_t btaken;
uint32_t btarget;
- uint32_t bimm;
uint32_t imm;
uint32_t regs[32];
uint32_t res_val;
/* Internal flags. */
-#define IMM_FLAG 4
+#define IMM_FLAG (1 << 0)
+#define BIMM_FLAG (1 << 1)
/* MSR_EE (1 << 8) */
/* MSR_UM (1 << 11) */
/* MSR_VM (1 << 13) */
/* Reexecute the branch. */
env->regs[17] -= 4;
/* was the branch immprefixed?. */
- if (env->bimm) {
+ if (env->iflags & BIMM_FLAG) {
env->regs[17] -= 4;
log_cpu_state_mask(CPU_LOG_INT, cs, 0);
}
static void dec_setup_dslot(DisasContext *dc)
{
- TCGv_i32 tmp = tcg_const_i32(dc->type_b && (dc->tb_flags & IMM_FLAG));
-
- dc->delayed_branch = 2;
- dc->tb_flags |= D_FLAG;
-
- tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUMBState, bimm));
- tcg_temp_free_i32(tmp);
+ dc->delayed_branch = 2;
+ dc->tb_flags |= D_FLAG;
+ if (dc->type_b && (dc->tb_flags & IMM_FLAG)) {
+ dc->tb_flags |= BIMM_FLAG;
+ }
}
static void dec_bcc(DisasContext *dc)