summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/emit-rtl.c18
-rw-r--r--gcc/gengenrtl.c3
-rw-r--r--gcc/rtl.h1
4 files changed, 27 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 711a231eed6..11314a1f7f0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Thu Jul 11 11:31:12 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * rtl.h (gen_rtx_CONST_VECTOR): Declare.
+ * gengenrtl.c (special_rtx): Check for CONST_VECTOR.
+ * emit-rtl.c (gen_rtx_CONST_VECTOR): New function.
+ (gen_const_vector_0): Use it.
+
2002-07-11 John David Anglin <dave@hiauly1.hia.nrc.ca>
* pa.md (adddi3): For 32-bit targets, force constants to a register
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 0ee4f117f35..eedea4a4e4a 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -5188,10 +5188,26 @@ gen_const_vector_0 (mode)
for (i = 0; i < units; ++i)
RTVEC_ELT (v, i) = CONST0_RTX (inner);
- tem = gen_rtx_CONST_VECTOR (mode, v);
+ tem = gen_rtx_raw_CONST_VECTOR (mode, v);
return tem;
}
+/* Generate a vector like gen_rtx_raw_CONST_VEC, but use the zero vector when
+ all elements are zero. */
+rtx
+gen_rtx_CONST_VECTOR (mode, v)
+ enum machine_mode mode;
+ rtvec v;
+{
+ rtx inner_zero = CONST0_RTX (GET_MODE_INNER (mode));
+ int i;
+
+ for (i = GET_MODE_NUNITS (mode) - 1; i >= 0; i--)
+ if (RTVEC_ELT (v, i) != inner_zero)
+ return gen_rtx_raw_CONST_VECTOR (mode, v);
+ return CONST0_RTX (mode);
+}
+
/* Create some permanent unique rtl objects shared between all functions.
LINE_NUMBERS is nonzero if line numbers are to be generated. */
diff --git a/gcc/gengenrtl.c b/gcc/gengenrtl.c
index 31e5910f237..126be8ead28 100644
--- a/gcc/gengenrtl.c
+++ b/gcc/gengenrtl.c
@@ -149,7 +149,8 @@ special_rtx (idx)
return (strcmp (defs[idx].enumname, "CONST_INT") == 0
|| strcmp (defs[idx].enumname, "REG") == 0
|| strcmp (defs[idx].enumname, "SUBREG") == 0
- || strcmp (defs[idx].enumname, "MEM") == 0);
+ || strcmp (defs[idx].enumname, "MEM") == 0
+ || strcmp (defs[idx].enumname, "CONST_VECTOR") == 0);
}
/* Return nonzero if the RTL code given by index IDX is one that we should
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 0fba875aa03..31032b6e217 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1712,6 +1712,7 @@ extern GTY(()) rtx return_address_pointer_rtx;
should also modify gen_rtx to use the special function. */
extern rtx gen_rtx_CONST_INT PARAMS ((enum machine_mode, HOST_WIDE_INT));
+extern rtx gen_rtx_CONST_VECTOR PARAMS ((enum machine_mode, rtvec));
extern rtx gen_raw_REG PARAMS ((enum machine_mode, int));
extern rtx gen_rtx_REG PARAMS ((enum machine_mode, unsigned));
extern rtx gen_rtx_SUBREG PARAMS ((enum machine_mode, rtx, int));