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