diff options
author | Roger Sayle <roger@nextmovesoftware.com> | 2023-11-03 14:32:26 +0000 |
---|---|---|
committer | Roger Sayle <roger@nextmovesoftware.com> | 2023-11-03 14:32:26 +0000 |
commit | b16845b30c8c65597275595f41a7b9aca0674bef (patch) | |
tree | 4358fcb99b2e4c467f929d90fb4a23b863bc5edb /libgcc/libgcov-merge.c | |
parent | eb83605be3db9e8246c73755eafcac5df32ddc69 (diff) | |
download | gcc-b16845b30c8c65597275595f41a7b9aca0674bef.zip gcc-b16845b30c8c65597275595f41a7b9aca0674bef.tar.gz gcc-b16845b30c8c65597275595f41a7b9aca0674bef.tar.bz2 |
ARC: Improve DImode left shift by a single bit.
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
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.
2023-11-03 Roger Sayle <roger@nextmovesoftware.com>
gcc/ChangeLog
* config/arc/arc.md (addsi3): Fix GNU-style code formatting.
(adddi3): Change define_expand to generate a *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.
Diffstat (limited to 'libgcc/libgcov-merge.c')
0 files changed, 0 insertions, 0 deletions