x86/emul: Further simplify DstBitBase handling
authorAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 14 Dec 2016 10:58:08 +0000 (10:58 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 14 Dec 2016 18:23:51 +0000 (18:23 +0000)
The masking of src.val is common to both paths.  Move it later and simplify
the entry condition for adjusting the memory operand.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/x86_emulate/x86_emulate.c

index 1b5becf313babdff257a66087c07e8be6059671f..05fa342a9400623991e204cde07bfd6a6b91aab1 100644 (file)
@@ -2637,11 +2637,7 @@ x86_emulate(
         }
         break;
     case DstBitBase:
-        if ( ((d & SrcMask) == SrcImmByte) || (ea.type == OP_REG) )
-        {
-            src.val &= (op_bytes << 3) - 1;
-        }
-        else
+        if ( ea.type == OP_MEM )
         {
             /*
              * Instructions such as bt can reference an arbitrary offset from
@@ -2664,8 +2660,11 @@ x86_emulate(
                     op_bytes + (((-src.val - 1) >> 3) & ~(op_bytes - 1L));
             else
                 ea.mem.off += (src.val >> 3) & ~(op_bytes - 1L);
-            src.val &= (op_bytes << 3) - 1;
         }
+
+        /* Bit index always truncated to within range. */
+        src.val &= (op_bytes << 3) - 1;
+
         d = (d & ~DstMask) | DstMem;
         /* Becomes a normal DstMem operation from here on. */
     case DstMem: