提交 686f3f26 编写于 作者: B bellard

BSR/BSF undefined behaviour fix


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@809 c046a42c-6fe2-441c-8c8c-71466251a162
上级 5b1214a4
...@@ -513,7 +513,7 @@ void OPPROTO glue(glue(op_bsf, SUFFIX), _T0_cc)(void) ...@@ -513,7 +513,7 @@ void OPPROTO glue(glue(op_bsf, SUFFIX), _T0_cc)(void)
count++; count++;
res >>= 1; res >>= 1;
} }
T0 = count; T1 = count;
CC_DST = 1; /* ZF = 0 */ CC_DST = 1; /* ZF = 0 */
} else { } else {
CC_DST = 0; /* ZF = 1 */ CC_DST = 0; /* ZF = 1 */
...@@ -531,7 +531,7 @@ void OPPROTO glue(glue(op_bsr, SUFFIX), _T0_cc)(void) ...@@ -531,7 +531,7 @@ void OPPROTO glue(glue(op_bsr, SUFFIX), _T0_cc)(void)
count--; count--;
res <<= 1; res <<= 1;
} }
T0 = count; T1 = count;
CC_DST = 1; /* ZF = 0 */ CC_DST = 1; /* ZF = 0 */
} else { } else {
CC_DST = 0; /* ZF = 1 */ CC_DST = 0; /* ZF = 1 */
......
...@@ -3708,10 +3708,11 @@ static uint8_t *disas_insn(DisasContext *s, uint8_t *pc_start) ...@@ -3708,10 +3708,11 @@ static uint8_t *disas_insn(DisasContext *s, uint8_t *pc_start)
modrm = ldub_code(s->pc++); modrm = ldub_code(s->pc++);
reg = (modrm >> 3) & 7; reg = (modrm >> 3) & 7;
gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0); gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0);
/* NOTE: in order to handle the 0 case, we must load the
result. It could be optimized with a generated jump */
gen_op_mov_TN_reg[ot][1][reg]();
gen_op_bsx_T0_cc[ot - OT_WORD][b & 1](); gen_op_bsx_T0_cc[ot - OT_WORD][b & 1]();
/* NOTE: we always write back the result. Intel doc says it is gen_op_mov_reg_T1[ot][reg]();
undefined if T0 == 0 */
gen_op_mov_reg_T0[ot][reg]();
s->cc_op = CC_OP_LOGICB + ot; s->cc_op = CC_OP_LOGICB + ot;
break; break;
/************************/ /************************/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册