KVM: x86 emulator: simplify r/m decoding
authorAvi Kivity <avi@qumranet.com>
Mon, 16 Jun 2008 04:53:26 +0000 (21:53 -0700)
committerAvi Kivity <avi@qumranet.com>
Sun, 20 Jul 2008 09:42:33 +0000 (12:42 +0300)
Consolidate the duplicated code when not in any special case.

Signed-off-by: Avi Kivity <avi@qumranet.com>
arch/x86/kvm/x86_emulate.c

index ca7ab2469a4a155aa3155689705ccc09dadcd8d4..c3a823174f3eadea1349e30fba333a488940293b 100644 (file)
@@ -740,9 +740,7 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
                c->modrm_ea = (u16)c->modrm_ea;
        } else {
                /* 32/64-bit ModR/M decode. */
-               switch (c->modrm_rm) {
-               case 4:
-               case 12:
+               if ((c->modrm_rm & 7) == 4) {
                        sib = insn_fetch(u8, 1, c->eip);
                        index_reg |= (sib >> 3) & 7;
                        base_reg |= sib & 7;
@@ -754,18 +752,11 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
                                c->modrm_ea += c->regs[base_reg];
                        if (index_reg != 4)
                                c->modrm_ea += c->regs[index_reg] << scale;
-                       break;
-               case 5:
-               case 13:
-                       if (c->modrm_mod != 0)
-                               c->modrm_ea += c->regs[c->modrm_rm];
-                       else if (ctxt->mode == X86EMUL_MODE_PROT64)
+               } else if ((c->modrm_rm & 7) == 5 && c->modrm_mod == 0) {
+                       if (ctxt->mode == X86EMUL_MODE_PROT64)
                                rip_relative = 1;
-                       break;
-               default:
+               } else
                        c->modrm_ea += c->regs[c->modrm_rm];
-                       break;
-               }
                switch (c->modrm_mod) {
                case 0:
                        if (c->modrm_rm == 5)