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

Georg-Johann Lay avr@gjlay.de
Sun Feb 16 19:26:53 GMT 2025


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.
-------------- 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/20250216/054e688c/attachment.bin>


More information about the Binutils mailing list