On Fri, Aug 17, 2018 at 08:45:02PM +0100, Ramsay Jones wrote: > > > On 16/08/18 23:12, Luc Van Oostenryck wrote: > > Doing a LSR(X, N) will drop the N right bits. > > So any simplification that can be made when using an AND clearing > > the right N bits can also be used on LSR (as if its first operand > > would first be implicitly be ANDed with such a mask). > > > > So, in order to not duplicate complex simplifications involving > > ANDs & ORs masks, merge these both function in a single one, > > using the mask corresponding to the operation. > > > > Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> > > --- > > simplify.c | 56 ++++++++++++++++++++++-------------------------------- > > 1 file changed, 23 insertions(+), 33 deletions(-) > > > > diff --git a/simplify.c b/simplify.c > > index ef98b205a..ce48b3a91 100644 > > --- a/simplify.c > > +++ b/simplify.c > > @@ -546,6 +546,24 @@ undef: > > return NULL; > > } > > > > +static int simplify_mask_or_and(struct instruction *insn, unsigned long long mask, > > + pseudo_t src, pseudo_t other) > > +{ > > + unsigned long long omask, nmask; > > + pseudo_t src2 = src->def->src2; > > + > > + if (!constant(src2)) > > + return 0; > > + omask = src2->value; > > + nmask = omask & mask; > > + if (nmask != 0) > > + return 0; > > + // replace OP(((A & M') | B), C) > > Huh?, should that be OP(((A & M') | B), C) & M ? > and ... > > + // by OP(B, C) > > OP(B, C) & M ? > > confused. Yes, sorry. All this merits much better documentation. OP(x, C) that I'm using here stand (or will stand) for either: * AND(x, M) and then mask = M * LSR(x, S) and then mask = (-1 << S) * SHL(x, S) and then mask = (-1 >> S) * TRUNC(x) and then mask = $mask(newbitsize) = (1 << newbitsize) - 1 because the very same simplifications apply to all of them. -- Luc