Missed this one. Ok, please proceed with the commit.
Thank you for your contribution, Claudiu On Sat, Oct 28, 2023 at 4:05 PM Roger Sayle <ro...@nextmovesoftware.com> wrote: > > > This patch improves the code generated for X << 1 (and for X + X) when > X is 64-bit DImode, using the same two instruction code sequence used > for DImode addition. > > For the test case: > > long long foo(long long x) { return x << 1; } > > GCC -O2 currently generates the following code: > > foo: lsr r2,r0,31 > asl_s r1,r1,1 > asl_s r0,r0,1 > j_s.d [blink] > or_s r1,r1,r2 > > and on CPU without a barrel shifter, i.e. -mcpu=em > > foo: add.f 0,r0,r0 > asl_s r1,r1 > rlc r2,0 > asl_s r0,r0 > j_s.d [blink] > or_s r1,r1,r2 > > with this patch (both with and without a barrel shifter): > > foo: add.f r0,r0,r0 > j_s.d [blink] > adc r1,r1,r1 > > [For Jeff Law's benefit a similar optimization is also applicable to > H8300H, that could also use a two instruction sequence (plus rts) but > currently GCC generates 16 instructions (plus an rts) for foo above.] > > Tested with a cross-compiler to arc-linux hosted on x86_64, > with no new (compile-only) regressions from make -k check. > Ok for mainline if this passes Claudiu's nightly testing? > > 2023-10-28 Roger Sayle <ro...@nextmovesoftware.com> > > gcc/ChangeLog > * config/arc/arc.md (addsi3): Fix GNU-style code formatting. > (adddi3): Change define_expand to generate an *adddi3. > (*adddi3): New define_insn_and_split to lower DImode additions > during the split1 pass (after combine and before reload). > (ashldi3): New define_expand to (only) generate *ashldi3_cnt1 > for DImode left shifts by a single bit. > (*ashldi3_cnt1): New define_insn_and_split to lower DImode > left shifts by one bit to an *adddi3. > > gcc/testsuite/ChangeLog > * gcc.target/arc/adddi3-1.c: New test case. > * gcc.target/arc/ashldi3-1.c: Likewise. > > > Thanks in advance, > Roger > -- >