Remove clobber_high
[platform/upstream/gcc.git] / gcc / genconfig.c
index 10bf89c..6f914b1 100644 (file)
@@ -1,78 +1,69 @@
 /* Generate from machine description:
    - some #define configuration flags.
-   Copyright (C) 1987, 1991, 1997, 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1987-2019 Free Software Foundation, Inc.
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-GNU CC 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 version.
+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 3, or (at your option) any later
+version.
 
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+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 GNU CC; 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 "coretypes.h"
+#include "tm.h"
 #include "rtl.h"
-#include "obstack.h"
+#include "errors.h"
+#include "gensupport.h"
 
-static struct obstack obstack;
-struct obstack *rtl_obstack = &obstack;
-
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
-
-/* Define this so we can link with print-rtl.o to get debug_rtx function.  */
-char **insn_name_ptr = 0;
 
 /* flags to determine output of machine description dependent #define's.  */
 static int max_recog_operands;  /* Largest operand number seen.  */
 static int max_dup_operands;    /* Largest number of match_dup in any insn.  */
 static int max_clobbers_per_insn;
-static int register_constraint_flag;
 static int have_cc0_flag;
 static int have_cmove_flag;
+static int have_cond_exec_flag;
 static int have_lo_sum_flag;
+static int have_rotate_flag;
+static int have_rotatert_flag;
+static int have_peephole_flag;
+static int have_peephole2_flag;
 
 /* Maximum number of insns seen in a split.  */
 static int max_insns_per_split = 1;
 
+/* Maximum number of input insns for peephole2.  */
+static int max_insns_per_peep2;
+
 static int clobbers_seen_this_insn;
 static int dup_operands_seen_this_insn;
 
-void fatal PVPROTO ((const char *, ...))
-  ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
-
-static void walk_insn_part PROTO((rtx, int, int));
-static void gen_insn PROTO((rtx));
-static void gen_expand PROTO((rtx));
-static void gen_split PROTO((rtx));
-static void gen_peephole PROTO((rtx));
+static void walk_insn_part (rtx, int, int);
 
-/* RECOG_P will be non-zero if this pattern was seen in a context where it will
-   be used to recognize, rather than just generate an insn. 
+/* RECOG_P will be nonzero if this pattern was seen in a context where it will
+   be used to recognize, rather than just generate an insn.
 
-   NON_PC_SET_SRC will be non-zero if this pattern was seen in a SET_SRC
+   NON_PC_SET_SRC will be nonzero if this pattern was seen in a SET_SRC
    of a SET whose destination is not (pc).  */
 
 static void
