]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - gcc/genemit.c
Imported gcc-4.4.3
[msp430-gcc.git] / gcc / genemit.c
index 5a7f32ae2da8a2acb04a0dbc0914bf76784663f2..d7cbd10b38e7e4289a754db6b9c5ba8104e94a23 100644 (file)
@@ -1,12 +1,12 @@
 /* Generate code from machine description to emit insns as rtl.
 /* Generate code from machine description to emit insns as rtl.
-   Copyright (C) 1987, 1988, 1991, 1994, 1995, 1997, 1998, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1991, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
+   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
 
 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
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,13 +15,14 @@ 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
 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, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 
 
 
-#include "hconfig.h"
+#include "bconfig.h"
 #include "system.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "rtl.h"
 #include "errors.h"
 #include "gensupport.h"
 #include "rtl.h"
 #include "errors.h"
 #include "gensupport.h"
@@ -30,12 +31,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 static int max_opno;
 static int max_dup_opno;
 static int max_scratch_opno;
 static int max_opno;
 static int max_dup_opno;
 static int max_scratch_opno;
-static int register_constraints;
 static int insn_code_number;
 static int insn_index_number;
 
 /* Data structure for recording the patterns of insns that have CLOBBERs.
 static int insn_code_number;
 static int insn_index_number;
 
 /* Data structure for recording the patterns of insns that have CLOBBERs.
-   We use this to output a function that adds these CLOBBERs to a 
+   We use this to output a function that adds these CLOBBERs to a
    previously-allocated PARALLEL expression.  */
 
 struct clobber_pat
    previously-allocated PARALLEL expression.  */
 
 struct clobber_pat
@@ -55,22 +55,21 @@ struct clobber_ent
   struct clobber_ent *next;
 };
 
   struct clobber_ent *next;
 };
 
-static void max_operand_1              PARAMS ((rtx));
-static int max_operand_vec             PARAMS ((rtx, int));
-static void print_code                 PARAMS ((RTX_CODE));
-static void gen_exp                    PARAMS ((rtx, enum rtx_code, char *));
-static void gen_insn                   PARAMS ((rtx));
-static void gen_expand                 PARAMS ((rtx));
-static void gen_split                  PARAMS ((rtx));
-static void output_add_clobbers                PARAMS ((void));
-static void output_added_clobbers_hard_reg_p PARAMS ((void));
-static void gen_rtx_scratch            PARAMS ((rtx, enum rtx_code));
-static void output_peephole2_scratches PARAMS ((rtx));
+static void max_operand_1              (rtx);
+static int max_operand_vec             (rtx, int);
+static void print_code                 (RTX_CODE);
+static void gen_exp                    (rtx, enum rtx_code, char *);
+static void gen_insn                   (rtx, int);
+static void gen_expand                 (rtx);
+static void gen_split                  (rtx);
+static void output_add_clobbers                (void);
+static void output_added_clobbers_hard_reg_p (void);
+static void gen_rtx_scratch            (rtx, enum rtx_code);
+static void output_peephole2_scratches (rtx);
 
 \f
 static void
 
 \f
 static void
-max_operand_1 (x)
-     rtx x;
+max_operand_1 (rtx x)
 {
   RTX_CODE code;
   int i;
 {
   RTX_CODE code;
   int i;
@@ -82,10 +81,6 @@ max_operand_1 (x)
 
   code = GET_CODE (x);
 
 
   code = GET_CODE (x);
 
-  if (code == MATCH_OPERAND && XSTR (x, 2) != 0 && *XSTR (x, 2) != '\0')
-    register_constraints = 1;
-  if (code == MATCH_SCRATCH && XSTR (x, 1) != 0 && *XSTR (x, 1) != '\0')
-    register_constraints = 1;
   if (code == MATCH_OPERAND || code == MATCH_OPERATOR
       || code == MATCH_PARALLEL)
     max_opno = MAX (max_opno, XINT (x, 0));
   if (code == MATCH_OPERAND || code == MATCH_OPERATOR
       || code == MATCH_PARALLEL)
     max_opno = MAX (max_opno, XINT (x, 0));
@@ -110,9 +105,7 @@ max_operand_1 (x)
 }
 
 static int
 }
 
 static int
