From: bellard Date: Sun, 3 Sep 2006 17:09:02 +0000 (+0000) Subject: multi byte nop support X-Git-Tag: TizenStudio_2.0_p2.3~14075 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e17a36ce41bc76abecebb434850ba619f5182ba8;p=sdk%2Femulator%2Fqemu.git multi byte nop support git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2145 c046a42c-6fe2-441c-8c8c-71466251a162 --- diff --git a/target-i386/translate.c b/target-i386/translate.c index f905f32..5c6453d 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -1615,6 +1615,56 @@ static void gen_lea_modrm(DisasContext *s, int modrm, int *reg_ptr, int *offset_ *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 */ 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); /* nothing more to do */ break; - default: - goto illegal_op; + default: /* nop (multi byte) */ + gen_nop_modrm(s, modrm); + 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 0x122: /* mov crN, reg */ if (s->cpl != 0) {