|
From: <sv...@va...> - 2014-04-03 13:48:32
|
Author: sewardj
Date: Thu Apr 3 13:48:21 2014
New Revision: 2844
Log:
Add a couple more constant folding rules for vectors.
Modified:
trunk/priv/ir_opt.c
Modified: trunk/priv/ir_opt.c
==============================================================================
--- trunk/priv/ir_opt.c (original)
+++ trunk/priv/ir_opt.c Thu Apr 3 13:48:21 2014
@@ -1251,7 +1251,8 @@
case Iop_And64:
case Iop_Sub64:
case Iop_Xor64: return IRExpr_Const(IRConst_U64(0));
- case Iop_XorV128: return IRExpr_Const(IRConst_V128(0));
+ case Iop_XorV128:
+ case Iop_AndV128: return IRExpr_Const(IRConst_V128(0));
default: vpanic("mkZeroOfPrimopResultType: bad primop");
}
}
@@ -2150,6 +2151,13 @@
break;
}
break;
+ case Iop_Sub8x16:
+ /* Sub8x16(x,0) ==> x */
+ if (isZeroV128(e->Iex.Binop.arg2)) {
+ e2 = e->Iex.Binop.arg1;
+ break;
+ }
+ break;
case Iop_And64:
case Iop_And32:
@@ -2185,13 +2193,18 @@
e2 = e->Iex.Binop.arg1;
break;
}
- if (/* could handle other And cases here too, but so
- far not */
- e->Iex.Binop.op == Iop_And64
+ /* Deal with either arg zero. Could handle other And
+ cases here too. */
+ if (e->Iex.Binop.op == Iop_And64
&& (isZeroU64(e->Iex.Binop.arg1)
|| isZeroU64(e->Iex.Binop.arg2))) {
e2 = mkZeroOfPrimopResultType(e->Iex.Binop.op);
break;
+ } else if (e->Iex.Binop.op == Iop_AndV128
+ && (isZeroV128(e->Iex.Binop.arg1)
+ || isZeroV128(e->Iex.Binop.arg2))) {
+ e2 = mkZeroOfPrimopResultType(e->Iex.Binop.op);
+ break;
}
break;
|