On Sat, May 30, 2015 at 10:47:27AM +0930, Alan Modra wrote:
> > > > I think this is too simplistic though.  For example, AND with -7 is not
> > > > zero-extended (rlwinm rD,rA,0,31,28 sets the high 32 bits of rD to the 
> > > > low
> > > > 32 bits of rA).
> > > 
> > > We take some pains in rs6000.md to ensure that the wrap-around case
> > > for rlwinm does not occur for TARGET_POWERPC64.
> > 
> > I consider that a bug; it pessimises code.
> 
> At the time I added the checks for wrap-around, I recall that gcc
> generated wrong code without the fix.

It still does: some of the things that use mask_operand cannot handle
a wrapped around (MB > ME) 32-bit mask in DImode.

> > > You'll find that an
> > > SImode AND with any value is in fact zero extending.
> > 
> > int f(int x) { return x & 0xc0000000; }
> > 
> > is a counter-example with current trunk (it does a rldicr).
> 
> Huh, that does look like you've destroyed my claim about SImode AND.

Carefully worded :-)


I don't think it is a good idea to optimise code based on assumptions
of what SImode SETs will do to the dest seen as DImode, without making
those assumptions explicit in the RTL.


Segher

Reply via email to