[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:
Claudiu Zissulescu 2017-03-27 12:56:04 +02:00 committed by Claudiu Zissulescu
parent c5e5f5f642
commit 84804c5b47
5 changed files with 38 additions and 5 deletions

View File

@ -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

View File

@ -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;

View File

@ -4748,7 +4748,12 @@
output_asm_insn (\"j%!%* [%0]%&\", &reg);
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")

View File

@ -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

View File

@ -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 } } */