On Mon, Apr 23, 2012 at 06:07:52PM +0200, Steven Bosscher wrote: > On Mon, Apr 23, 2012 at 4:43 PM, Alan Modra <amo...@gmail.com> wrote: > > On Mon, Apr 23, 2012 at 02:50:13PM +0200, Steven Bosscher wrote: > >> csui = (ONEUL << a); > >> b = ((csui & cst) != 0); > >> if (b) > >> return 1; > >> else > >> return 0; > > > > We (powerpc) would be much better if this were > > > > csui = (ONEUL << a); > > return (csui & cst) >> a; > > > > Other targets would probably benefit too. > > Yes, this has been discussed before. See here: > > http://gcc.gnu.org/ml/gcc-patches/2003-01/msg01791.html > http://gcc.gnu.org/ml/gcc-patches/2003-01/msg01950.html
I'm suggesting something slightly different to either of these. I realize it's probably not that easy to implement, and is really outside the scope of the switch statement code you're working on, but it would be nice if we could avoid the comparison. On high end powerpc machines, int -> cc -> int costs the equivalent of many operations just on int. (In the powerpc code you showed, the comparison is folded into the AND, emitted as "and.", the move from cc is "mfcr; rlwinm; xori". "and." isn't cheap and "mfcr" is relatively expensive.) -- Alan Modra Australia Development Lab, IBM