aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2011-08-26 22:53:38 +0200
committerUros Bizjak <uros@gcc.gnu.org>2011-08-26 22:53:38 +0200
commit734dfb474fd01decb6f36def5cd7ff229677123c (patch)
tree0874733087b6f61a8fd9e75928eb542b24262b82
parentbbeb5bebd66e300ae907d133740580a7b4f33c5b (diff)
downloadgcc-734dfb474fd01decb6f36def5cd7ff229677123c.zip
gcc-734dfb474fd01decb6f36def5cd7ff229677123c.tar.gz
gcc-734dfb474fd01decb6f36def5cd7ff229677123c.tar.bz2
i386.c (ix86_build_const_vector): Rewrite using loop with RTVEC_ELT accessor.
* config/i386/i386.c (ix86_build_const_vector): Rewrite using loop with RTVEC_ELT accessor. From-SVN: r178124
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.c49
2 files changed, 23 insertions, 36 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a067e2e..14aaee7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,15 @@
2011-08-26 Uros Bizjak <ubizjak@gmail.com>
+ * config/i386/i386.md (round<mode>2): New expander.
+ * config/i386/i386.c (enum ix86_builtins): Add
+ IX86_BUILTIN_ROUND{PS,PD}_AZ{,256}.
+ (struct builtin_description): Add __builtin_ia32_round{ps,pd}_az{,256}
+ descriptions.
+ (ix86_builtin_vectorized_function): Handle BUILT_IN_ROUND{,F} builtins.
+ (ix86_build_const_vector): Rewrite using loop with RTVEC_ELT accessor.
+
+2011-08-26 Uros Bizjak <ubizjak@gmail.com>
+
PR middle-end/50083
* convert.c (convert_to_integer) <BUIT_IN_ROUND{,F,L}>: Convert
only when TARGET_C99_FUNCTIONS.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 698bc769..3a8b081 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -16512,52 +16512,29 @@ ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
rtx
ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
{
+ int i, n_elt;
rtvec v;
+ enum machine_mode scalar_mode;
+
switch (mode)
{
case V4SImode:
- gcc_assert (vect);
- v = gen_rtvec (4, value, value, value, value);
- return gen_rtx_CONST_VECTOR (V4SImode, v);
-
case V2DImode:
gcc_assert (vect);
- v = gen_rtvec (2, value, value);
- return gen_rtx_CONST_VECTOR (V2DImode, v);
-
case V8SFmode:
- if (vect)
- v = gen_rtvec (8, value, value, value, value,
- value, value, value, value);
- else
- v = gen_rtvec (8, value, CONST0_RTX (SFmode),
- CONST0_RTX (SFmode), CONST0_RTX (SFmode),
- CONST0_RTX (SFmode), CONST0_RTX (SFmode),
- CONST0_RTX (SFmode), CONST0_RTX (SFmode));
- return gen_rtx_CONST_VECTOR (V8SFmode, v);
-
case V4SFmode:
- if (vect)
- v = gen_rtvec (4, value, value, value, value);
- else
- v = gen_rtvec (4, value, CONST0_RTX (SFmode),
- CONST0_RTX (SFmode), CONST0_RTX (SFmode));
- return gen_rtx_CONST_VECTOR (V4SFmode, v);
-
case V4DFmode:
- if (vect)
- v = gen_rtvec (4, value, value, value, value);
- else
- v = gen_rtvec (4, value, CONST0_RTX (DFmode),
- CONST0_RTX (DFmode), CONST0_RTX (DFmode));
- return gen_rtx_CONST_VECTOR (V4DFmode, v);
-
case V2DFmode:
- if (vect)
- v = gen_rtvec (2, value, value);
- else
- v = gen_rtvec (2, value, CONST0_RTX (DFmode));
- return gen_rtx_CONST_VECTOR (V2DFmode, v);
+ n_elt = GET_MODE_NUNITS (mode);
+ v = rtvec_alloc (n_elt);
+ scalar_mode = GET_MODE_INNER (mode);
+
+ RTVEC_ELT (v, 0) = value;
+
+ for (i = 1; i < n_elt; ++i)
+ RTVEC_ELT (v, i) = vect ? value : CONST0_RTX (scalar_mode);
+
+ return gen_rtx_CONST_VECTOR (mode, v);
default:
gcc_unreachable ();