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;
}
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 -=-=-=-=-=-=-=-=-=-=-= */
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);