]> 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 7498f6b5bc5385d9c0cc0d5df1188cdb192e1bae..6f914b1e4fb4d59526e4947a9a2dcc8a8c921ff2 100644 (file)
@@ -1,7 +1,6 @@
 /* Generate from machine description:
    - some #define configuration flags.
-   Copyright (C) 1987, 1991, 1997, 1998, 1999, 2000, 2003, 2004, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 1987-2019 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -37,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;
 
@@ -50,14 +51,9 @@ static int clobbers_seen_this_insn;
 static int dup_operands_seen_this_insn;
 
 static void walk_insn_part (rtx, int, int);
-static void gen_insn (rtx);
-static void gen_expand (rtx);
-static void gen_split (rtx);
-static void gen_peephole (rtx);
-static void gen_peephole2 (rtx);
 
 /* 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. 
+   be used to recognize, rather than just generate an insn.
 
    NON_PC_SET_SRC will be nonzero if this pattern was seen in a SET_SRC
    of a SET whose destination is not (pc).  */
@@ -87,6 +83,7 @@ walk_insn_part (rtx part, int recog_p, int 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:
@@ -118,6 +115,16 @@ walk_insn_part (rtx part, int recog_p, int 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,
@@ -168,11 +175,12 @@ walk_insn_part (rtx part, int recog_p, int non_pc_set_src)
 }
 
 static void
-gen_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)
@@ -188,7 +196,7 @@ gen_insn (rtx insn)
 /* Similar but scan a define_expand.  */
 
 static void
-gen_expand (rtx insn)
+gen_expand (md_rtx_info *info)
 {
   int i;
 
@@ -196,6 +204,7 @@ gen_expand (rtx 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++)
       {
@@ -214,12 +223,13 @@ gen_expand (rtx insn)
 /* Similar but scan a define_split.  */
 
 static void
-gen_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.  */
@@ -228,23 +238,25 @@ gen_split (rtx split)
 }
 
 static void
-gen_peephole (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 (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);
 
@@ -258,13 +270,11 @@ gen_peephole2 (rtx peep)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, const char **argv)
 {
-  rtx desc;
-
   progname = "genconfig";
 
-  if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
+  if (!init_rtx_reader_args (argc, argv))
     return (FATAL_EXIT_CODE);
 
   puts ("/* Generated automatically by the program `genconfig'");
@@ -280,42 +290,35 @@ main (int argc, char **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);
@@ -335,28 +338,48 @@ main (int argc, char **argv)
     {
       /* 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;