* emit-rtl.c (gen_rtx_CONST_DOUBLE): New function.
(gen_rtx): Call it. Tidy cases.
* rtl.h (gen_rtx_CONST_DOUBLE): Prototype it.
* gengenrtl.c: Add commentary.
(special_rtx): Also match CONST_DOUBLE.
(gencode): Emit call to memset instead of bzero.
From-SVN: r26110
+Thu Apr 1 17:01:50 1999 Richard Henderson <rth@cygnus.com>
+
+ Move over patch from Bernd Schmidt from GC branch:
+ * emit-rtl.c (gen_rtx_CONST_DOUBLE): New function.
+ (gen_rtx): Call it. Tidy cases.
+ * rtl.h (gen_rtx_CONST_DOUBLE): Prototype it.
+ * gengenrtl.c: Add commentary.
+ (special_rtx): Also match CONST_DOUBLE.
+ (gencode): Emit call to memset instead of bzero.
+
Fri Apr 2 12:58:26 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.md (ashlhi3, lshrhi3, ashrhi3): Force operand 1
return gen_rtx_raw_CONST_INT (mode, arg);
}
+/* CONST_DOUBLEs needs special handling because its length is known
+ only at run-time. */
+rtx
+gen_rtx_CONST_DOUBLE (mode, arg0, arg1, arg2)
+ enum machine_mode mode;
+ rtx arg0;
+ HOST_WIDE_INT arg1, arg2;
+{
+ rtx r = rtx_alloc (CONST_DOUBLE);
+ PUT_MODE (r, mode);
+ XEXP (r, 0) = arg0;
+ XINT (r, 2) = arg1;
+ XINT (r, 3) = arg2;
+ return r;
+}
+
rtx
gen_rtx_REG (mode, regno)
enum machine_mode mode;
mode = va_arg (p, enum machine_mode);
#endif
- if (code == CONST_INT)
- rt_val = gen_rtx_CONST_INT (mode, va_arg (p, HOST_WIDE_INT));
- else if (code == REG)
- rt_val = gen_rtx_REG (mode, va_arg (p, int));
- else if (code == MEM)
- rt_val = gen_rtx_MEM (mode, va_arg (p, rtx));
- else
+ switch (code)
{
+ case CONST_INT:
+ rt_val = gen_rtx_CONST_INT (mode, va_arg (p, HOST_WIDE_INT));
+ break;
+
+ case CONST_DOUBLE:
+ {
+ rtx arg0 = va_arg (p, rtx);
+ HOST_WIDE_INT arg1 = va_arg (p, HOST_WIDE_INT);
+ HOST_WIDE_INT arg2 = va_arg (p, HOST_WIDE_INT);
+ rt_val = gen_rtx_CONST_DOUBLE (mode, arg0, arg1, arg2);
+ }
+ break;
+
+ case REG:
+ rt_val = gen_rtx_REG (mode, va_arg (p, int));
+ break;
+
+ case MEM:
+ rt_val = gen_rtx_MEM (mode, va_arg (p, rtx));
+ break;
+
+ default:
rt_val = rtx_alloc (code); /* Allocate the storage space. */
rt_val->mode = mode; /* Store the machine mode... */
abort ();
}
}
+ break;
}
+
va_end (p);
- return rt_val; /* Return the new RTX... */
+ return rt_val;
}
/* gen_rtvec (n, [rt1, ..., rtn])
/* Generate code to allocate RTL structures.
- Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
static void genheader PROTO((FILE *));
static void gencode PROTO((FILE *));
+/* Decode a format letter into a C type string. */
+
static const char *
type_from_format (c)
int c;
}
}
+/* Decode a format letter into the proper accessor function. */
+
static const char *
accessor_from_format (c)
int c;
}
}
+/* Return true if a format character doesn't need normal processing. */
+
static int
special_format (fmt)
const char *fmt;
|| strchr (fmt, 'n') != 0);
}
+/* Return true if an rtx requires special processing. */
+
static int
special_rtx (idx)
int idx;
{
return (strcmp (defs[idx].enumname, "CONST_INT") == 0
+ || strcmp (defs[idx].enumname, "CONST_DOUBLE") == 0
|| strcmp (defs[idx].enumname, "REG") == 0
|| strcmp (defs[idx].enumname, "MEM") == 0);
}
+/* Fill `formats' with all unique format strings. */
+
static void
find_formats ()
{
continue;
for (f = formats; *f ; ++f)
- if (!strcmp(*f, defs[i].format))
+ if (! strcmp (*f, defs[i].format))
break;
if (!*f)
}
}
+/* Emit a prototype for the rtx generator for a format. */
+
static void
gendecl (f, format)
FILE *f;
fprintf (f, "));\n");
}
+/* Emit a define mapping an rtx code to the generator for its format. */
+
static void
genmacro (f, idx)
FILE *f;
fprintf (f, ")\n");
}
+/* Emit the implementation for the rtx generator for a format. */
+
static void
gendef (f, format)
FILE *f;
fprintf (f, "\n return rt;\n}\n\n");
}
+/* Emit the `do not edit' banner. */
+
static void
genlegend (f)
FILE *f;
{
- fprintf (f, "/* Generated automaticaly by the program `gengenrtl'\n");
- fprintf (f, " from the RTL description file `rtl.def' */\n\n");
+ fputs ("/* Generated automaticaly by the program `gengenrtl'\n", f);
+ fputs (" from the RTL description file `rtl.def' */\n\n", f);
}
+/* Emit "genrtl.h". */
+
static void
genheader (f)
FILE *f;
for (fmt = formats; *fmt; ++fmt)
gendecl (f, *fmt);
- fprintf(f, "\n");
+ fprintf (f, "\n");
for (i = 0; i < NUM_RTX_CODE; i++)
{
}
}
+/* Emit "genrtl.c". */
+
static void
gencode (f)
FILE *f;
fputs ("static rtx obstack_alloc_rtx (length)\n", f);
fputs (" register int length;\n{\n", f);
fputs (" rtx rt = (rtx) obstack_alloc (rtl_obstack, length);\n\n", f);
- fputs (" bzero((char *) rt, sizeof(struct rtx_def) - sizeof(rtunion));\n\n", f);
+ fputs (" memset(rt, 0, sizeof(struct rtx_def) - sizeof(rtunion));\n\n", f);
fputs (" return rt;\n}\n\n", f);
for (fmt = formats; *fmt; ++fmt)
f = fopen (argv[1], "w");
if (f == NULL)
{
- perror(argv[1]);
+ perror (argv[1]);
exit (1);
}
genlegend (f);
genheader (f);
- fclose(f);
+ fclose (f);
f = fopen (argv[2], "w");
if (f == NULL)
{
- perror(argv[2]);
+ perror (argv[2]);
exit (1);
}
genlegend (f);
gencode (f);
- fclose(f);
+ fclose (f);
exit (0);
}
add to this list, modify special_rtx in gengenrtl.c as well. You
should also modify gen_rtx to use the special function. */
+extern rtx gen_rtx_CONST_DOUBLE PROTO((enum machine_mode, rtx,
+ HOST_WIDE_INT, HOST_WIDE_INT));
extern rtx gen_rtx_CONST_INT PROTO((enum machine_mode, HOST_WIDE_INT));
extern rtx gen_rtx_REG PROTO((enum machine_mode, int));
extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));