-max_operand_vec (insn, arg)
-     rtx insn;
-     int arg;
+max_operand_vec (rtx insn, int arg)
 {
   int len = XVECLEN (insn, arg);
   int i;
 {
   int len = XVECLEN (insn, arg);
   int i;
@@ -128,8 +121,7 @@ max_operand_vec (insn, arg)
 }
 \f
 static void
 }
 \f
 static void
-print_code (code)
-     RTX_CODE code;
+print_code (RTX_CODE code)
 {
   const char *p1;
   for (p1 = GET_RTX_NAME (code); *p1; p1++)
 {
   const char *p1;
   for (p1 = GET_RTX_NAME (code); *p1; p1++)
@@ -137,9 +129,7 @@ print_code (code)
 }
 
 static void
 }
 
 static void
-gen_rtx_scratch (x, subroutine_type)
-     rtx x;
-     enum rtx_code subroutine_type;
+gen_rtx_scratch (rtx x, enum rtx_code subroutine_type)
 {
   if (subroutine_type == DEFINE_PEEPHOLE2)
     {
 {
   if (subroutine_type == DEFINE_PEEPHOLE2)
     {
@@ -155,10 +145,7 @@ gen_rtx_scratch (x, subroutine_type)
    substituting any operand references appearing within.  */
 
 static void
    substituting any operand references appearing within.  */
 
 static void
-gen_exp (x, subroutine_type, used)
-     rtx x;
-     enum rtx_code subroutine_type;
-     char *used;
+gen_exp (rtx x, enum rtx_code subroutine_type, char *used)
 {
   RTX_CODE code;
   int i;
 {
   RTX_CODE code;
   int i;
@@ -190,7 +177,10 @@ gen_exp (x, subroutine_type, used)
       return;
 
     case MATCH_OP_DUP:
       return;
 
     case MATCH_OP_DUP:
-      printf ("gen_rtx (GET_CODE (operand%d), ", XINT (x, 0));
+      printf ("gen_rtx_fmt_");
+      for (i = 0; i < XVECLEN (x, 1); i++)
+       printf ("e");
+      printf (" (GET_CODE (operand%d), ", XINT (x, 0));
       if (GET_MODE (x) == VOIDmode)
        printf ("GET_MODE (operand%d)", XINT (x, 0));
       else
       if (GET_MODE (x) == VOIDmode)
        printf ("GET_MODE (operand%d)", XINT (x, 0));
       else
@@ -204,7 +194,10 @@ gen_exp (x, subroutine_type, used)
       return;
 
     case MATCH_OPERATOR:
       return;
 
     case MATCH_OPERATOR:
-      printf ("gen_rtx (GET_CODE (operand%d)", XINT (x, 0));
+      printf ("gen_rtx_fmt_");
+      for (i = 0; i < XVECLEN (x, 2); i++)
+       printf ("e");
+      printf (" (GET_CODE (operand%d)", XINT (x, 0));
       printf (", %smode", GET_MODE_NAME (GET_MODE (x)));
       for (i = 0; i < XVECLEN (x, 2); i++)
        {
       printf (", %smode", GET_MODE_NAME (GET_MODE (x)));
       for (i = 0; i < XVECLEN (x, 2); i++)
        {
@@ -229,6 +222,14 @@ gen_exp (x, subroutine_type, used)
     case PC:
       printf ("pc_rtx");
       return;
     case PC:
       printf ("pc_rtx");
       return;
+    case CLOBBER:
+      if (REG_P (XEXP (x, 0)))
+       {
+         printf ("gen_hard_reg_clobber (%smode, %i)", GET_MODE_NAME (GET_MODE (XEXP (x, 0))),
+                                                    REGNO (XEXP (x, 0)));
+         return;
+       }
+      break;
 
     case CC0:
       printf ("cc0_rtx");
 
     case CC0:
       printf ("cc0_rtx");
@@ -241,20 +242,25 @@ gen_exp (x, subroutine_type, used)
        printf ("const1_rtx");
       else if (INTVAL (x) == -1)
        printf ("constm1_rtx");
        printf ("const1_rtx");
       else if (INTVAL (x) == -1)
        printf ("constm1_rtx");
+      else if (-MAX_SAVED_CONST_INT <= INTVAL (x)
+         && INTVAL (x) <= MAX_SAVED_CONST_INT)
+       printf ("const_int_rtx[MAX_SAVED_CONST_INT + (%d)]",
+               (int) INTVAL (x));
       else if (INTVAL (x) == STORE_FLAG_VALUE)
        printf ("const_true_rtx");
       else
        {
          printf ("GEN_INT (");
       else if (INTVAL (x) == STORE_FLAG_VALUE)
        printf ("const_true_rtx");
       else
        {
          printf ("GEN_INT (");
-         printf (HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
+         printf (HOST_WIDE_INT_PRINT_DEC_C, INTVAL (x));
          printf (")");
        }
       return;
 
     case CONST_DOUBLE:
          printf (")");
        }
       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.  */
       /* These shouldn't be written in MD files.  Instead, the appropriate
         routines in varasm.c should be called.  */
-      abort ();
+      gcc_unreachable ();
 
     default:
       break;
 
     default:
       break;
@@ -271,34 +277,44 @@ gen_exp (x, subroutine_type, used)
       if (fmt[i] == '0')
        break;
       printf (",\n\t");
       if (fmt[i] == '0')
        break;
       printf (",\n\t");
-      if (fmt[i] == 'e' || fmt[i] == 'u')
-       gen_exp (XEXP (x, i), subroutine_type, used);
-      else if (fmt[i] == 'i')
-       printf ("%u", XINT (x, i));
-      else if (fmt[i] == 's')
-       printf ("\"%s\"", XSTR (x, i));
-      else if (fmt[i] == 'E')
+      switch (fmt[i])
        {
        {
-         int j;
-         printf ("gen_rtvec (%d", XVECLEN (x, i));
-         for (j = 0; j < XVECLEN (x, i); j++)
-           {
-             printf (",\n\t\t");
-             gen_exp (XVECEXP (x, i, j), subroutine_type, used);
-           }
-         printf (")");
+       case 'e': case 'u':
+         gen_exp (XEXP (x, i), subroutine_type, used);
+         break;
+
+       case 'i':
+         printf ("%u", XINT (x, i));
+         break;
+
+       case 's':
+         printf ("\"%s\"", XSTR (x, i));
+         break;
+
+       case 'E':
+         {
+           int j;
+           printf ("gen_rtvec (%d", XVECLEN (x, i));
+           for (j = 0; j < XVECLEN (x, i); j++)
+             {
+               printf (",\n\t\t");
+               gen_exp (XVECEXP (x, i, j), subroutine_type, used);
+             }
+           printf (")");
+           break;
+         }
+
+       default:
+         gcc_unreachable ();
        }
        }
-      else
-       abort ();
     }
   printf (")");
     }
   printf (")");
-}  
+}
 \f
 /* Generate the `gen_...' function for a DEFINE_INSN.  */
 
 static void
 \f
 /* Generate the `gen_...' function for a DEFINE_INSN.  */
 
 static void
-gen_insn (insn)
-     rtx insn;
+gen_insn (rtx insn, int lineno)
 {
   int operands;
   int i;
 {
   int operands;
   int i;
@@ -316,7 +332,7 @@ gen_insn (insn)
          if (GET_CODE (XVECEXP (insn, 1, i)) != CLOBBER)
            break;
 
          if (GET_CODE (XVECEXP (insn, 1, i)) != CLOBBER)
            break;
 
-         if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) == REG)
+         if (REG_P (XEXP (XVECEXP (insn, 1, i), 0)))
            has_hard_reg = 1;
          else if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != MATCH_SCRATCH)
            break;
            has_hard_reg = 1;
          else if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != MATCH_SCRATCH)
            break;
@@ -325,8 +341,7 @@ gen_insn (insn)
       if (i != XVECLEN (insn, 1) - 1)
        {
          struct clobber_pat *p;
       if (i != XVECLEN (insn, 1) - 1)
        {
          struct clobber_pat *p;
-         struct clobber_ent *link
-           = (struct clobber_ent *) xmalloc (sizeof (struct clobber_ent));
+         struct clobber_ent *link = XNEW (struct clobber_ent);
          int j;
 
          link->code_number = insn_code_number;
          int j;
 
          link->code_number = insn_code_number;
@@ -342,28 +357,28 @@ gen_insn (insn)
 
              for (j = i + 1; j < XVECLEN (insn, 1); j++)
                {
 
              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
-                    of the same mode, 
+                 /* 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.  */
                     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)
-                            || (GET_CODE (old) == REG && GET_CODE (new) == REG
-                                && 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;
                }
                    break;
                }
-      
+
              if (j == XVECLEN (insn, 1))
                break;
            }
 
          if (p == 0)
            {
              if (j == XVECLEN (insn, 1))
                break;
            }
 
          if (p == 0)
            {
-             p = (struct clobber_pat *) xmalloc (sizeof (struct clobber_pat));
-         
+             p = XNEW (struct clobber_pat);
+
              p->insns = 0;
              p->pattern = insn;
              p->first_clobber = i + 1;
              p->insns = 0;
              p->pattern = insn;
              p->first_clobber = i + 1;
@@ -383,26 +398,27 @@ gen_insn (insn)
   if (XSTR (insn, 0)[0] == 0 || XSTR (insn, 0)[0] == '*')
     return;
 
   if (XSTR (insn, 0)[0] == 0 || XSTR (insn, 0)[0] == '*')
     return;
 
-  /* Find out how many operands this function has,
-     and also whether any of them have register constraints.  */
-  register_constraints = 0;
+  printf ("/* %s:%d */\n", read_rtx_filename, lineno);
+
+  /* Find out how many operands this function has.  */
   operands = max_operand_vec (insn, 1);
   if (max_dup_opno >= operands)
     fatal ("match_dup operand number has no match_operand");
 
   /* Output the function name and argument declarations.  */
   printf ("rtx\ngen_%s (", XSTR (insn, 0));
   operands = max_operand_vec (insn, 1);
   if (max_dup_opno >= operands)
     fatal ("match_dup operand number has no match_operand");
 
   /* Output the function name and argument declarations.  */
   printf ("rtx\ngen_%s (", XSTR (insn, 0));
-  for (i = 0; i < operands; i++)
-    if (i)
-      printf (", operand%d", i);
-    else
-      printf ("operand%d", i);
+  if (operands)
+    for (i = 0; i < operands; i++)
+      if (i)
+       printf (",\n\trtx operand%d ATTRIBUTE_UNUSED", i);
+      else
+       printf ("rtx operand%d ATTRIBUTE_UNUSED", i);
+  else
+    printf ("void");
   printf (")\n");
   printf (")\n");
-  for (i = 0; i < operands; i++)
-    printf ("     rtx operand%d;\n", i);
   printf ("{\n");
 
   printf ("{\n");
 
-  /* Output code to construct and return the rtl for the instruction body */
+  /* Output code to construct and return the rtl for the instruction body */
 
   if (XVECLEN (insn, 1) == 1)
     {
 
   if (XVECLEN (insn, 1) == 1)
     {
@@ -412,48 +428,49 @@ gen_insn (insn)
     }
   else
     {
     }
   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");
       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");
        }
       printf ("));\n}\n\n");
+      XDELETEVEC (used);
     }
 }
 \f
 /* Generate the `gen_...' function for a DEFINE_EXPAND.  */
 
 static void
     }
 }
 \f
 /* Generate the `gen_...' function for a DEFINE_EXPAND.  */
 
 static void
