]> xenbits.xensource.com Git - people/andrewcoop/xen.git/commitdiff
x86emul: simplify {,i}{mul,div} fix
authorJan Beulich <jbeulich@suse.com>
Thu, 8 Dec 2016 11:22:33 +0000 (12:22 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 8 Dec 2016 11:22:33 +0000 (12:22 +0100)
Commit 75066cd4ea ("x86emul: fix {,i}mul and {,i}div") can be had with
less code: Simply do the destination register override depending on
DstEax being in effect (the four other ModRM.reg encoded operations of
these two opcodes all use DstMem).

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

index 22b8dc89005d4d3d8414cd7f3ba93f21daa4d88d..d66ce7ac1c6122959819f677b1364f4e794c9ad7 100644 (file)
@@ -4104,6 +4104,8 @@ x86_emulate(
         break;
 
     case 0xf6 ... 0xf7: /* Grp3 */
+        if ( (d & DstMask) == DstEax )
+            dst.reg = (unsigned long *)&_regs.eax;
         switch ( modrm_reg & 7 )
         {
             unsigned long u[2], v;
@@ -4118,7 +4120,6 @@ x86_emulate(
             emulate_1op("neg", dst, _regs.eflags);
             break;
         case 4: /* mul */
-            dst.reg = (unsigned long *)&_regs.eax;
             _regs.eflags &= ~(EFLG_OF|EFLG_CF);
             switch ( dst.bytes )
             {
@@ -4156,7 +4157,6 @@ x86_emulate(
             }
             break;
         case 5: /* imul */
-            dst.reg = (unsigned long *)&_regs.eax;
         imul:
             _regs.eflags &= ~(EFLG_OF|EFLG_CF);
             switch ( dst.bytes )
@@ -4198,7 +4198,6 @@ x86_emulate(
             }
             break;
         case 6: /* div */
-            dst.reg = (unsigned long *)&_regs.eax;
             switch ( src.bytes )
             {
             case 1:
@@ -4244,7 +4243,6 @@ x86_emulate(
             }
             break;
         case 7: /* idiv */
-            dst.reg = (unsigned long *)&_regs.eax;
             switch ( src.bytes )
             {
             case 1: