]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
AVR: gas/32704 - Improve code generation for __gcc_isr.
authorGeorg-Johann Lay <avr@gjlay.de>
Sun, 16 Feb 2025 17:43:56 +0000 (18:43 +0100)
committerGeorg-Johann Lay <avr@gjlay.de>
Fri, 7 Mar 2025 10:52:14 +0000 (11:52 +0100)
commit0d93e61c318823da567053d8f1561c78e2efcf06
tree309dc1f2e78d7e4a3cffd01637574190f13bd5b7
parent15d8ef5b3688c9059464a44002009ff470a46977
AVR: gas/32704 - Improve code generation for __gcc_isr.

The prologue generated by __gcc_isr can be improved in
situations where:

* ZERO_REG is needed, and
* SREG is not clobbered by the ISR, and
* avr-gcc provides a GPR >= R16 with the Done chunk, and
* Code generation is for ordinary AVRs (not AVRrc).

For example, the prologue for

volatile char var;

__attribute__((signal)) void __vector_1 (void)
{
    var = 1;
    var = 0;
}

may be

00000000 <__vector_1>:
   0: 8f 93        push r24
   2: 1f 92        push r1
   4: 80 e0        ldi r24, 0
   6: 18 2e        mov r1, r24

instead of the code as currently generated by GAS:

00000000 <__vector_1>:
   0: 1f 92        push r1
   2: 1f b6        in r1, SREG
   4: 1f 92        push r1
   6: 11 24        clr r1
   8: 8f 93        push r24

which consumes more stack, time and code than needed.

gas/
PR gas/32704
PR gas/21683
* config/tc-avr.c (avr_isr): bool-ize.
(avr_emit_insn): Emit "mov" code as  MOV R1,<reg>.
(avr_isr_stack_t): New typedef.
(avr_emit_push, avr_emit_pop): New static functions.
(avr_patch_gccisr_frag): Overhaul prologue and epilogue
generation.
gas/config/tc-avr.c