-gen_expand (expand)
-     rtx expand;
+gen_expand (rtx expand)
 {
   int operands;
   int i;
 {
   int operands;
   int i;
+  char *used;
 
   if (strlen (XSTR (expand, 0)) == 0)
     fatal ("define_expand lacks a name");
   if (XVEC (expand, 1) == 0)
     fatal ("define_expand for %s lacks a pattern", XSTR (expand, 0));
 
 
   if (strlen (XSTR (expand, 0)) == 0)
     fatal ("define_expand lacks a name");
   if (XVEC (expand, 1) == 0)
     fatal ("define_expand for %s lacks a pattern", XSTR (expand, 0));
 
-  /* Find out how many operands this function has,
-     and also whether any of them have register constraints.  */
-  register_constraints = 0;
-
+  /* Find out how many operands this function has.  */
   operands = max_operand_vec (expand, 1);
 
   /* Output the function name and argument declarations.  */
   printf ("rtx\ngen_%s (", XSTR (expand, 0));
   operands = max_operand_vec (expand, 1);
 
   /* Output the function name and argument declarations.  */
   printf ("rtx\ngen_%s (", XSTR (expand, 0));
-  for (i = 0; i < operands; i++)
-    if (i)
-      printf (", operand%d", i);
-    else
-      printf ("operand%d", i);
+  if (operands)
+    for (i = 0; i < operands; i++)
+      if (i)
+       printf (",\n\trtx operand%d", i);
+      else
+       printf ("rtx operand%d", i);
+  else
+    printf ("void");
   printf (")\n");
   printf (")\n");
-  for (i = 0; i < operands; i++)
-    printf ("     rtx operand%d;\n", i);
   printf ("{\n");
 
   /* If we don't have any C code to write, only one insn is being written,
   printf ("{\n");
 
   /* If we don't have any C code to write, only one insn is being written,
@@ -496,6 +513,7 @@ gen_expand (expand)
 
       /* Output the special code to be executed before the sequence
         is generated.  */
 
       /* Output the special code to be executed before the sequence
         is generated.  */
+      print_rtx_ptr_loc (XSTR (expand, 3));
       printf ("%s\n", XSTR (expand, 3));
 
       /* Output code to copy the arguments back out of `operands'
       printf ("%s\n", XSTR (expand, 3));
 
       /* Output code to copy the arguments back out of `operands'
@@ -516,13 +534,17 @@ gen_expand (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.  */
 
      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);
       if ((GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC)
          || (GET_CODE (next) == PARALLEL
   for (i = 0; i < XVECLEN (expand, 1); i++)
     {
       rtx next = XVECEXP (expand, 1, i);
       if ((GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC)
          || (GET_CODE (next) == PARALLEL
-             && GET_CODE (XVECEXP (next, 0, 0)) == SET
-             && GET_CODE (SET_DEST (XVECEXP (next, 0, 0))) == PC)
+             && ((GET_CODE (XVECEXP (next, 0, 0)) == SET
+                  && GET_CODE (SET_DEST (XVECEXP (next, 0, 0))) == PC)
+                 || GET_CODE (XVECEXP (next, 0, 0)) == RETURN))
          || GET_CODE (next) == RETURN)
        printf ("  emit_jump_insn (");
       else if ((GET_CODE (next) == SET && GET_CODE (SET_SRC (next)) == CALL)
          || GET_CODE (next) == RETURN)
        printf ("  emit_jump_insn (");
       else if ((GET_CODE (next) == SET && GET_CODE (SET_SRC (next)) == CALL)
@@ -533,7 +555,7 @@ gen_expand (expand)
               || (GET_CODE (next) == PARALLEL
                   && GET_CODE (XVECEXP (next, 0, 0)) == CALL))
        printf ("  emit_call_insn (");
               || (GET_CODE (next) == PARALLEL
                   && GET_CODE (XVECEXP (next, 0, 0)) == CALL))
        printf ("  emit_call_insn (");
-      else if (GET_CODE (next) == CODE_LABEL)
+      else if (LABEL_P (next))
        printf ("  emit_label (");
       else if (GET_CODE (next) == MATCH_OPERAND
               || GET_CODE (next) == MATCH_DUP
        printf ("  emit_label (");
       else if (GET_CODE (next) == MATCH_OPERAND
               || GET_CODE (next) == MATCH_DUP
@@ -545,26 +567,27 @@ gen_expand (expand)
        printf ("  emit (");
       else
        printf ("  emit_insn (");
        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 ();");
     }
 
       printf (");\n");
       if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC
          && GET_CODE (SET_SRC (next)) == LABEL_REF)
        printf ("  emit_barrier ();");
     }
 
-  /* Call `gen_sequence' to make a SEQUENCE out of all the
+  XDELETEVEC (used);
+
+  /* Call `get_insns' to extract the list of all the
      insns emitted within this gen_... function.  */
 
      insns emitted within this gen_... function.  */
 
-  printf ("  _val = gen_sequence ();\n");
+  printf ("  _val = get_insns ();\n");
   printf ("  end_sequence ();\n");
   printf ("  return _val;\n}\n\n");
 }
 
   printf ("  end_sequence ();\n");
   printf ("  return _val;\n}\n\n");
 }
 
