Commit 0133b7d9 by Richard Henderson Committed by Richard Henderson

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.

From-SVN: r26110
parent 4b97aaeb
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> 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 * config/c4x/c4x.md (ashlhi3, lshrhi3, ashrhi3): Force operand 1
......
...@@ -264,6 +264,22 @@ gen_rtx_CONST_INT (mode, arg) ...@@ -264,6 +264,22 @@ gen_rtx_CONST_INT (mode, arg)
return gen_rtx_raw_CONST_INT (mode, arg); 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 rtx
gen_rtx_REG (mode, regno) gen_rtx_REG (mode, regno)
enum machine_mode mode; enum machine_mode mode;
...@@ -366,14 +382,30 @@ gen_rtx VPROTO((enum rtx_code code, enum machine_mode mode, ...)) ...@@ -366,14 +382,30 @@ gen_rtx VPROTO((enum rtx_code code, enum machine_mode mode, ...))
mode = va_arg (p, enum machine_mode); mode = va_arg (p, enum machine_mode);
#endif #endif
if (code == CONST_INT) switch (code)
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
{ {
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 = rtx_alloc (code); /* Allocate the storage space. */
rt_val->mode = mode; /* Store the machine mode... */ rt_val->mode = mode; /* Store the machine mode... */
...@@ -418,9 +450,11 @@ gen_rtx VPROTO((enum rtx_code code, enum machine_mode mode, ...)) ...@@ -418,9 +450,11 @@ gen_rtx VPROTO((enum rtx_code code, enum machine_mode mode, ...))
abort (); abort ();
} }
} }
break;
} }
va_end (p); va_end (p);
return rt_val; /* Return the new RTX... */ return rt_val;
} }
/* gen_rtvec (n, [rt1, ..., rtn]) /* gen_rtvec (n, [rt1, ..., rtn])
......
/* Generate code to allocate RTL structures. /* 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. This file is part of GNU CC.
...@@ -52,6 +52,8 @@ static void genlegend PROTO((FILE *)); ...@@ -52,6 +52,8 @@ static void genlegend PROTO((FILE *));
static void genheader PROTO((FILE *)); static void genheader PROTO((FILE *));
static void gencode PROTO((FILE *)); static void gencode PROTO((FILE *));
/* Decode a format letter into a C type string. */
static const char * static const char *
type_from_format (c) type_from_format (c)
int c; int c;
...@@ -84,6 +86,8 @@ type_from_format (c) ...@@ -84,6 +86,8 @@ type_from_format (c)
} }
} }
/* Decode a format letter into the proper accessor function. */
static const char * static const char *
accessor_from_format (c) accessor_from_format (c)
int c; int c;
...@@ -110,6 +114,8 @@ accessor_from_format (c) ...@@ -110,6 +114,8 @@ accessor_from_format (c)
} }
} }
/* Return true if a format character doesn't need normal processing. */
static int static int
special_format (fmt) special_format (fmt)
const char *fmt; const char *fmt;
...@@ -120,15 +126,20 @@ special_format (fmt) ...@@ -120,15 +126,20 @@ special_format (fmt)
|| strchr (fmt, 'n') != 0); || strchr (fmt, 'n') != 0);
} }
/* Return true if an rtx requires special processing. */
static int static int
special_rtx (idx) special_rtx (idx)
int idx; int idx;
{ {
return (strcmp (defs[idx].enumname, "CONST_INT") == 0 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, "REG") == 0
|| strcmp (defs[idx].enumname, "MEM") == 0); || strcmp (defs[idx].enumname, "MEM") == 0);
} }
/* Fill `formats' with all unique format strings. */
static void static void
find_formats () find_formats ()
{ {
...@@ -142,7 +153,7 @@ find_formats () ...@@ -142,7 +153,7 @@ find_formats ()
continue; continue;
for (f = formats; *f ; ++f) for (f = formats; *f ; ++f)
if (!strcmp(*f, defs[i].format)) if (! strcmp (*f, defs[i].format))
break; break;
if (!*f) if (!*f)
...@@ -150,6 +161,8 @@ find_formats () ...@@ -150,6 +161,8 @@ find_formats ()
} }
} }
/* Emit a prototype for the rtx generator for a format. */
static void static void
gendecl (f, format) gendecl (f, format)
FILE *f; FILE *f;
...@@ -166,6 +179,8 @@ gendecl (f, format) ...@@ -166,6 +179,8 @@ gendecl (f, format)
fprintf (f, "));\n"); fprintf (f, "));\n");
} }
/* Emit a define mapping an rtx code to the generator for its format. */
static void static void
genmacro (f, idx) genmacro (f, idx)
FILE *f; FILE *f;
...@@ -189,6 +204,8 @@ genmacro (f, idx) ...@@ -189,6 +204,8 @@ genmacro (f, idx)
fprintf (f, ")\n"); fprintf (f, ")\n");
} }
/* Emit the implementation for the rtx generator for a format. */
static void static void
gendef (f, format) gendef (f, format)
FILE *f; FILE *f;
...@@ -225,14 +242,18 @@ gendef (f, format) ...@@ -225,14 +242,18 @@ gendef (f, format)
fprintf (f, "\n return rt;\n}\n\n"); fprintf (f, "\n return rt;\n}\n\n");
} }
/* Emit the `do not edit' banner. */
static void static void
genlegend (f) genlegend (f)
FILE *f; FILE *f;
{ {
fprintf (f, "/* Generated automaticaly by the program `gengenrtl'\n"); fputs ("/* Generated automaticaly by the program `gengenrtl'\n", f);
fprintf (f, " from the RTL description file `rtl.def' */\n\n"); fputs (" from the RTL description file `rtl.def' */\n\n", f);
} }
/* Emit "genrtl.h". */
static void static void
genheader (f) genheader (f)
FILE *f; FILE *f;
...@@ -243,7 +264,7 @@ genheader (f) ...@@ -243,7 +264,7 @@ genheader (f)
for (fmt = formats; *fmt; ++fmt) for (fmt = formats; *fmt; ++fmt)
gendecl (f, *fmt); gendecl (f, *fmt);
fprintf(f, "\n"); fprintf (f, "\n");
for (i = 0; i < NUM_RTX_CODE; i++) for (i = 0; i < NUM_RTX_CODE; i++)
{ {
...@@ -253,6 +274,8 @@ genheader (f) ...@@ -253,6 +274,8 @@ genheader (f)
} }
} }
/* Emit "genrtl.c". */
static void static void
gencode (f) gencode (f)
FILE *f; FILE *f;
...@@ -268,7 +291,7 @@ gencode (f) ...@@ -268,7 +291,7 @@ gencode (f)
fputs ("static rtx obstack_alloc_rtx (length)\n", f); fputs ("static rtx obstack_alloc_rtx (length)\n", f);
fputs (" register int length;\n{\n", f); fputs (" register int length;\n{\n", f);
fputs (" rtx rt = (rtx) obstack_alloc (rtl_obstack, 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); fputs (" return rt;\n}\n\n", f);
for (fmt = formats; *fmt; ++fmt) for (fmt = formats; *fmt; ++fmt)
...@@ -308,22 +331,22 @@ main(argc, argv) ...@@ -308,22 +331,22 @@ main(argc, argv)
f = fopen (argv[1], "w"); f = fopen (argv[1], "w");
if (f == NULL) if (f == NULL)
{ {
perror(argv[1]); perror (argv[1]);
exit (1); exit (1);
} }
genlegend (f); genlegend (f);
genheader (f); genheader (f);
fclose(f); fclose (f);
f = fopen (argv[2], "w"); f = fopen (argv[2], "w");
if (f == NULL) if (f == NULL)
{ {
perror(argv[2]); perror (argv[2]);
exit (1); exit (1);
} }
genlegend (f); genlegend (f);
gencode (f); gencode (f);
fclose(f); fclose (f);
exit (0); exit (0);
} }
...@@ -1136,6 +1136,8 @@ extern rtx return_address_pointer_rtx; ...@@ -1136,6 +1136,8 @@ extern rtx return_address_pointer_rtx;
add to this list, modify special_rtx in gengenrtl.c as well. You add to this list, modify special_rtx in gengenrtl.c as well. You
should also modify gen_rtx to use the special function. */ 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_CONST_INT PROTO((enum machine_mode, HOST_WIDE_INT));
extern rtx gen_rtx_REG PROTO((enum machine_mode, int)); extern rtx gen_rtx_REG PROTO((enum machine_mode, int));
extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx)); extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment