2017-07-07 18:31 GMT+04:00 Georg-Johann Lay <a...@gjlay.de>:
> Hi,
>
> this patch addresses a very old issue, the non-optimal
> generation of ISR prologues and epilogues.
>
> As GAS now provides the __gcc_isr pseudo instruction to
> overcome some problems, see
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=21683
>
> this can now be used to address PR20296.
>
>
> This patch does:
>
> * Add a configure test if GAS supports __gcc_isr and -mgcc-isr.
>
> * Add new option -mgas-isr-prologues to switch on / off
>   generating of __gcc_isr in ISR prologues / epilogues.
>
> * Switch on the feature per default except for -O0 and -Og.
>
> * Add a new no_gccisr function attribute to disable __gcc_isr
>   generation for individual ISRs.
>
> * Add a new pass .avr-gasisr that filters out situations where
>   __gcc_isr is not appropriate.
>
> * Extend prologue and epilogue generation to emit __gcc_isr chunks
>   during prologue and epilogue(s).
>
> * Implement final_postscan_insn to emit final __gcc_isr Done chunk.
>
> * Add -mgcc-isr to ASM_SPEC if appropriate.
>
>
> We currently have only 3 torture tests for ISRs, namely
>
> gcc.target/avr/torture/isr-*.c
>
> All these tests PASS when
>
> * Run with -mgas-isr-prologues
> * Run with -mno-gas-isr-prologues
> * Run for: atmega8 atmega64 atmega103 atmega2560 atmega128 atxmega128a1
> attiny40
>
> Ok for trunk?


Please apply.

>
> Johann
>
>         PR target/20296
>         PR target/81268
>         * configure.ac [target=avr]: Add GAS check for -mgcc-isr.
>         (HAVE_AS_AVR_MGCCISR_OPTION):  If so, AC_DEFINE it.
>         * config.in: Regenerate.
>         * configure: Regenerate.
>
>         * doc/extend.texi (AVR Function Attributes) <no_gccisr>: Document
> it.
>         * doc/invoke.texi (AVR Options) <-mgas-isr-prologues>: Document it.
>
>         * config/avr/avr.opt (-mgas-isr-prologues): New option and...
>         (TARGET_GASISR_PROLOGUES): ...target mask.
>         * common/config/avr/avr-common.c
>         (avr_option_optimization_table) [OPT_LEVELS_1_PLUS_NOT_DEBUG]:
>         Set -mgas-isr-prologues.
>         * config/avr/avr-passes.def (avr_pass_maybe_gasisr): Add
>         INSERT_PASS_BEFORE for it.
>         * config/avr/avr-protos.h (make_avr_pass_maybe_gasisr): New proto.
>         * config/avr/avr.c (avr_option_override)
>         [!HAVE_AS_AVR_MGCCISR_OPTION]: Unset TARGET_GASISR_PROLOGUES.
>         (avr_no_gccisr_function_p, avr_hregs_split_lsb): New static
> functions.
>         (avr_attribute_table) <no_gccisr>: Add new function attribute.
>         (avr_set_current_function) <is_no_gccisr>: Init machine field.
>         (avr_pass_data_gasisr, avr_pass_maybe_gasisr): New pass data
>         and rtl_opt_pass.
>         (make_avr_pass_maybe_gasisr): New function.
>         (emit_push_sfr) <treg>: Add argument to function and use it
>         instead of TMP_REG.
>         (avr_expand_prologue) [machine->gasisr.maybe]: Emit gasisr insn
>         and set machine->gasisr.yes.
>         (avr_expand_epilogue) [machine->gasisr.yes]: Similar.
>         (avr_asm_function_end_prologue) [machine->gasisr.yes]: Add
>         __gcc_isr.n_pushed to .L__stack_usage.
>         (TARGET_ASM_FINAL_POSTSCAN_INSN): Define to...
>         (avr_asm_final_postscan_insn): ...this new static function.
>         * config/avr/avr.h (machine_function)
>         <is_no_gccisr, use_L__stack_usage>: New fields.
>         <gasisr, gasisr.yes, gasisr.maybe, gasisr.regno>: New fields.
>         * config/avr/avr.md (UNSPECV_GASISR): Add unspecv enum.
>         (GASISR_Prologue, GASISR_Epilogue, GASISR_Done): New
> define_constants.
>         (gasisr, *gasisr): New expander and insn.
>         * config/avr/gen-avr-mmcu-specs.c (print_mcu)
>         [HAVE_AS_AVR_MGCCISR_OPTION]: Print asm_gccisr spec.
>         * config/avr/specs.h (ASM_SPEC) <asm_gccisr>: Add sub spec.

Reply via email to