On Sat, 2012-07-21 at 14:41 +0200, Steven Bosscher wrote:
> On Fri, Jul 20, 2012 at 12:41 AM, Richard Henderson <[email protected]> wrote:
> > Notes for future cleanups:
> >
> >> + /* If the targer has no lshift in word_mode, the operation will most
> >> + probably not be cheap. ??? Does GCC even work for such targets? */
> >
> > Yes, it does. We're perfectly happy to let this expand to a libcall.
> > Indeed, many teeny tiny targets don't have a full barrel shifter and only
> > implement x << 1. See sh1, avr, etc.
>
> Thanks for those references! I'll fix this comment with some
> references into the machine descriptions of those ports.
>
I think on SH the cost test in lshift_cheap_p with
gen_rtx_ASHIFT (word_mode, const1_rtx, reg), speed_p);
will always 'fail', because of sh.c (shiftcosts):
/* There is no pattern for constant first operand. */
if (CONST_INT_P (XEXP (x, 0)))
return MAX_COST;
On SH3 / SH4* / SH2A there is a dynamic shift that does "reg << reg" or
"reg >> reg", which is not that expensive actually. However, the
constant "1" must be loaded into a register first. I'm currently trying
to brush up the shift code in SH a little bit and could add some things
to handle the "const << reg" case. Or would it be better to make the
lshift_cheap_p try out more shifty things?
Cheers,
Oleg