From: J"orn Rennecke Date: Thu, 11 Jul 2002 10:32:54 +0000 (+0000) Subject: rtl.h (gen_rtx_CONST_VECTOR): Declare. X-Git-Tag: releases/gcc-3.3.0~3865 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a06e3c4070d3c6e606cec20b7bb75a30ff02656b;p=thirdparty%2Fgcc.git 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 --- 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 + + * 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 * 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));