[PATCH][AVR] Fix PR32704: Better ISR prologues
Georg-Johann Lay
avr@gjlay.de
Tue Feb 18 18:32:39 GMT 2025
...meanwhile I may write-after-approval (or am getting it soon),
so approving the patch below is enough.
Johann
Am 16.02.25 um 20:26 schrieb Georg-Johann Lay:
> 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.
>
> The patch is for trunk. ChangeLog for gas follows inline
> below and also as an attachment so you can
> $ git commit -F <changelog-file>
>
> Please apply when the patch is ok.
>
> Johann
>
> --
>
> ChangeLog:
>
> 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.
More information about the Binutils
mailing list