/* 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.
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;
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). */
case MATCH_OP_DUP:
case MATCH_PAR_DUP:
++dup_operands_seen_this_insn;
+ /* FALLTHRU */
case MATCH_SCRATCH:
case MATCH_PARALLEL:
case MATCH_OPERATOR:
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,
}
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)
/* Similar but scan a define_expand. */
static void
-gen_expand (rtx insn)
+gen_expand (md_rtx_info *info)
{
int i;
/* 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++)
{
/* 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. */
}
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);
}
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'");
/* 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);
{
/* 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;