]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
(1) Fix longstanding bug causing erroneous register zeroing for 'btl'.
authorJulian Seward <jseward@acm.org>
Fri, 12 May 2006 17:47:21 +0000 (17:47 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 12 May 2006 17:47:21 +0000 (17:47 +0000)
(2) Implement 16-bit versions of bt/bts/btr/btc.  (Fixes #125607)

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

VEX/priv/guest-amd64/toIR.c

index 9de659dff3c7b7ee5411581fd1bb62d021eaee42..36fe0c6d4841a907b2845492cb5ac41decbfedb1 100644 (file)
@@ -6905,7 +6905,11 @@ ULong dis_bt_G_E ( Prefix pfx, Int sz, Long delta, BtOp op )
    /* Move reg operand from stack back to reg */
    if (epartIsReg(modrm)) {
       /* t_esp still points at it. */
-      putIRegE(sz, pfx, modrm, loadLE(szToITy(sz), mkexpr(t_rsp)) );
+      /* only write the reg if actually modifying it; doing otherwise
+         zeroes the top half erroneously when doing btl due to
+         standard zero-extend rule */
+       if (op != BtOpNone)
+         putIRegE(sz, pfx, modrm, loadLE(szToITy(sz), mkexpr(t_rsp)) );
       putIReg64(R_RSP, binop(Iop_Add64, mkexpr(t_rsp), mkU64(sz)) );
    }
 
@@ -13354,22 +13358,22 @@ DisResult disInstr_AMD64_WRK (
 
       case 0xA3: /* BT Gv,Ev */
          if (haveF2orF3(pfx)) goto decode_failure;
-         if (sz != 8 && sz != 4) goto decode_failure;
+         if (sz != 8 && sz != 4 && sz != 2) goto decode_failure;
          delta = dis_bt_G_E ( pfx, sz, delta, BtOpNone );
          break;
       case 0xB3: /* BTR Gv,Ev */
          if (haveF2orF3(pfx)) goto decode_failure;
-         if (sz != 8 && sz != 4) goto decode_failure;
+         if (sz != 8 && sz != 4 && sz != 2) goto decode_failure;
          delta = dis_bt_G_E ( pfx, sz, delta, BtOpReset );
          break;
       case 0xAB: /* BTS Gv,Ev */
          if (haveF2orF3(pfx)) goto decode_failure;
-         if (sz != 8 && sz != 4) goto decode_failure;
+         if (sz != 8 && sz != 4 && sz != 2) goto decode_failure;
          delta = dis_bt_G_E ( pfx, sz, delta, BtOpSet );
          break;
       case 0xBB: /* BTC Gv,Ev */
          if (haveF2orF3(pfx)) goto decode_failure;
-         if (sz != 8 && sz != 4) goto decode_failure;
+         if (sz != 8 && sz != 4 && sz != 2) goto decode_failure;
          delta = dis_bt_G_E ( pfx, sz, delta, BtOpComp );
          break;