OSDN Git Service

* config/m32c/m32c.c (m32c_emit_epilogue): Check for R8C or M16C
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Sep 2009 22:18:30 +0000 (22:18 +0000)
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Sep 2009 22:18:30 +0000 (22:18 +0000)
chip and ignore the "fast_interrupt" attribute if so.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151780 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/m32c/m32c.c

index da86ebe..bbbc1bb 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-16  DJ Delorie  <dj@redhat.com>
+
+       * config/m32c/m32c.c (m32c_emit_epilogue): Check for R8C or M16C
+       chip and ignore the "fast_interrupt" attribute if so.
+
 2009-09-16  Richard Henderson  <rth@redhat.com>
 
        PR middle-end/41360
index ae4c897..1bf3d1b 100644 (file)
@@ -4052,8 +4052,26 @@ m32c_emit_epilogue (void)
       if (!bank_switch_p (cfun->decl) && cfun->machine->intr_pushm)
        emit_insn (gen_popm (GEN_INT (cfun->machine->intr_pushm)));
 
+      /* The FREIT (Fast REturn from InTerrupt) instruction should be
+         generated only for M32C/M32CM targets (generate the REIT
+         instruction otherwise).  */
       if (fast_interrupt_p (cfun->decl))
-       emit_jump_insn (gen_epilogue_freit ());
+        {
+          /* Check if fast_attribute is set for M32C or M32CM.  */
+          if (TARGET_A24)
+            {
+              emit_jump_insn (gen_epilogue_freit ());
+            }
+          /* If fast_interrupt attribute is set for an R8C or M16C
+             target ignore this attribute and generated REIT
+             instruction.  */
+          else
+           {
+             warning (OPT_Wattributes,
+                      "%<fast_interrupt%> attribute directive ignored");
+             emit_jump_insn (gen_epilogue_reit_16 ());
+           }
+        }
       else if (TARGET_A16)
        emit_jump_insn (gen_epilogue_reit_16 ());
       else