]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/genconfig.c
2019-10-18 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
[thirdparty/gcc.git] / gcc / genconfig.c
index 27000be7d93f9eacf07216c72e48c0f6ae008465..6f914b1e4fb4d59526e4947a9a2dcc8a8c921ff2 100644 (file)
@@ -1,13 +1,12 @@
 /* Generate from machine description:
    - some #define configuration flags.
-   Copyright (C) 1987, 1991, 1997, 1998,
-   1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987-2019 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
@@ -16,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
-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 "coretypes.h"
+#include "tm.h"
 #include "rtl.h"
 #include "errors.h"
 #include "gensupport.h"
@@ -36,6 +36,8 @@ 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;
 
@@ -48,24 +50,16 @@ static int max_insns_per_peep2;
 static int clobbers_seen_this_insn;
 static int dup_operands_seen_this_insn;
 
-static void walk_insn_part PARAMS ((rtx, int, int));
-static void gen_insn PARAMS ((rtx));
-static void gen_expand PARAMS ((rtx));
-static void gen_split PARAMS ((rtx));
-static void gen_peephole PARAMS ((rtx));
-static void gen_peephole2 PARAMS ((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)
 {
   int i, j;
   RTX_CODE code;
@@ -89,6 +83,7 @@ walk_insn_part (part, recog_p, non_pc_set_src)
     case MATCH_OP_DUP:
     case MATCH_PAR_DUP:
       ++dup_operands_seen_this_insn;
+      /* FALLTHRU */
     case MATCH_SCRATCH:
     case MATCH_PARALLEL:
     case MATCH_OPERATOR:
@@ -99,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;
 
@@ -119,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,
@@ -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,25 +238,25 @@ 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);
 }
 
 static void
-gen_peephole2 (peep)
-     rtx peep;
+gen_peephole2 (md_rtx_info *info)
 {
   int i, n;
 
   /* 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);
 
@@ -263,21 +269,12 @@ gen_peephole2 (peep)
     max_insns_per_peep2 = n;
 }
 
-extern int main PARAMS ((int, char **));
-
 int
-main (argc, argv)
-     int argc;
-     char **argv;
+main (int argc, const char **argv)
 {
-  rtx desc;
-
   progname = "genconfig";
 
-  if (argc <= 1)
-    fatal ("No input file name.");
-
-  if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
+  if (!init_rtx_reader_args (argc, argv))
     return (FATAL_EXIT_CODE);
 
   puts ("/* Generated automatically by the program `genconfig'");
@@ -293,42 +290,35 @@ main (argc, argv)
 
   /* Read the machine description.  */
 
-  while (1)
-    {
-      int line_no, insn_code_number = 0;
+  md_rtx_info info;
+  while (read_md_rtx (&info))
+    switch (GET_CODE (info.def))
+      {
+      case DEFINE_INSN:
+       gen_insn (&info);
+       break;
 
-      desc = read_md_rtx (&line_no, &insn_code_number);
-      if (desc == NULL)
+      case DEFINE_EXPAND:
+       gen_expand (&info);
+       break;
+
+      case DEFINE_SPLIT:
+       gen_split (&info);
+       break;
+
+      case DEFINE_PEEPHOLE2:
+       have_peephole2_flag = 1;
+       gen_peephole2 (&info);
        break;
-       
-      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:
-           have_peephole2_flag = 1;
-           gen_peephole2 (desc);
-           break;
-
-         case DEFINE_PEEPHOLE:
-           have_peephole_flag = 1;
-           gen_peephole (desc);
-           break;
-
-         default:
-           break;
-       }
-    }
+
+      case DEFINE_PEEPHOLE:
+       have_peephole_flag = 1;
+       gen_peephole (&info);
+       break;
+
+      default:
+       break;
+      }
 
   printf ("#define MAX_RECOG_OPERANDS %d\n", max_recog_operands + 1);
   printf ("#define MAX_DUP_OPERANDS %d\n", max_dup_operands);
@@ -340,38 +330,59 @@ main (argc, argv)
   printf ("#endif\n");
 
   if (have_cc0_flag)
-    printf ("#define HAVE_cc0 1\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 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 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 */");
+  puts ("\n#endif /* GCC_INSN_CONFIG_H */");
 
   if (ferror (stdout) || fflush (stdout) || fclose (stdout))
     return FATAL_EXIT_CODE;
 
   return 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;
-}