-/* Like gen_expand, but generates a SEQUENCE.  */
+/* Like gen_expand, but generates insns resulting from splitting SPLIT.  */
 
 static void
 
 static void
-gen_split (split)
-     rtx split;
+gen_split (rtx split)
 {
   int i;
   int operands;
 {
   int i;
   int operands;
@@ -585,23 +608,21 @@ gen_split (split)
   max_operand_vec (split, 2);
   operands = MAX (max_opno, MAX (max_dup_opno, max_scratch_opno)) + 1;
   unused = (operands == 0 ? " ATTRIBUTE_UNUSED" : "");
   max_operand_vec (split, 2);
   operands = MAX (max_opno, MAX (max_dup_opno, max_scratch_opno)) + 1;
   unused = (operands == 0 ? " ATTRIBUTE_UNUSED" : "");
-  used = xcalloc (1, operands);
+  used = XCNEWVEC (char, operands);
 
   /* Output the prototype, function name and argument declarations.  */
   if (GET_CODE (split) == DEFINE_PEEPHOLE2)
     {
 
   /* Output the prototype, function name and argument declarations.  */
   if (GET_CODE (split) == DEFINE_PEEPHOLE2)
     {
-      printf ("extern rtx gen_%s_%d PARAMS ((rtx, rtx *));\n",
-             name, insn_code_number);
-      printf ("rtx\ngen_%s_%d (curr_insn, operands)\n",
+      printf ("extern rtx gen_%s_%d (rtx, rtx *);\n",
              name, insn_code_number);
              name, insn_code_number);
-      printf ("     rtx curr_insn ATTRIBUTE_UNUSED;\n");
-      printf ("     rtx *operands%s;\n", unused);
+      printf ("rtx\ngen_%s_%d (rtx curr_insn ATTRIBUTE_UNUSED, rtx *operands%s)\n",
+             name, insn_code_number, unused);
     }
   else
     {
     }
   else
     {
-      printf ("extern rtx gen_split_%d PARAMS ((rtx *));\n", insn_code_number);
-      printf ("rtx\ngen_%s_%d (operands)\n", name, insn_code_number);
-      printf ("      rtx *operands%s;\n", unused);
+      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",
+             insn_code_number, unused);
     }
   printf ("{\n");
 
     }
   printf ("{\n");
 
@@ -619,7 +640,10 @@ gen_split (split)
      before the actual construction.  */
 
   if (XSTR (split, 3))
      before the actual construction.  */
 
   if (XSTR (split, 3))
-    printf ("%s\n", XSTR (split, 3));
+    {
+      print_rtx_ptr_loc (XSTR (split, 3));
+      printf ("%s\n", XSTR (split, 3));
+    }
 
   /* Output code to copy the arguments back out of `operands'  */
   for (i = 0; i < operands; i++)
 
   /* Output code to copy the arguments back out of `operands'  */
   for (i = 0; i < operands; i++)
@@ -646,7 +670,7 @@ gen_split (split)
               || (GET_CODE (next) == PARALLEL
                   && GET_CODE (XVECEXP (next, 0, 0)) == CALL))
        printf ("  emit_call_insn (");
               || (GET_CODE (next) == PARALLEL
                   && GET_CODE (XVECEXP (next, 0, 0)) == CALL))
        printf ("  emit_call_insn (");
