mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-01-01 08:20:08 +01:00
Fix BSF and BSR instructions in the x86 emulator.
Patch courtesy of Michael Yaroslavtsev.
(cherry picked from 66fa87292e commit)
This commit is contained in:
parent
0b990d1e68
commit
7c937bfb8d
1 changed files with 18 additions and 18 deletions
|
|
@ -2129,7 +2129,7 @@ static void x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
|||
uint srcoffset;
|
||||
|
||||
START_OF_INSTR();
|
||||
DECODE_PRINTF("BSF\n");
|
||||
DECODE_PRINTF("BSF\t");
|
||||
FETCH_DECODE_MODRM(mod, rh, rl);
|
||||
switch(mod) {
|
||||
case 0:
|
||||
|
|
@ -2209,25 +2209,25 @@ static void x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
|||
break;
|
||||
case 3: /* register to register */
|
||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||
u32 *srcreg, *dstreg;
|
||||
u32 srcval, *dstreg;
|
||||
|
||||
srcreg = DECODE_RM_LONG_REGISTER(rl);
|
||||
srcval = *DECODE_RM_LONG_REGISTER(rl);
|
||||
DECODE_PRINTF(",");
|
||||
dstreg = DECODE_RM_LONG_REGISTER(rh);
|
||||
TRACE_AND_STEP();
|
||||
CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
|
||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||
for(*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
||||
if ((*srcreg >> *dstreg) & 1) break;
|
||||
if ((srcval >> *dstreg) & 1) break;
|
||||
} else {
|
||||
u16 *srcreg, *dstreg;
|
||||
u16 srcval, *dstreg;
|
||||
|
||||
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
||||
srcval = *DECODE_RM_WORD_REGISTER(rl);
|
||||
DECODE_PRINTF(",");
|
||||
dstreg = DECODE_RM_WORD_REGISTER(rh);
|
||||
TRACE_AND_STEP();
|
||||
CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
|
||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||
for(*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
||||
if ((*srcreg >> *dstreg) & 1) break;
|
||||
if ((srcval >> *dstreg) & 1) break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -2245,7 +2245,7 @@ static void x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
|||
uint srcoffset;
|
||||
|
||||
START_OF_INSTR();
|
||||
DECODE_PRINTF("BSF\n");
|
||||
DECODE_PRINTF("BSR\t");
|
||||
FETCH_DECODE_MODRM(mod, rh, rl);
|
||||
switch(mod) {
|
||||
case 0:
|
||||
|
|
@ -2325,25 +2325,25 @@ static void x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
|||
break;
|
||||
case 3: /* register to register */
|
||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||
u32 *srcreg, *dstreg;
|
||||
u32 srcval, *dstreg;
|
||||
|
||||
srcreg = DECODE_RM_LONG_REGISTER(rl);
|
||||
srcval = *DECODE_RM_LONG_REGISTER(rl);
|
||||
DECODE_PRINTF(",");
|
||||
dstreg = DECODE_RM_LONG_REGISTER(rh);
|
||||
TRACE_AND_STEP();
|
||||
CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
|
||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||
for(*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
||||
if ((*srcreg >> *dstreg) & 1) break;
|
||||
if ((srcval >> *dstreg) & 1) break;
|
||||
} else {
|
||||
u16 *srcreg, *dstreg;
|
||||
u16 srcval, *dstreg;
|
||||
|
||||
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
||||
srcval = *DECODE_RM_WORD_REGISTER(rl);
|
||||
DECODE_PRINTF(",");
|
||||
dstreg = DECODE_RM_WORD_REGISTER(rh);
|
||||
TRACE_AND_STEP();
|
||||
CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
|
||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||
for(*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
||||
if ((*srcreg >> *dstreg) & 1) break;
|
||||
if ((srcval >> *dstreg) & 1) break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue