KVM: x86 emulator: simplify r/m decoding
[deliverable/linux.git] / 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)
This page took 0.028388 seconds and 5 git commands to generate.