-      else if (GET_CODE (next) == CODE_LABEL)
+      else if (LABEL_P (next))
        printf ("  emit_label (");
       else if (GET_CODE (next) == MATCH_OPERAND
               || GET_CODE (next) == MATCH_OPERATOR
        printf ("  emit_label (");
       else if (GET_CODE (next) == MATCH_OPERAND
               || GET_CODE (next) == MATCH_OPERATOR
@@ -664,10 +688,10 @@ gen_split (split)
        printf ("  emit_barrier ();");
     }
 
        printf ("  emit_barrier ();");
     }
 
-  /* Call `gen_sequence' to make a SEQUENCE out of all the
+  /* Call `get_insns' to make a list of all the
      insns emitted within this gen_... function.  */
 
      insns emitted within this gen_... function.  */
 
-  printf ("  _val = gen_sequence ();\n");
+  printf ("  _val = get_insns ();\n");
   printf ("  end_sequence ();\n");
   printf ("  return _val;\n}\n\n");
 
   printf ("  end_sequence ();\n");
   printf ("  return _val;\n}\n\n");
 
@@ -679,14 +703,13 @@ gen_split (split)
    the end of the vector.  */
 
 static void
    the end of the vector.  */
 
 static void
-output_add_clobbers ()
+output_add_clobbers (void)
 {
   struct clobber_pat *clobber;
   struct clobber_ent *ent;
   int i;
 
 {
   struct clobber_pat *clobber;
   struct clobber_ent *ent;
   int i;
 
-  printf ("\n\nvoid\nadd_clobbers (pattern, insn_code_number)\n");
-  printf ("     rtx pattern ATTRIBUTE_UNUSED;\n     int insn_code_number;\n");
+  printf ("\n\nvoid\nadd_clobbers (rtx pattern ATTRIBUTE_UNUSED, int insn_code_number)\n");
   printf ("{\n");
   printf ("  switch (insn_code_number)\n");
   printf ("    {\n");
   printf ("{\n");
   printf ("  switch (insn_code_number)\n");
   printf ("    {\n");
@@ -708,24 +731,24 @@ output_add_clobbers ()
     }
 
   printf ("    default:\n");
     }
 
   printf ("    default:\n");
