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

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 9e9c026010268360bfdcd3e264c683efa6c24ea0..ca677128df3cdd702bc9426cb72c41324f74c298 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");
@@ -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;