[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