-  printf ("      abort ();\n");
+  printf ("      gcc_unreachable ();\n");
   printf ("    }\n");
   printf ("}\n");
 }
 \f
   printf ("    }\n");
   printf ("}\n");
 }
 \f
-/* Write a function, `added_clobbers_hard_reg_p' this is given an insn_code
-   number that needs clobbers and returns 1 if they include a clobber of a
-   hard reg and 0 if they just clobber SCRATCH.  */
+/* Write a function, `added_clobbers_hard_reg_p' that is given an insn_code
+   number that will have clobbers added (as indicated by `recog') and returns
+   1 if those include a clobber of a hard reg or 0 if all of them just clobber
+   SCRATCH.  */
 
 static void
 
 static void
-output_added_clobbers_hard_reg_p ()
+output_added_clobbers_hard_reg_p (void)
 {
   struct clobber_pat *clobber;
   struct clobber_ent *ent;
   int clobber_p, used;
 
 {
   struct clobber_pat *clobber;
   struct clobber_ent *ent;
   int clobber_p, used;
 
-  printf ("\n\nint\nadded_clobbers_hard_reg_p (insn_code_number)\n");
-  printf ("     int insn_code_number;\n");
+  printf ("\n\nint\nadded_clobbers_hard_reg_p (int insn_code_number)\n");
   printf ("{\n");
   printf ("  switch (insn_code_number)\n");
   printf ("    {\n");
   printf ("{\n");
   printf ("  switch (insn_code_number)\n");
   printf ("    {\n");
@@ -746,7 +769,7 @@ output_added_clobbers_hard_reg_p ()
     }
 
   printf ("    default:\n");
     }
 
   printf ("    default:\n");
