From: Julian Seward Date: Thu, 16 Dec 2004 11:40:20 +0000 (+0000) Subject: Special case for CmpNE64(x,0), which is frequently generated when X-Git-Tag: svn/VALGRIND_3_0_1^2~668 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=15a71c4eba230d9e943549a51eff8d5fd6424295;p=thirdparty%2Fvalgrind.git Special case for CmpNE64(x,0), which is frequently generated when Memchecking floating point code. git-svn-id: svn://svn.valgrind.org/vex/trunk@666 --- diff --git a/VEX/priv/host-x86/isel.c b/VEX/priv/host-x86/isel.c index f7445c3560..65495d2b85 100644 --- a/VEX/priv/host-x86/isel.c +++ b/VEX/priv/host-x86/isel.c @@ -1621,6 +1621,23 @@ static X86CondCode iselCondCode_wrk ( ISelEnv* env, IRExpr* e ) } } + /* CmpNE64(x, 0) */ + { + DECLARE_PATTERN(p_CmpNE64_x_zero); + DEFINE_PATTERN( + p_CmpNE64_x_zero, + binop(Iop_CmpNE64, bind(0), mkU64(0)) ); + if (matchIRExpr(&mi, p_CmpNE64_x_zero, e)) { + HReg hi, lo; + IRExpr* x = mi.bindee[0]; + HReg tmp = newVRegI(env); + iselInt64Expr( &hi, &lo, env, x ); + addInstr(env, mk_iMOVsd_RR(hi, tmp)); + addInstr(env, X86Instr_Alu32R(Xalu_OR,X86RMI_Reg(lo), tmp)); + return Xcc_NZ; + } + } + /* CmpNE64 */ if (e->tag == Iex_Binop && e->Iex.Binop.op == Iop_CmpNE64) {