mirror of https://github.com/xemu-project/xemu.git
multi byte nop support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2145 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
03c1847584
commit
e17a36ce41
|
@ -1615,6 +1615,56 @@ static void gen_lea_modrm(DisasContext *s, int modrm, int *reg_ptr, int *offset_
|
||||||
*offset_ptr = disp;
|
*offset_ptr = disp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gen_nop_modrm(DisasContext *s, int modrm)
|
||||||
|
{
|
||||||
|
int mod, rm, base, code;
|
||||||
|
|
||||||
|
mod = (modrm >> 6) & 3;
|
||||||
|
if (mod == 3)
|
||||||
|
return;
|
||||||
|
rm = modrm & 7;
|
||||||
|
|
||||||
|
if (s->aflag) {
|
||||||
|
|
||||||
|
base = rm;
|
||||||
|
|
||||||
|
if (base == 4) {
|
||||||
|
code = ldub_code(s->pc++);
|
||||||
|
base = (code & 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (mod) {
|
||||||
|
case 0:
|
||||||
|
if (base == 5) {
|
||||||
|
s->pc += 4;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
s->pc++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case 2:
|
||||||
|
s->pc += 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (mod) {
|
||||||
|
case 0:
|
||||||
|
if (rm == 6) {
|
||||||
|
s->pc += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
s->pc++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case 2:
|
||||||
|
s->pc += 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* used for LEA and MOV AX, mem */
|
/* used for LEA and MOV AX, mem */
|
||||||
static void gen_add_A0_ds_seg(DisasContext *s)
|
static void gen_add_A0_ds_seg(DisasContext *s)
|
||||||
{
|
{
|
||||||
|
@ -5791,10 +5841,15 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
|
||||||
gen_lea_modrm(s, modrm, ®_addr, &offset_addr);
|
gen_lea_modrm(s, modrm, ®_addr, &offset_addr);
|
||||||
/* nothing more to do */
|
/* nothing more to do */
|
||||||
break;
|
break;
|
||||||
default:
|
default: /* nop (multi byte) */
|
||||||
goto illegal_op;
|
gen_nop_modrm(s, modrm);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 0x119 ... 0x11f: /* nop (multi byte) */
|
||||||
|
modrm = ldub_code(s->pc++);
|
||||||
|
gen_nop_modrm(s, modrm);
|
||||||
|
break;
|
||||||
case 0x120: /* mov reg, crN */
|
case 0x120: /* mov reg, crN */
|
||||||
case 0x122: /* mov crN, reg */
|
case 0x122: /* mov crN, reg */
|
||||||
if (s->cpl != 0) {
|
if (s->cpl != 0) {
|
||||||
|
|
Loading…
Reference in New Issue