[ARC] Save/restore blink when in ISR.
gcc/ 2017-03-27 Claudiu Zissulescu <claziss@synopsys.com> * config/arc/arc.c (arc_epilogue_uses): BLINK should be also restored when in interrupt. * config/arc/arc.md (simple_return): ARCv2 rtie instruction doesn't have delay slot. 2017-03-27 Claudiu Zissulescu <claziss@synopsys.com> * testsuite/gcc.target/arc/interrupt-4.c: New file. From-SVN: r246495
This commit is contained in:
parent
c5e5f5f642
commit
84804c5b47
|
@ -1,3 +1,10 @@
|
|||
2017-03-27 Claudiu Zissulescu <claziss@synopsys.com>
|
||||
|
||||
* config/arc/arc.c (arc_epilogue_uses): BLINK should be also
|
||||
restored when in interrupt.
|
||||
* config/arc/arc.md (simple_return): ARCv2 rtie instruction
|
||||
doesn't have delay slot.
|
||||
|
||||
2017-03-27 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR ipa/79776
|
||||
|
|
|
@ -9381,9 +9381,10 @@ arc_can_follow_jump (const rtx_insn *follower, const rtx_insn *followee)
|
|||
Return true if REGNO should be added to the deemed uses of the epilogue.
|
||||
|
||||
We use the return address
|
||||
arc_return_address_regs[arc_compute_function_type (cfun)] .
|
||||
But also, we have to make sure all the register restore instructions
|
||||
are known to be live in interrupt functions. */
|
||||
arc_return_address_regs[arc_compute_function_type (cfun)]. But
|
||||
also, we have to make sure all the register restore instructions
|
||||
are known to be live in interrupt functions, plus the blink
|
||||
register if it is clobbered by the isr. */
|
||||
|
||||
bool
|
||||
arc_epilogue_uses (int regno)
|
||||
|
@ -9396,7 +9397,8 @@ arc_epilogue_uses (int regno)
|
|||
{
|
||||
if (!fixed_regs[regno])
|
||||
return true;
|
||||
return regno == arc_return_address_regs[cfun->machine->fn_type];
|
||||
return ((regno == arc_return_address_regs[cfun->machine->fn_type])
|
||||
|| (regno == RETURN_ADDR_REGNUM));
|
||||
}
|
||||
else
|
||||
return regno == RETURN_ADDR_REGNUM;
|
||||
|
|
|
@ -4748,7 +4748,12 @@
|
|||
output_asm_insn (\"j%!%* [%0]%&\", ®);
|
||||
return \"\";
|
||||
}
|
||||
[(set_attr "type" "return")
|
||||
[(set (attr "type")
|
||||
(cond [(and (eq (symbol_ref "arc_compute_function_type (cfun)")
|
||||
(symbol_ref "ARC_FUNCTION_ILINK1"))
|
||||
(match_test "TARGET_V2"))
|
||||
(const_string "brcc_no_delay_slot")]
|
||||
(const_string "return")))
|
||||
; predicable won't help here since the canonical rtl looks different
|
||||
; for branches.
|
||||
(set (attr "cond")
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2017-03-27 Claudiu Zissulescu <claziss@synopsys.com>
|
||||
|
||||
* testsuite/gcc.target/arc/interrupt-4.c: New file.
|
||||
|
||||
2017-03-27 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR ipa/79776
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
#if defined (__ARCHS__) || defined (__ARCEM__)
|
||||
#define RILINK "ilink"
|
||||
#else
|
||||
#define RILINK "ilink1"
|
||||
#endif
|
||||
|
||||
extern int gpio_int;
|
||||
extern int read_reg (int);
|
||||
|
||||
void __attribute__ ((interrupt(RILINK)))
|
||||
isr_handler (void)
|
||||
{
|
||||
gpio_int = read_reg (1);
|
||||
}
|
||||
/* { dg-final { scan-assembler-times "blink" 2 } } */
|
Loading…
Reference in New Issue