[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