From: Julian Seward Date: Sat, 16 Nov 2019 07:30:10 +0000 (+0100) Subject: Fold Iop_CmpEQ32x8(x,x) to all-1s .. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96de5118f5332ae145912ebe91b8fa143df74b8d;p=thirdparty%2Fvalgrind.git Fold Iop_CmpEQ32x8(x,x) to all-1s .. .. hence treating it as a dependency-breaking idiom. Also handle the resulting IRConst_V256(0xFFFFFFFF) in the amd64 insn selector. --- diff --git a/VEX/priv/host_amd64_isel.c b/VEX/priv/host_amd64_isel.c index 8dc30684bb..dfaabb4689 100644 --- a/VEX/priv/host_amd64_isel.c +++ b/VEX/priv/host_amd64_isel.c @@ -4003,6 +4003,14 @@ static void iselDVecExpr_wrk ( /*OUT*/HReg* rHi, /*OUT*/HReg* rLo, *rLo = vLo; return; } + case 0xFFFFFFFF: { + HReg vHi = generate_ones_V128(env); + HReg vLo = newVRegV(env); + addInstr(env, mk_vMOVsd_RR(vHi, vLo)); + *rHi = vHi; + *rLo = vLo; + return; + } default: break; /* give up. Until such time as is necessary. */ } diff --git a/VEX/priv/ir_opt.c b/VEX/priv/ir_opt.c index 9e9c026010..ca677128df 100644 --- a/VEX/priv/ir_opt.c +++ b/VEX/priv/ir_opt.c @@ -1298,6 +1298,8 @@ static IRExpr* mkOnesOfPrimopResultType ( IROp op ) case Iop_CmpEQ16x8: case Iop_CmpEQ32x4: return IRExpr_Const(IRConst_V128(0xFFFF)); + case Iop_CmpEQ32x8: + return IRExpr_Const(IRConst_V256(0xFFFFFFFF)); default: ppIROp(op); vpanic("mkOnesOfPrimopResultType: bad primop"); @@ -2352,7 +2354,7 @@ static IRExpr* fold_Expr ( IRExpr** env, IRExpr* e ) case Iop_Xor64: case Iop_XorV128: case Iop_XorV256: - /* Xor8/16/32/64/V128(t,t) ==> 0, for some IRTemp t */ + /* Xor8/16/32/64/V128/V256(t,t) ==> 0, for some IRTemp t */ if (sameIRExprs(env, e->Iex.Binop.arg1, e->Iex.Binop.arg2)) { e2 = mkZeroOfPrimopResultType(e->Iex.Binop.op); break; @@ -2405,6 +2407,7 @@ static IRExpr* fold_Expr ( IRExpr** env, IRExpr* e ) case Iop_CmpEQ8x16: case Iop_CmpEQ16x8: case Iop_CmpEQ32x4: + case Iop_CmpEQ32x8: if (sameIRExprs(env, e->Iex.Binop.arg1, e->Iex.Binop.arg2)) { e2 = mkOnesOfPrimopResultType(e->Iex.Binop.op); break;