[PATCH][PING][AVR] Fix PR32704: Better ISR prologues

Georg-Johann Lay avr@gjlay.de
Wed Feb 26 18:27:33 GMT 2025


Ping for this patch for PR gas/32704

https://sourceware.org/pipermail/binutils/2025-February/139497.html

This patch is for trunk.  Ok to apply?

Johann

> 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.
> 
> 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.
> -------------- next part --------------
> 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pr32704-gas.diff
Type: text/x-patch
Size: 8141 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20250226/51139a23/attachment-0001.bin>


More information about the Binutils mailing list