]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Handle bsr{w,l,q} and allow bsfq.
authorJulian Seward <jseward@acm.org>
Thu, 7 Apr 2005 02:03:52 +0000 (02:03 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 7 Apr 2005 02:03:52 +0000 (02:03 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@1129

VEX/priv/guest-amd64/toIR.c
VEX/priv/host-amd64/isel.c

index e26efec052353dd9084f71658104fbea9a66717a..f7f4b6f3f9ae4529aa5822321d498be9c76cf904 100644 (file)
@@ -3330,6 +3330,7 @@ ULong dis_Grp8_Imm ( Prefix pfx,
    switch (sz) {
       case 2:  src_val &= 15; break;
       case 4:  src_val &= 31; break;
+      case 8:  src_val &= 63; break;
       default: *decode_OK = False; return delta;
    }
 
@@ -12863,9 +12864,10 @@ DisResult disInstr ( /*IN*/  Bool       resteerOK,
          if (haveF2orF3(pfx)) goto decode_failure;
          delta = dis_bs_E_G ( pfx, sz, delta, True );
          break;
-//..       case 0xBD: /* BSR Gv,Ev */
-//..          delta = dis_bs_E_G ( sorb, sz, delta, False );
-//..          break;
+      case 0xBD: /* BSR Gv,Ev */
+         if (haveF2orF3(pfx)) goto decode_failure;
+         delta = dis_bs_E_G ( pfx, sz, delta, False );
+         break;
 
       /* =-=-=-=-=-=-=-=-=- BSWAP -=-=-=-=-=-=-=-=-=-=-= */
 
index 7e8602fb21839dded0416631cc0272b3f0629622..3b9d1ed72b2e6c6e220ff81d08f5557a7d7c5eea 100644 (file)
@@ -1300,21 +1300,21 @@ static HReg iselIntExpr_R_wrk ( ISelEnv* env, IRExpr* e )
             addInstr(env, AMD64Instr_Bsfr64(True,src,dst));
             return dst;
          }
-//..          case Iop_Clz32: {
-//..             /* Count leading zeroes.  Do 'bsrl' to establish the index
-//..                of the highest set bit, and subtract that value from
-//..                31. */
-//..             HReg tmp = newVRegI(env);
-//..             HReg dst = newVRegI(env);
-//..             HReg src = iselIntExpr_R(env, e->Iex.Unop.arg);
-//..             addInstr(env, X86Instr_Bsfr32(False,src,tmp));
-//..             addInstr(env, X86Instr_Alu32R(Xalu_MOV, 
-//..                                           X86RMI_Imm(31), dst));
-//..             addInstr(env, X86Instr_Alu32R(Xalu_SUB,
-//..                                           X86RMI_Reg(tmp), dst));
-//..             return dst;
-//..          }
-//.. 
+         case Iop_Clz64: {
+            /* Count leading zeroes.  Do 'bsrq' to establish the index
+               of the highest set bit, and subtract that value from
+               63. */
+            HReg tmp = newVRegI(env);
+            HReg dst = newVRegI(env);
+            HReg src = iselIntExpr_R(env, e->Iex.Unop.arg);
+            addInstr(env, AMD64Instr_Bsfr64(False,src,tmp));
+            addInstr(env, AMD64Instr_Alu64R(Aalu_MOV, 
+                                            AMD64RMI_Imm(63), dst));
+            addInstr(env, AMD64Instr_Alu64R(Aalu_SUB,
+                                            AMD64RMI_Reg(tmp), dst));
+            return dst;
+         }
+
 //..          case Iop_128to32: {
 //..             HReg      dst  = newVRegI(env);
 //..             HReg      vec  = iselVecExpr(env, e->Iex.Unop.arg);