diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2024-07-05 23:49:43 +0200 |
---|---|---|
committer | Georg-Johann Lay <avr@gjlay.de> | 2024-07-06 12:16:49 +0200 |
commit | 96559be74bfa355507472fc020c95c14587c227f (patch) | |
tree | a2503fccdc422aa12891a16e3b32b1ee3acd6feb /gcc/cp/module.cc | |
parent | 8bc5561c43b195e1638e5acace8b41b3f7512be3 (diff) | |
download | gcc-96559be74bfa355507472fc020c95c14587c227f.zip gcc-96559be74bfa355507472fc020c95c14587c227f.tar.gz gcc-96559be74bfa355507472fc020c95c14587c227f.tar.bz2 |
AVR: Create more opportunities for -mfuse-add optimization.
avr_split_tiny_move() was only run for AVR_TINY because it has no PLUS
addressing modes. Same applies to the X register on ordinary cores, and
also to the Z register when used with [E]LPM. For example, without this patch
long long addLL (long long *a, long long *b)
{
return *a + *b;
}
compiles with "-mmcu=atmgea128 -Os -dp" to:
...
movw r26,r24 ; 80 [c=4 l=1] *movhi/0
movw r30,r22 ; 81 [c=4 l=1] *movhi/0
ld r18,X ; 82 [c=4 l=1] movqi_insn/3
adiw r26,1 ; 83 [c=4 l=3] movqi_insn/3
ld r19,X
sbiw r26,1
adiw r26,2 ; 84 [c=4 l=3] movqi_insn/3
ld r20,X
sbiw r26,2
adiw r26,3 ; 85 [c=4 l=3] movqi_insn/3
ld r21,X
sbiw r26,3
adiw r26,4 ; 86 [c=4 l=3] movqi_insn/3
ld r22,X
sbiw r26,4
adiw r26,5 ; 87 [c=4 l=3] movqi_insn/3
ld r23,X
sbiw r26,5
adiw r26,6 ; 88 [c=4 l=3] movqi_insn/3
ld r24,X
sbiw r26,6
adiw r26,7 ; 89 [c=4 l=2] movqi_insn/3
ld r25,X
ld r10,Z ; 90 [c=4 l=1] movqi_insn/3
...
whereas with this patch it becomes:
...
movw r26,r24 ; 80 [c=4 l=1] *movhi/0
movw r30,r22 ; 81 [c=4 l=1] *movhi/0
ld r18,X+ ; 140 [c=4 l=1] movqi_insn/3
ld r19,X+ ; 142 [c=4 l=1] movqi_insn/3
ld r20,X+ ; 144 [c=4 l=1] movqi_insn/3
ld r21,X+ ; 146 [c=4 l=1] movqi_insn/3
ld r22,X+ ; 148 [c=4 l=1] movqi_insn/3
ld r23,X+ ; 150 [c=4 l=1] movqi_insn/3
ld r24,X+ ; 152 [c=4 l=1] movqi_insn/3
ld r25,X ; 109 [c=4 l=1] movqi_insn/3
ld r10,Z ; 111 [c=4 l=1] movqi_insn/3
...
gcc/
* config/avr/avr.md: Also split with avr_split_tiny_move()
for non-AVR_TINY.
* config/avr/avr.cc (avr_split_tiny_move): Don't change memory
references with base regs that can do PLUS addressing.
(avr_out_lpm_no_lpmx) [POST_INC]: Don't output final ADIW when the
address register is unused after.
gcc/testsuite/
* gcc.target/avr/torture/fuse-add.c: New test.
Diffstat (limited to 'gcc/cp/module.cc')
0 files changed, 0 insertions, 0 deletions