i386.c (ix86_build_const_vector): Rewrite using loop with RTVEC_ELT accessor.
authorUros Bizjak <ubizjak@gmail.com>
Fri, 26 Aug 2011 20:53:38 +0000 (22:53 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 26 Aug 2011 20:53:38 +0000 (22:53 +0200)
* config/i386/i386.c (ix86_build_const_vector): Rewrite using loop
with RTVEC_ELT accessor.

From-SVN: r178124

gcc/ChangeLog
gcc/config/i386/i386.c

index a067e2eceae3f945809bf0f6f1515e1e966fdd51..14aaee7471107cf64cd28478cfa4db758de96e6f 100644 (file)
@@ -1,3 +1,13 @@
+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
index 698bc7692ec159d5fc9a6ae3eba5d224ee308e8e..3a8b0818796132f420a7fceca1cbc4fb3441c5dd 100644 (file)
@@ -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 ();