-  printf ("      abort ();\n");
+  printf ("      gcc_unreachable ();\n");
   printf ("    }\n");
   printf ("}\n");
 }
   printf ("    }\n");
   printf ("}\n");
 }
@@ -755,8 +778,7 @@ output_added_clobbers_hard_reg_p ()
    scratch registers used by the peephole2 pattern in SPLIT.  */
 
 static void
    scratch registers used by the peephole2 pattern in SPLIT.  */
 
 static void
-output_peephole2_scratches (split)
-     rtx split;
+output_peephole2_scratches (rtx split)
 {
   int i;
   int insn_nr = 0;
 {
   int i;
   int insn_nr = 0;
@@ -782,7 +804,7 @@ output_peephole2_scratches (split)
              cur_insn_nr++;
 
          printf ("  if ((operands[%d] = peep2_find_free_register (%d, %d, \"%s\", %smode, &_regs_allocated)) == NULL_RTX)\n\
              cur_insn_nr++;
 
          printf ("  if ((operands[%d] = peep2_find_free_register (%d, %d, \"%s\", %smode, &_regs_allocated)) == NULL_RTX)\n\
-    return NULL;\n", 
+    return NULL;\n",
                  XINT (elt, 0),
                  insn_nr, last_insn_nr,
                  XSTR (elt, 1),
                  XINT (elt, 0),
                  insn_nr, last_insn_nr,
                  XSTR (elt, 1),
@@ -794,20 +816,13 @@ output_peephole2_scratches (split)
     }
 }
 
     }
 }
 
