aboutsummaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1999-04-01 09:06:09 -0800
committerRichard Henderson <rth@gcc.gnu.org>1999-04-01 09:06:09 -0800
commit0133b7d92c246b7e6fc48a72dc6069700f703281 (patch)
tree83f67dcf4de9983354cae74f36289575fb39bb5d /gcc/emit-rtl.c
parent4b97aaeb34b0e0dadbd2eced838111fd77b4c0dc (diff)
downloadgcc-0133b7d92c246b7e6fc48a72dc6069700f703281.zip
gcc-0133b7d92c246b7e6fc48a72dc6069700f703281.tar.gz
gcc-0133b7d92c246b7e6fc48a72dc6069700f703281.tar.bz2
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
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r--gcc/emit-rtl.c50
1 files changed, 42 insertions, 8 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index eec6b06..4df1a6a 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -264,6 +264,22 @@ gen_rtx_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
gen_rtx_REG (mode, regno)
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);
#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... */
@@ -418,9 +450,11 @@ gen_rtx VPROTO((enum rtx_code code, enum machine_mode mode, ...))
abort ();
}
}
+ break;
}
+
va_end (p);
- return rt_val; /* Return the new RTX... */
+ return rt_val;
}
/* gen_rtvec (n, [rt1, ..., rtn])