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 <jbeul...@suse.com>

--- a/xen/arch/x86/x86_emulate/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate/x86_emulate.c
@@ -4084,6 +4084,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;
@@ -4098,7 +4100,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 )
             {
@@ -4136,7 +4137,6 @@ x86_emulate(
             }
             break;
         case 5: /* imul */
-            dst.reg = (unsigned long *)&_regs.eax;
         imul:
             _regs.eflags &= ~(EFLG_OF|EFLG_CF);
             switch ( dst.bytes )
@@ -4178,7 +4178,6 @@ x86_emulate(
             }
             break;
         case 6: /* div */
-            dst.reg = (unsigned long *)&_regs.eax;
             switch ( src.bytes )
             {
             case 1:
@@ -4224,7 +4223,6 @@ x86_emulate(
             }
             break;
         case 7: /* idiv */
-            dst.reg = (unsigned long *)&_regs.eax;
             switch ( src.bytes )
             {
             case 1:



x86emul: simplify {,i}{mul,div} fix

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 <jbeul...@suse.com>

--- a/xen/arch/x86/x86_emulate/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate/x86_emulate.c
@@ -4084,6 +4084,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;
@@ -4098,7 +4100,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 )
             {
@@ -4136,7 +4137,6 @@ x86_emulate(
             }
             break;
         case 5: /* imul */
-            dst.reg = (unsigned long *)&_regs.eax;
         imul:
             _regs.eflags &= ~(EFLG_OF|EFLG_CF);
             switch ( dst.bytes )
@@ -4178,7 +4178,6 @@ x86_emulate(
             }
             break;
         case 6: /* div */
-            dst.reg = (unsigned long *)&_regs.eax;
             switch ( src.bytes )
             {
             case 1:
@@ -4224,7 +4223,6 @@ x86_emulate(
             }
             break;
         case 7: /* idiv */
-            dst.reg = (unsigned long *)&_regs.eax;
             switch ( src.bytes )
             {
             case 1:
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

Reply via email to