From a06e3c4070d3c6e606cec20b7bb75a30ff02656b Mon Sep 17 00:00:00 2001
From: "J\"orn Rennecke" <joern.rennecke@superh.com>
Date: Thu, 11 Jul 2002 10:32:54 +0000
Subject: [PATCH] rtl.h (gen_rtx_CONST_VECTOR): Declare.

	* 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.

From-SVN: r55395
---
 gcc/ChangeLog   |  7 +++++++
 gcc/emit-rtl.c  | 18 +++++++++++++++++-
 gcc/gengenrtl.c |  3 ++-
 gcc/rtl.h       |  1 +
 4 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 711a231eed6b..11314a1f7f0a 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 0ee4f117f352..eedea4a4e4a8 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 31e5910f2377..126be8ead28c 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 0fba875aa031..31032b6e2177 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));
-- 
GitLab