[ARC] Fix and refurbish the interrupts

Programming / Compilers / GCC - claziss [138bc75d-0d04-0410-961f-82ee72b054a4] - 24 July 2019 12:21 EDT

When entering an interrupt, not only the call save registers needs to be place on stack but also the call clobbers one. More over, the ARC700 return from interrupt instruction needs to be rtie, the same like ARCv2 CPUs. While the ARC6xx family uses j.f [ilinkX] instruction. Additionally, we need to save the state of the ZOL machinery, namely the lp_count, lp_end and lp_start registers. For architectures which are using extension registers (i.e., HS48) we need to save/restore them as well.

gcc/ xxxx-xx-xx Claudiu Zissulescu

- config/arc/arc-protos.h (arc_output_function_epilogue): Delete declaration. (arc_compute_frame_size): Millicode is disabled when compiling ISR. (arc_return_address_register): Likewise. (arc_compute_function_type): Likewise. (arc_compute_frame_size): Likewise. (secondary_reload_info): Likewise. (arc_get_unalign): Likewise. (arc_can_use_return_insn): Declare.
- config/arc/arc.c (AUX_LP_START): Define (AUX_LP_END): Likewise. (arc_frame_info): Update gmask member to 64-bit datum. (GMASK_LEN): Update. (arc_compute_function_type): Make it static, move it forward. (arc_must_save_register): Update, consider the extra regs. (arc_compute_millicode_save_restore_regs): Update to use the 64 bit gmask. (arc_compute_frame_size): Likewise. (arc_enter_leave_p): Likewise. (arc_save_callee_saves): Likewise. (arc_restore_callee_saves): Likewise. (arc_save_callee_enter): Likewise. (arc_restore_callee_leave): Likewise. (arc_save_callee_milli): Likewise. (arc_restore_callee_milli): Likewise. (arc_expand_prologue): Add new interrupt handling. (arc_return_address_register): Make it static, move it forward. (arc_expand_epilogue): Add new interrupt handling. (arc_get_unalign): Delete. (arc_epilogue_uses): Make sure we do not remove the extra saved/restored registers when interrupt. (arc_can_use_return_insn): New function. (push_reg): Likewise. (pop_reg): Likewise. (arc_save_callee_saves): Add ZOL and FPX aux registers saving procedures. (arc_restore_callee_saves): Likewise, but restoring.
- config/arc/arc.md (VUNSPEC_ARC_ARC600_RTIE): Define. (R33_REG): Likewise. (R34_REG): Likewise. (R35_REG): Likewise. (R36_REG): Likewise. (R37_REG): Likewise. (R38_REG): Likewise. (R39_REG): Likewise. (R45_REG): Likewise. (R46_REG): Likewise. (R47_REG): Likewise. (R48_REG): Likewise. (R49_REG): Likewise. (R50_REG): Likewise. (R51_REG): Likewise. (R52_REG): Likewise. (R53_REG): Likewise. (R54_REG): Likewise. (R55_REG): Likewise. (R56_REG): Likewise. (R58_REG): Likewise. (type): Add rtie attribute. (in_call_delay_slot): Use RETURN_ADDR_REGNUM. (movsi_insn): Accept moves to lp_count. (rtie): Update pattern. (simple_return): Simplify it, don't use this pattern as a return from an interrupt. (arc600_rtie): New pattern. (p_return_i): Clean up. (return): Likewise.
- config/arc/builtins.def (rtie): Only available for non ARC6xx family CPUs.
- config/arc/predicates.md (move_src_operand): Consider lp_count as a register.

gcc/testsuite xxxx-xx-xx Claudiu Zissulescu

- gcc.target/arc/arc.exp (check_effective_target_accregs): New predicate.
- gcc.target/arc/builtin_special.c: Update test/
- gcc.target/arc/interrupt-1.c: Likewise.
- gcc.target/arc/interrupt-10.c: New test.
- gcc.target/arc/interrupt-11.c: Likewise.
- gcc.target/arc/interrupt-12.c: Likewise.

update

3ff00e683d5 [ARC] Fix and refurbish the interrupts.
gcc/ChangeLog | 75 +++
gcc/config/arc/arc-protos.h | 7 +-
gcc/config/arc/arc.c | 741 ++++++++++++++++---------
gcc/config/arc/arc.md | 139 ++---
gcc/config/arc/builtins.def | 2 +-
gcc/config/arc/predicates.md | 2 +
gcc/testsuite/ChangeLog | 10 +
gcc/testsuite/gcc.target/arc/arc.exp | 18 +
gcc/testsuite/gcc.target/arc/builtin_special.c | 2 +
gcc/testsuite/gcc.target/arc/interrupt-1.c | 4 +-
gcc/testsuite/gcc.target/arc/interrupt-10.c | 36 ++
gcc/testsuite/gcc.target/arc/interrupt-11.c | 16 +
gcc/testsuite/gcc.target/arc/interrupt-12.c | 16 +
13 files changed, 713 insertions(+), 355 deletions(-)

Upstream: gcc.gnu.org


  • Share