/* Generate code to allocate RTL structures.
- Copyright (C) 1997-2014 Free Software Foundation, Inc.
+ Copyright (C) 1997-2020 Free Software Foundation, Inc.
This file is part of GCC.
case 'w':
return "HOST_WIDE_INT ";
+ case 'p':
+ return "poly_uint16 ";
+
case 's':
return "const char *";
return (strchr (fmt, '*') != 0
|| strchr (fmt, 'V') != 0
|| strchr (fmt, 'S') != 0
- || strchr (fmt, 'n') != 0);
+ || strchr (fmt, 'n') != 0
+ || strchr (fmt, 'r') != 0);
+}
+
+/* Return true if CODE always has VOIDmode. */
+
+static inline bool
+always_void_p (int idx)
+{
+ return strcmp (defs[idx].enumname, "SET") == 0;
}
/* Return nonzero if the RTL code given by index IDX is one that we should
{
return (strcmp (defs[idx].enumname, "EXPR_LIST") == 0
|| strcmp (defs[idx].enumname, "INSN_LIST") == 0
+ || strcmp (defs[idx].enumname, "INSN") == 0
|| strcmp (defs[idx].enumname, "CONST_INT") == 0
|| strcmp (defs[idx].enumname, "REG") == 0
|| strcmp (defs[idx].enumname, "SUBREG") == 0
return (strcmp (defs[idx].enumname, "VAR_LOCATION") == 0
|| strcmp (defs[idx].enumname, "CONST_DOUBLE") == 0
|| strcmp (defs[idx].enumname, "CONST_WIDE_INT") == 0
+ || strcmp (defs[idx].enumname, "CONST_POLY_INT") == 0
|| strcmp (defs[idx].enumname, "CONST_FIXED") == 0);
}
genmacro (int idx)
{
const char *p;
+ const char *sep = "";
int i;
/* We write a macro that defines gen_rtx_RTLCODE to be an equivalent to
/* Don't define a macro for this code. */
return;
- printf ("#define gen_rtx_%s%s(MODE",
+ bool has_mode_p = !always_void_p (idx);
+ printf ("#define gen_rtx_%s%s(",
special_rtx (idx) ? "raw_" : "", defs[idx].enumname);
+ if (has_mode_p)
+ {
+ printf ("MODE");
+ sep = ", ";
+ }
for (p = defs[idx].format, i = 0; *p != 0; p++)
if (*p != '0')
- printf (", ARG%d", i++);
+ {
+ printf ("%sARG%d", sep, i++);
+ sep = ", ";
+ }
- printf (") \\\n gen_rtx_fmt_%s (%s, (MODE)",
- defs[idx].format, defs[idx].enumname);
+ printf (") \\\n gen_rtx_fmt_%s (%s, %s",
+ defs[idx].format, defs[idx].enumname,
+ has_mode_p ? "(MODE)" : "VOIDmode");
for (p = defs[idx].format, i = 0; *p != 0; p++)
if (*p != '0')
puts (")");
}
-/* Generate the code for the function to generate RTL whose
- format is FORMAT. */
+/* Generate the code for functions to generate RTL whose format is FORMAT. */
static void
gendef (const char *format)
const char *p;
int i, j;
- /* Start by writing the definition of the function name and the types
+ /* Write the definition of the init function name and the types
of the arguments. */
- printf ("static inline rtx\ngen_rtx_fmt_%s_stat (RTX_CODE code, enum machine_mode mode", format);
+ puts ("static inline rtx");
+ printf ("init_rtx_fmt_%s (rtx rt, machine_mode mode", format);
for (p = format, i = 0; *p != 0; p++)
if (*p != '0')
printf (",\n\t%sarg%d", type_from_format (*p), i++);
+ puts (")");
+
+ /* Now write out the body of the init function itself. */
+ puts ("{");
+ puts (" PUT_MODE_RAW (rt, mode);");
+
+ for (p = format, i = j = 0; *p ; ++p, ++i)
+ if (*p == '0')
+ printf (" X0EXP (rt, %d) = NULL_RTX;\n", i);
+ else if (*p == 'p')
+ printf (" SUBREG_BYTE (rt) = arg%d;\n", j++);
+ else
+ printf (" %s (rt, %d) = arg%d;\n", accessor_from_format (*p), i, j++);
+
+ puts (" return rt;\n}\n");
+
+ /* Write the definition of the gen function name and the types
+ of the arguments. */
+ puts ("static inline rtx");
+ printf ("gen_rtx_fmt_%s_stat (RTX_CODE code, machine_mode mode", format);
+ for (p = format, i = 0; *p != 0; p++)
+ if (*p != '0')
+ printf (",\n\t%sarg%d", type_from_format (*p), i++);
puts (" MEM_STAT_DECL)");
/* Now write out the body of the function itself, which allocates
the memory and initializes it. */
puts ("{");
- puts (" rtx rt;");
- puts (" rt = rtx_alloc_stat (code PASS_MEM_STAT);\n");
-
- puts (" PUT_MODE (rt, mode);");
+ puts (" rtx rt;\n");
- for (p = format, i = j = 0; *p ; ++p, ++i)
+ puts (" rt = rtx_alloc (code PASS_MEM_STAT);");
+ printf (" return init_rtx_fmt_%s (rt, mode", format);
+ for (p = format, i = 0; *p != 0; p++)
if (*p != '0')
- printf (" %s (rt, %d) = arg%d;\n", accessor_from_format (*p), i, j++);
- else
- printf (" X0EXP (rt, %d) = NULL_RTX;\n", i);
+ printf (", arg%d", i++);
+ puts (");\n}\n");
+
+ /* Write the definition of gen macro. */
- puts ("\n return rt;\n}\n");
printf ("#define gen_rtx_fmt_%s(c, m", format);
for (p = format, i = 0; *p != 0; p++)
if (*p != '0')
- printf (", p%i",i++);
- printf (")\\\n gen_rtx_fmt_%s_stat (c, m", format);
+ printf (", arg%d", i++);
+ printf (") \\\n gen_rtx_fmt_%s_stat ((c), (m)", format);
for (p = format, i = 0; *p != 0; p++)
if (*p != '0')
- printf (", p%i",i++);
+ printf (", (arg%d)", i++);
printf (" MEM_STAT_INFO)\n\n");
+
+ /* Write the definition of alloca macro. */
+
+ printf ("#define alloca_rtx_fmt_%s(c, m", format);
+ for (p = format, i = 0; *p != 0; p++)
+ if (*p != '0')
+ printf (", arg%d", i++);
+ printf (") \\\n init_rtx_fmt_%s (rtx_alloca ((c)), (m)", format);
+ for (p = format, i = 0; *p != 0; p++)
+ if (*p != '0')
+ printf (", (arg%d)", i++);
+ printf (")\n\n");
}
/* Generate the documentation header for files we write. */