-walk_insn_part (part, recog_p, non_pc_set_src)
-     rtx part;
-     int recog_p;
-     int non_pc_set_src;
+walk_insn_part (rtx part, int recog_p, int non_pc_set_src)
 {
-  register int i, j;
-  register RTX_CODE code;
-  register const char *format_ptr;
+  int i, j;
+  RTX_CODE code;
+  const char *format_ptr;
 
   if (part == 0)
     return;
@@ -87,13 +78,12 @@ walk_insn_part (part, recog_p, non_pc_set_src)
     case MATCH_OPERAND:
       if (XINT (part, 0) > max_recog_operands)
        max_recog_operands = XINT (part, 0);
-      if (XSTR (part, 2) && *XSTR (part, 2))
-       register_constraint_flag = 1;
       return;
 
     case MATCH_OP_DUP:
     case MATCH_PAR_DUP:
       ++dup_operands_seen_this_insn;
+      /* FALLTHRU */
     case MATCH_SCRATCH:
     case MATCH_PARALLEL:
     case MATCH_OPERATOR:
@@ -104,7 +94,8 @@ walk_insn_part (part, recog_p, non_pc_set_src)
       break;
 
     case LABEL_REF:
-      if (GET_CODE (XEXP (part, 0)) == MATCH_OPERAND)
+      if (GET_CODE (XEXP (part, 0)) == MATCH_OPERAND
+         || GET_CODE (XEXP (part, 0)) == MATCH_DUP)
        break;
       return;
 
@@ -124,6 +115,16 @@ walk_insn_part (part, recog_p, non_pc_set_src)
        have_lo_sum_flag = 1;
       return;
 
+    case ROTATE:
+      if (recog_p)
+       have_rotate_flag = 1;
+      return;
+
+    case ROTATERT:
+      if (recog_p)
+       have_rotatert_flag = 1;
+      return;
+
     case SET:
       walk_insn_part (SET_DEST (part), 0, recog_p);
       walk_insn_part (SET_SRC (part), recog_p,
@@ -143,6 +144,11 @@ walk_insn_part (part, recog_p, non_pc_set_src)
        have_cmove_flag = 1;
       break;
 
+    case COND_EXEC:
+      if (recog_p)
+       have_cond_exec_flag = 1;
+      break;
+
     case REG: case CONST_INT: case SYMBOL_REF:
     case PC:
       return;
@@ -169,12 +175,12 @@ walk_insn_part (part, recog_p, non_pc_set_src)
 }
 
 static void
-gen_insn (insn)
-     rtx insn;
+gen_insn (md_rtx_info *info)
 {
   int i;
 
   /* Walk the insn pattern to gather the #define's status.  */
+  rtx insn = info->def;
   clobbers_seen_this_insn = 0;
   dup_operands_seen_this_insn = 0;
   if (XVEC (insn, 1) != 0)
@@ -190,8 +196,7 @@ gen_insn (insn)
 /* Similar but scan a define_expand.  */
 
 static void
-gen_expand (insn)
-     rtx insn;
+gen_expand (md_rtx_info *info)
 {
   int i;
 
@@ -199,6 +204,7 @@ gen_expand (insn)
 
   /* Note that we don't bother recording the number of MATCH_DUPs
      that occur in a gen_expand, because only reload cares about that.  */
+  rtx insn = info->def;
   if (XVEC (insn, 1) != 0)
     for (i = 0; i < XVECLEN (insn, 1); i++)
       {
@@ -217,13 +223,13 @@ gen_expand (insn)
 /* Similar but scan a define_split.  */
 
 static void
-gen_split (split)
-     rtx split;
+gen_split (md_rtx_info *info)
 {
   int i;
 
   /* Look through the patterns that are matched
      to compute the maximum operand number.  */
+  rtx split = info->def;
   for (i = 0; i < XVECLEN (split, 0); i++)
     walk_insn_part (XVECEXP (split, 0, i), 1, 0);
   /* Look at the number of insns this insn could split into.  */
@@ -232,138 +238,151 @@ gen_split (split)
 }
 
 static void
-gen_peephole (peep)
-     rtx peep;
+gen_peephole (md_rtx_info *info)
 {
   int i;
 
   /* Look through the patterns that are matched
      to compute the maximum operand number.  */
+  rtx peep = info->def;
   for (i = 0; i < XVECLEN (peep, 0); i++)
     walk_insn_part (XVECEXP (peep, 0, i), 1, 0);
 }
-\f
-PTR
-xmalloc (size)
-  size_t size;
-{
-  register PTR val = (PTR) malloc (size);
-
-  if (val == 0)
-    fatal ("virtual memory exhausted");
-
-  return val;
-}
 
-PTR
-xrealloc (old, size)
-  PTR old;
-  size_t size;
+static void
+gen_peephole2 (md_rtx_info *info)
 {
-  register PTR ptr;
-  if (old)
-    ptr = (PTR) realloc (old, size);
-  else
-    ptr = (PTR) malloc (size);
-  if (!ptr)
-    fatal ("virtual memory exhausted");
-  return ptr;
-}
+  int i, n;
 
-void
-fatal VPROTO ((const char *format, ...))
-{
-#ifndef ANSI_PROTOTYPES
-  const char *format;
-#endif
-  va_list ap;
-
-  VA_START (ap, format);
-
-#ifndef ANSI_PROTOTYPES
-  format = va_arg (ap, const char *);
-#endif
-
-  fprintf (stderr, "genconfig: ");
-  vfprintf (stderr, format, ap);
-  va_end (ap);
-  fprintf (stderr, "\n");
-  exit (FATAL_EXIT_CODE);
+  /* Look through the patterns that are matched
+     to compute the maximum operand number.  */
+  rtx peep = info->def;
+  for (i = XVECLEN (peep, 0) - 1; i >= 0; --i)
+    walk_insn_part (XVECEXP (peep, 0, i), 1, 0);
+
+  /* Look at the number of insns this insn can be matched from.  */
+  for (i = XVECLEN (peep, 0) - 1, n = 0; i >= 0; --i)
+    if (GET_CODE (XVECEXP (peep, 0, i)) != MATCH_DUP
+       && GET_CODE (XVECEXP (peep, 0, i)) != MATCH_SCRATCH)
+      n++;
+  if (n > max_insns_per_peep2)
+    max_insns_per_peep2 = n;
 }
 
 int
-main (argc, argv)
-     int argc;
-     char **argv;
+main (int argc, const char **argv)
 {
-  rtx desc;
-  FILE *infile;
-  register int c;
+  progname = "genconfig";
 
-  obstack_init (rtl_obstack);
+  if (!init_rtx_reader_args (argc, argv))
+    return (FATAL_EXIT_CODE);
 
-  if (argc <= 1)
-    fatal ("No input file name.");
+  puts ("/* Generated automatically by the program `genconfig'");
+  puts ("   from the machine description file `md'.  */\n");
+  puts ("#ifndef GCC_INSN_CONFIG_H");
+  puts ("#define GCC_INSN_CONFIG_H\n");
 
-  infile = fopen (argv[1], "r");
-  if (infile == 0)
-    {
-      perror (argv[1]);
-      exit (FATAL_EXIT_CODE);
-    }
+  /* Allow at least 30 operands for the sake of asm constructs.  */
+  /* ??? We *really* ought to reorganize things such that there
+     is no fixed upper bound.  */
+  max_recog_operands = 29;  /* We will add 1 later.  */
+  max_dup_operands = 1;
 
-  init_rtl ();
+  /* Read the machine description.  */
 
-  printf ("/* Generated automatically by the program `genconfig'\n\
-from the machine description file `md'.  */\n\n");
+  md_rtx_info info;
+  while (read_md_rtx (&info))
+    switch (GET_CODE (info.def))
+      {
+      case DEFINE_INSN:
+       gen_insn (&info);
+       break;
 
-  /* Allow at least 10 operands for the sake of asm constructs.  */
-  max_recog_operands = 9;  /* We will add 1 later.  */
-  max_dup_operands = 1;
+      case DEFINE_EXPAND:
+       gen_expand (&info);
+       break;
 
-  /* Read the machine description.  */
+      case DEFINE_SPLIT:
+       gen_split (&info);
+       break;
 
-  while (1)
-    {
-      c = read_skip_spaces (infile);
-      if (c == EOF)
+      case DEFINE_PEEPHOLE2:
+       have_peephole2_flag = 1;
+       gen_peephole2 (&info);
+       break;
+
+      case DEFINE_PEEPHOLE:
+       have_peephole_flag = 1;
+       gen_peephole (&info);
        break;
-      ungetc (c, infile);
-
-      desc = read_rtx (infile);
-      if (GET_CODE (desc) == DEFINE_INSN)
-       gen_insn (desc);
-      if (GET_CODE (desc) == DEFINE_EXPAND)
-       gen_expand (desc);
-      if (GET_CODE (desc) == DEFINE_SPLIT)
-       gen_split (desc);
-      if (GET_CODE (desc) == DEFINE_PEEPHOLE)
-       gen_peephole (desc);
-    }
 
-  printf ("\n#define MAX_RECOG_OPERANDS %d\n", max_recog_operands + 1);
+      default:
+       break;
+      }
 
-  printf ("\n#define MAX_DUP_OPERANDS %d\n", max_dup_operands);
+  printf ("#define MAX_RECOG_OPERANDS %d\n", max_recog_operands + 1);
+  printf ("#define MAX_DUP_OPERANDS %d\n", max_dup_operands);
 
   /* This is conditionally defined, in case the user writes code which emits
      more splits than we can readily see (and knows s/he does it).  */
-  printf ("#ifndef MAX_INSNS_PER_SPLIT\n#define MAX_INSNS_PER_SPLIT %d\n#endif\n",
-         max_insns_per_split);
-
-  if (register_constraint_flag)
-    printf ("#define REGISTER_CONSTRAINTS\n");
+  printf ("#ifndef MAX_INSNS_PER_SPLIT\n");
+  printf ("#define MAX_INSNS_PER_SPLIT %d\n", max_insns_per_split);
+  printf ("#endif\n");
 
   if (have_cc0_flag)
-    printf ("#define HAVE_cc0\n");
+    {
+      printf ("#define HAVE_cc0 1\n");
+      printf ("#define CC0_P(X) ((X) == cc0_rtx)\n");
+    }
+  else
+    {
+      /* We output CC0_P this way to make sure that X is declared
+        somewhere.  */
+      printf ("#define HAVE_cc0 0\n");
+      printf ("#define CC0_P(X) ((X) ? 0 : 0)\n");
+    }
 
   if (have_cmove_flag)
-    printf ("#define HAVE_conditional_move\n");
+    printf ("#define HAVE_conditional_move 1\n");
+  else
+    printf ("#define HAVE_conditional_move 0\n");
+
+  if (have_cond_exec_flag)
+    printf ("#define HAVE_conditional_execution 1\n");
+  else
+    printf ("#define HAVE_conditional_execution 0\n");
 
   if (have_lo_sum_flag)
-    printf ("#define HAVE_lo_sum\n");
+    printf ("#define HAVE_lo_sum 1\n");
+  else
+    printf ("#define HAVE_lo_sum 0\n");
+
+  if (have_rotate_flag)
+    printf ("#define HAVE_rotate 1\n");
+
+  if (have_rotatert_flag)
+    printf ("#define HAVE_rotatert 1\n");
+
+  if (have_peephole_flag)
+    printf ("#define HAVE_peephole 1\n");
+  else
+    printf ("#define HAVE_peephole 0\n");
+
+  if (have_peephole2_flag)
+    {
+      printf ("#define HAVE_peephole2 1\n");
+      printf ("#define MAX_INSNS_PER_PEEP2 %d\n", max_insns_per_peep2);
+    }
+  else
+    {
+      printf ("#define HAVE_peephole2 0\n");
+      printf ("#define MAX_INSNS_PER_PEEP2 0\n");
+    }
+
+  puts ("\n#endif /* GCC_INSN_CONFIG_H */");
+
+  if (ferror (stdout) || fflush (stdout) || fclose (stdout))
+    return FATAL_EXIT_CODE;
 
-  fflush (stdout);
-  exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
-  /* NOTREACHED */
-  return 0;
+  return SUCCESS_EXIT_CODE;
 }