OSDN Git Service

* MAINTAINERS: Add myself as a maintainer for the RX port.
[pf3gnuchains/gcc-fork.git] / gcc / genemit.c
index 79db84e..d7cbd10 100644 (file)
@@ -1,12 +1,12 @@
 /* Generate code from machine description to emit insns as rtl.
    Copyright (C) 1987, 1988, 1991, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
-   2003, 2004, 2005 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,9 +15,8 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 
 #include "bconfig.h"
@@ -258,6 +257,7 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used)
       return;
 
     case CONST_DOUBLE:
+    case CONST_FIXED:
       /* These shouldn't be written in MD files.  Instead, the appropriate
         routines in varasm.c should be called.  */
       gcc_unreachable ();
@@ -357,17 +357,17 @@ gen_insn (rtx insn, int lineno)
 
              for (j = i + 1; j < XVECLEN (insn, 1); j++)
                {
-                 rtx old = XEXP (XVECEXP (p->pattern, 1, j), 0);
-                 rtx new = XEXP (XVECEXP (insn, 1, j), 0);
+                 rtx old_rtx = XEXP (XVECEXP (p->pattern, 1, j), 0);
+                 rtx new_rtx = XEXP (XVECEXP (insn, 1, j), 0);
 
-                 /* OLD and NEW are the same if both are to be a SCRATCH
+                 /* OLD and NEW_INSN are the same if both are to be a SCRATCH
                     of the same mode,
                     or if both are registers of the same mode and number.  */
-                 if (! (GET_MODE (old) == GET_MODE (new)
-                        && ((GET_CODE (old) == MATCH_SCRATCH
-                             && GET_CODE (new) == MATCH_SCRATCH)
-                            || (REG_P (old) && REG_P (new)
-                                && REGNO (old) == REGNO (new)))))
+                 if (! (GET_MODE (old_rtx) == GET_MODE (new_rtx)
+                        && ((GET_CODE (old_rtx) == MATCH_SCRATCH
+                             && GET_CODE (new_rtx) == MATCH_SCRATCH)
+                            || (REG_P (old_rtx) && REG_P (new_rtx)
+                                && REGNO (old_rtx) == REGNO (new_rtx)))))
                    break;
                }
 
@@ -428,15 +428,18 @@ gen_insn (rtx insn, int lineno)
     }
   else
     {
+      char *used = XCNEWVEC (char, operands);
+
       printf ("  return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (%d",
              XVECLEN (insn, 1));
 
       for (i = 0; i < XVECLEN (insn, 1); i++)
        {
          printf (",\n\t\t");
-         gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN, NULL);
+         gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN, used);
        }
       printf ("));\n}\n\n");
+      XDELETEVEC (used);
     }
 }
 \f
@@ -447,6 +450,7 @@ gen_expand (rtx expand)
 {
   int operands;
   int i;
+  char *used;
 
   if (strlen (XSTR (expand, 0)) == 0)
     fatal ("define_expand lacks a name");
@@ -530,6 +534,9 @@ gen_expand (rtx expand)
      Use emit_insn to add them to the sequence being accumulated.
      But don't do this if the user's code has set `no_more' nonzero.  */
 
+  used = XCNEWVEC (char,
+                  MAX (operands, MAX (max_scratch_opno, max_dup_opno) + 1));
+
   for (i = 0; i < XVECLEN (expand, 1); i++)
     {
       rtx next = XVECEXP (expand, 1, i);
@@ -560,13 +567,15 @@ gen_expand (rtx expand)
        printf ("  emit (");
       else
        printf ("  emit_insn (");
-      gen_exp (next, DEFINE_EXPAND, NULL);
+      gen_exp (next, DEFINE_EXPAND, used);
       printf (");\n");
       if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC
          && GET_CODE (SET_SRC (next)) == LABEL_REF)
        printf ("  emit_barrier ();");
     }
 
+  XDELETEVEC (used);
+
   /* Call `get_insns' to extract the list of all the
      insns emitted within this gen_... function.  */
 
@@ -612,7 +621,7 @@ gen_split (rtx split)
   else
     {
       printf ("extern rtx gen_split_%d (rtx, rtx *);\n", insn_code_number);
-      printf ("rtx\ngen_split_%d (rtx curr_insn ATTRIBUTE_UNUSED, rtx *operands%s)\n", 
+      printf ("rtx\ngen_split_%d (rtx curr_insn ATTRIBUTE_UNUSED, rtx *operands%s)\n",
              insn_code_number, unused);
     }
   printf ("{\n");
@@ -836,6 +845,7 @@ from the machine description file `md'.  */\n\n");
   printf ("#include \"expr.h\"\n");
   printf ("#include \"optabs.h\"\n");
   printf ("#include \"real.h\"\n");
+  printf ("#include \"dfp.h\"\n");
   printf ("#include \"flags.h\"\n");
   printf ("#include \"output.h\"\n");
   printf ("#include \"insn-config.h\"\n");
@@ -844,9 +854,11 @@ from the machine description file `md'.  */\n\n");
   printf ("#include \"resource.h\"\n");
   printf ("#include \"reload.h\"\n");
   printf ("#include \"toplev.h\"\n");
+  printf ("#include \"regs.h\"\n");
   printf ("#include \"tm-constrs.h\"\n");
-  printf ("#include \"ggc.h\"\n\n");
-  printf ("#include \"basic-block.h\"\n\n");
+  printf ("#include \"ggc.h\"\n");
+  printf ("#include \"basic-block.h\"\n");
+  printf ("#include \"integrate.h\"\n\n");
   printf ("#define FAIL return (end_sequence (), _val)\n");
   printf ("#define DONE return (_val = get_insns (), end_sequence (), _val)\n\n");