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;
                                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)