[ARC] Save/restore blink when in ISR.
authorClaudiu Zissulescu <claziss@synopsys.com>
Mon, 27 Mar 2017 10:56:04 +0000 (12:56 +0200)
committerClaudiu Zissulescu <claziss@gcc.gnu.org>
Mon, 27 Mar 2017 10:56:04 +0000 (12:56 +0200)
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

gcc/ChangeLog
gcc/config/arc/arc.c
gcc/config/arc/arc.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arc/interrupt-4.c [new file with mode: 0644]

index 2997a003f820966fd246fd2ad2e68d9beced3512..336fa7fedf154312e343f31e6827ba85736e881d 100644 (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
index 1116b2dbc253fcc57c2a38d4358b549d126f967c..0563a74b72471764890e012cfa5692b19fee1fca 100644 (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;
index a65735f8a7d5a766e6b8626b2bda3488c2a98738..88b7fca8c08e25c6b08967866cd401ee6795a1c7 100644 (file)
   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")
index 169a2ca5b5d3a130086cd9d0063d25914a1c203c..184ccdb4712171805348e2c6ba39d98590bcb98d 100644 (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
diff --git a/gcc/testsuite/gcc.target/arc/interrupt-4.c b/gcc/testsuite/gcc.target/arc/interrupt-4.c
new file mode 100644 (file)
index 0000000..ea6596e
--- /dev/null
@@ -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 } } */