]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fold Iop_CmpEQ32x8(x,x) to all-1s ..
authorJulian Seward <jseward@acm.org>
Thu, 2 Jan 2020 07:00:07 +0000 (08:00 +0100)
committerJulian Seward <jseward@acm.org>
Thu, 2 Jan 2020 07:00:07 +0000 (08:00 +0100)
    .. hence treating it as a dependency-breaking idiom.  Also handle the
    resulting IRConst_V256(0xFFFFFFFF) in the amd64 insn selector.

(dup of 96de5118f5332ae145912ebe91b8fa143df74b8d from 'grail')

Possibly fixes #409429.

VEX/priv/host_amd64_isel.c
VEX/priv/ir_opt.c

index 8dc30684bb0304ce164623dd318b5f9882bccb31..dfaabb46896df45038c3f4436335f99880a3b93a 100644 (file)
@@ -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. */
       }
index 37e39bc97886d3d9ded27bc41ea15c0e95053992..c5b7a2feaaf7fca389cab36e5fa0c8c762a7bfdc 100644 (file)
@@ -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");
@@ -2353,7 +2355,7 @@ static IRExpr* fold_Expr_WRK ( 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;
@@ -2406,6 +2408,7 @@ static IRExpr* fold_Expr_WRK ( 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;