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.
1 file changed