]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Handle mov[ua[pd G(xmm) -> E(xmm) case, which is something binutils
authorJulian Seward <jseward@acm.org>
Thu, 29 Jul 2010 07:19:30 +0000 (07:19 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 29 Jul 2010 07:19:30 +0000 (07:19 +0000)
doesn't produce, presumably because it uses the E->G encoding for xmm
reg-reg moves.  Fixes #238713.  (Pierre Willenbrock,
pierre@pirsoft.de).

git-svn-id: svn://svn.valgrind.org/vex/trunk@1993

VEX/priv/guest_amd64_toIR.c

index 21d5b6f2d62c7e980d34447f50fb4a6a67b9235d..4ce3b1e32a36bab28cf2f3b51f188e64b2df885f 100644 (file)
@@ -11036,19 +11036,24 @@ DisResult disInstr_AMD64_WRK (
 
    /* 66 0F 29 = MOVAPD -- move from G (xmm) to E (mem or xmm). */
    /* 66 0F 11 = MOVUPD -- move from G (xmm) to E (mem or xmm). */
-   if (have66noF2noF3(pfx) && insn[0] == 0x0F 
+   if (have66noF2noF3(pfx) && insn[0] == 0x0F
        && (insn[1] == 0x29 || insn[1] == 0x11)) {
+      HChar* wot = insn[1]==0x29 ? "apd" : "upd";
       modrm = getUChar(delta+2);
       if (epartIsReg(modrm)) {
-         /* fall through; awaiting test case */
+         putXMMReg( eregOfRexRM(pfx,modrm),
+                   getXMMReg( gregOfRexRM(pfx,modrm) ) );
+         DIP("mov%s %s,%s\n", wot, nameXMMReg(gregOfRexRM(pfx,modrm)),
+                                  nameXMMReg(eregOfRexRM(pfx,modrm)));
+         delta += 2+1;
       } else {
          addr = disAMode ( &alen, vbi, pfx, delta+2, dis_buf, 0 );
          storeLE( mkexpr(addr), getXMMReg(gregOfRexRM(pfx,modrm)) );
-         DIP("mov[ua]pd %s,%s\n", nameXMMReg(gregOfRexRM(pfx,modrm)),
-                                  dis_buf );
+         DIP("mov%s %s,%s\n", wot, nameXMMReg(gregOfRexRM(pfx,modrm)),
+                              dis_buf );
          delta += 2+alen;
-         goto decode_success;
       }
+      goto decode_success;
    }
 
    /* 66 0F 6E = MOVD from ireg32/m32 to xmm lo 1/4, zeroing high 3/4 of xmm. */