-extern int main PARAMS ((int, char **));
-
 int
 int
-main (argc, argv)
-     int argc;
-     char **argv;
+main (int argc, char **argv)
 {
   rtx desc;
 
   progname = "genemit";
 
 {
   rtx desc;
 
   progname = "genemit";
 
-  if (argc <= 1)
-    fatal ("no input file name");
-
   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
     return (FATAL_EXIT_CODE);
 
   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
     return (FATAL_EXIT_CODE);
 
@@ -822,12 +837,15 @@ from the machine description file `md'.  */\n\n");
 
   printf ("#include \"config.h\"\n");
   printf ("#include \"system.h\"\n");
 
   printf ("#include \"config.h\"\n");
   printf ("#include \"system.h\"\n");
+  printf ("#include \"coretypes.h\"\n");
+  printf ("#include \"tm.h\"\n");
   printf ("#include \"rtl.h\"\n");
   printf ("#include \"tm_p.h\"\n");
   printf ("#include \"function.h\"\n");
   printf ("#include \"expr.h\"\n");
   printf ("#include \"optabs.h\"\n");
   printf ("#include \"real.h\"\n");
   printf ("#include \"rtl.h\"\n");
   printf ("#include \"tm_p.h\"\n");
   printf ("#include \"function.h\"\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");
   printf ("#include \"flags.h\"\n");
   printf ("#include \"output.h\"\n");
   printf ("#include \"insn-config.h\"\n");
@@ -836,9 +854,13 @@ 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 \"resource.h\"\n");
   printf ("#include \"reload.h\"\n");
   printf ("#include \"toplev.h\"\n");
-  printf ("#include \"ggc.h\"\n\n");
+  printf ("#include \"regs.h\"\n");
+  printf ("#include \"tm-constrs.h\"\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 FAIL return (end_sequence (), _val)\n");
-  printf ("#define DONE return (_val = gen_sequence (), end_sequence (), _val)\n");
+  printf ("#define DONE return (_val = get_insns (), end_sequence (), _val)\n\n");
 
   /* Read the machine description.  */
 
 
   /* Read the machine description.  */
 
@@ -852,25 +874,28 @@ from the machine description file `md'.  */\n\n");
 
       switch (GET_CODE (desc))
        {
 
       switch (GET_CODE (desc))
        {
-         case DEFINE_INSN:
-             gen_insn (desc);
-             break;
-
-         case DEFINE_EXPAND:
-             gen_expand (desc);
-             break;
-
-         case DEFINE_SPLIT:
-             gen_split (desc);
-             break;
-
-         case DEFINE_PEEPHOLE2:
-             gen_split (desc);
-             break;
-
-         default:
-             break;
-        }
+       case DEFINE_INSN:
+         gen_insn (desc, line_no);
+         break;
+
+       case DEFINE_EXPAND:
+         printf ("/* %s:%d */\n", read_rtx_filename, line_no);
+         gen_expand (desc);
+         break;
+
+       case DEFINE_SPLIT:
+         printf ("/* %s:%d */\n", read_rtx_filename, line_no);
+         gen_split (desc);
+         break;
+
+       case DEFINE_PEEPHOLE2:
+         printf ("/* %s:%d */\n", read_rtx_filename, line_no);
+         gen_split (desc);
+         break;
+
+       default:
+         break;
+       }
       ++insn_index_number;
     }
 
       ++insn_index_number;
     }
 
@@ -882,11 +907,3 @@ from the machine description file `md'.  */\n\n");
   fflush (stdout);
   return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
 }
   fflush (stdout);
   return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
 }
-
-/* Define this so we can link with print-rtl.o to get debug_rtx function.  */
-const char *
-get_insn_name (code)
-     int code ATTRIBUTE_UNUSED;
-{
-  return NULL;
-}