diff --git a/target-arm/op.c b/target-arm/op.c index 813c285b56..561883457d 100644 --- a/target-arm/op.c +++ b/target-arm/op.c @@ -105,6 +105,11 @@ void OPPROTO op_movl_T1_im(void) T1 = PARAM1; } +void OPPROTO op_mov_CF_T1(void) +{ + env->CF = ((uint32_t)T1) >> 31; +} + void OPPROTO op_movl_T2_im(void) { T2 = PARAM1; diff --git a/target-arm/translate.c b/target-arm/translate.c index e2c5b8fc09..7223242136 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -536,7 +536,8 @@ static void disas_arm_insn(DisasContext *s) if (shift) val = (val >> shift) | (val << (32 - shift)); gen_op_movl_T1_im(val); - /* XXX: is CF modified ? */ + if (logic_cc && shift) + gen_op_mov_CF_T1(); } else { /* register */ rm = (insn) & 0xf;