On Thu, Jul 26, 2012 at 8:57 AM, Jon Beniston <jon.benis...@ensilica.com> wrote:
>
> I'd like to try to optimise double word left shifts of sign/zero extended
> operands if a widening multiply instruction is available. For the following
> code:
>
> long long f(long a, long b)
> {
>   return (long long)a << b;
> }
>
> ARM, MIPS etc expand to a fairly long sequence like:
>
>         nor     $3,$0,$5
>         sra     $2,$4,31
>         srl     $7,$4,1
>         srl     $7,$7,$3
>         sll     $2,$2,$5
>         andi    $6,$5,0x20
>         sll     $3,$4,$5
>         or      $2,$7,$2
>         movn    $2,$3,$6
>         movn    $3,$0,$6
>
> I'd like to optimise this to something like:
>
>  (long long) a * (1 << b)
>
> Which should just be 3 or so instructions. I don't think this can be
> sensibly done in the target backend as the generated pattern is too
> complicated to match and am not familiar with the middle end. Any
> suggestions as to where and how this should be best implemented?

It seems to me that you could just add an ashldi3 pattern.

Ian

Reply via email to