Revision f5847c91

b/target-i386/cpu.h
764 764
    XMMReg xmm_regs[CPU_NB_REGS];
765 765
    XMMReg xmm_t0;
766 766
    MMXReg mmx_t0;
767
    target_ulong cc_tmp; /* temporary for rcr/rcl */
768 767

  
769 768
    /* sysenter registers */
770 769
    uint32_t sysenter_cs;
b/target-i386/shift_helper_template.h
55 55
    count = rclb_table[count];
56 56
#endif
57 57
    if (count) {
58
        eflags = helper_cc_compute_all(env, CC_OP);
58
        eflags = env->cc_src;
59 59
        t0 &= DATA_MASK;
60 60
        src = t0;
61 61
        res = (t0 << count) | ((target_ulong)(eflags & CC_C) << (count - 1));
......
63 63
            res |= t0 >> (DATA_BITS + 1 - count);
64 64
        }
65 65
        t0 = res;
66
        env->cc_tmp = (eflags & ~(CC_C | CC_O)) |
66
        env->cc_src = (eflags & ~(CC_C | CC_O)) |
67 67
            (lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) |
68 68
            ((src >> (DATA_BITS - count)) & CC_C);
69
    } else {
70
        env->cc_tmp = -1;
71 69
    }
72 70
    return t0;
73 71
}
......
86 84
    count = rclb_table[count];
87 85
#endif
88 86
    if (count) {
89
        eflags = helper_cc_compute_all(env, CC_OP);
87
        eflags = env->cc_src;
90 88
        t0 &= DATA_MASK;
91 89
        src = t0;
92 90
        res = (t0 >> count) |
......
95 93
            res |= t0 << (DATA_BITS + 1 - count);
96 94
        }
97 95
        t0 = res;
98
        env->cc_tmp = (eflags & ~(CC_C | CC_O)) |
96
        env->cc_src = (eflags & ~(CC_C | CC_O)) |
99 97
            (lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) |
100 98
            ((src >> (count - 1)) & CC_C);
101
    } else {
102
        env->cc_tmp = -1;
103 99
    }
104 100
    return t0;
105 101
}
b/target-i386/translate.c
51 51

  
52 52
/* global register indexes */
53 53
static TCGv_ptr cpu_env;
54
static TCGv cpu_A0, cpu_cc_src, cpu_cc_dst, cpu_cc_tmp;
54
static TCGv cpu_A0, cpu_cc_src, cpu_cc_dst;
55 55
static TCGv_i32 cpu_cc_op;
56 56
static TCGv cpu_regs[CPU_NB_REGS];
57 57
/* local temps */
......
1706 1706
static void gen_rotc_rm_T1(DisasContext *s, int ot, int op1, 
1707 1707
                           int is_right)
1708 1708
{
1709
    int label1;
1710

  
1711 1709
    if (s->cc_op != CC_OP_DYNAMIC)
1712 1710
        gen_op_set_cc_op(s->cc_op);
1711
    gen_compute_eflags(cpu_cc_src);
1712
    tcg_gen_discard_tl(cpu_cc_dst);
1713
    s->cc_op = CC_OP_EFLAGS;
1713 1714

  
1714 1715
    /* load */
1715 1716
    if (op1 == OR_TMP0)
......
1757 1758
        gen_op_st_T0_A0(ot + s->mem_index);
1758 1759
    else
1759 1760
        gen_op_mov_reg_T0(ot, op1);
1760

  
1761
    /* update eflags */
1762
    label1 = gen_new_label();
1763
    tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_cc_tmp, -1, label1);
1764

  
1765
    tcg_gen_mov_tl(cpu_cc_src, cpu_cc_tmp);
1766
    tcg_gen_discard_tl(cpu_cc_dst);
1767
    tcg_gen_movi_i32(cpu_cc_op, CC_OP_EFLAGS);
1768
        
1769
    gen_set_label(label1);
1770
    s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */
1771 1761
}
1772 1762

  
1773 1763
/* XXX: add faster immediate case */
......
7763 7753
                                    "cc_src");
7764 7754
    cpu_cc_dst = tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, cc_dst),
7765 7755
                                    "cc_dst");
7766
    cpu_cc_tmp = tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, cc_tmp),
7767
                                    "cc_tmp");
7768 7756

  
7769 7757
#ifdef TARGET_X86_64
7770 7758
    cpu_regs[R_EAX] = tcg_global_mem_new_i64(TCG_AREG0,

Also available in: Unified diff