This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH: Use ix86_expand_vector_set if possible
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: ubizjak at gmail dot com
- Date: Tue, 13 May 2008 06:34:19 -0700
- Subject: PATCH: Use ix86_expand_vector_set if possible
Hi,
This patch uses ix86_expand_vector_set if possible when initializing
a vector with only one non-zero value. I am testing it on Linux/ia32
and Linux/Intel64. OK to install on trunk if all pass?
Thanks.
H.J.
---
gcc/
2008-05-13 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/i386.c (ix86_expand_vector_init_one_nonzero): Use
ix86_expand_vector_set if supported.
gcc/testsuite/
2008-05-13 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/sse-init-v4hi-1.c: New.
* gcc.target/i386/sse-init-v4sf-1.c: Likewise.
* gcc.target/i386/sse2-init-v16qi-1.c: Likewise.
* gcc.target/i386/sse2-init-v2di-1.c: Likewise.
* gcc.target/i386/sse2-init-v4si-1.c: Likewise.
* gcc.target/i386/sse2-init-v8hi-1.c: Likewise.
* gcc.target/i386/sse4_1-init-v16qi-1.c: Likewise.
* gcc.target/i386/sse4_1-init-v2di-1.c: Likewise.
* gcc.target/i386/sse4_1-init-v4sf-1.c: Likewise.
* gcc.target/i386/sse4_1-init-v4si-1.c: Likewise.
Index: testsuite/gcc.target/i386/sse4_1-init-v2di-1.c
===================================================================
--- testsuite/gcc.target/i386/sse4_1-init-v2di-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse4_1-init-v2di-1.c (revision 0)
@@ -0,0 +1,64 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sse4 } */
+/* { dg-options "-O2 -msse4.1" } */
+
+#include "sse4_1-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <emmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128i x, unsigned long long *v, int j)
+{
+ union
+ {
+ __m128i x;
+ unsigned long long i[2];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.i[i])
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%llx != 0x%llx\n", i, v[i], u.i[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.i[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%llx != 0\n", i, u.i[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (unsigned long long *v)
+{
+ __m128i x;
+
+ x = _mm_set_epi64x (0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_epi64x (v[1], 0);
+ check (x, v, 1);
+}
+
+static void
+sse4_1_test (void)
+{
+ unsigned long long v[2]
+ = { 0x7B5B546573745665LL, 0x63746F725D53475DLL };
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse2-init-v2di-1.c
===================================================================
--- testsuite/gcc.target/i386/sse2-init-v2di-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse2-init-v2di-1.c (revision 0)
@@ -0,0 +1,63 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -msse2" } */
+
+#include "sse2-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <emmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128i x, unsigned long long *v, int j)
+{
+ union
+ {
+ __m128i x;
+ unsigned long long i[2];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.i[i])
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%llx != 0x%llx\n", i, v[i], u.i[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.i[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%llx != 0\n", i, u.i[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (unsigned long long *v)
+{
+ __m128i x;
+
+ x = _mm_set_epi64x (0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_epi64x (v[1], 0);
+ check (x, v, 1);
+}
+
+static void
+sse2_test (void)
+{
+ unsigned long long v[2]
+ = { 0x7B5B546573745665LL, 0x63746F725D53475DLL };
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse4_1-init-v16qi-1.c
===================================================================
--- testsuite/gcc.target/i386/sse4_1-init-v16qi-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse4_1-init-v16qi-1.c (revision 0)
@@ -0,0 +1,77 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sse4 } */
+/* { dg-options "-O2 -msse4.1" } */
+
+#include "sse4_1-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <emmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128i x, unsigned char *v, int j)
+{
+ union
+ {
+ __m128i x;
+ unsigned char i[16];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.i[i])
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.i[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0\n", i, u.i[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (unsigned char *v)
+{
+ __m128i x;
+
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[1], 0);
+ check (x, v, 1);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[2], 0, 0);
+ check (x, v, 2);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[3], 0, 0, 0);
+ check (x, v, 3);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[4], 0, 0, 0, 0);
+ check (x, v, 4);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[5], 0, 0, 0, 0, 0);
+ check (x, v, 5);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, v[6], 0, 0, 0, 0, 0, 0);
+ check (x, v, 6);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, v[7], 0, 0, 0, 0, 0, 0, 0);
+ check (x, v, 7);
+}
+
+static void
+sse4_1_test (void)
+{
+ unsigned char v[16]
+ = { 0x7B, 0x5B, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65,
+ 0x63, 0x74, 0x6F, 0x72, 0x5D, 0x53, 0x47, 0x5D };
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse-init-v4sf-1.c
===================================================================
--- testsuite/gcc.target/i386/sse-init-v4sf-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse-init-v4sf-1.c (revision 0)
@@ -0,0 +1,66 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -msse" } */
+
+#include "sse-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <xmmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128 x, float *v, int j)
+{
+ union
+ {
+ __m128 x;
+ float f[4];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.f[i])
+ {
+#ifdef DEBUG
+ printf ("%i: %f != %f\n", i, v[i], u.f[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.f[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: %f != 0\n", i, u.f[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (float *v)
+{
+ __m128 x;
+
+ x = _mm_set_ps (0, 0, 0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_ps (0, 0, v[1], 0);
+ check (x, v, 1);
+ x = _mm_set_ps (0, v[2], 0, 0);
+ check (x, v, 2);
+ x = _mm_set_ps (v[3], 0, 0, 0);
+ check (x, v, 3);
+}
+
+static void
+sse_test (void)
+{
+ float v[4] = { -3, 2, 1, 9 };
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse4_1-init-v4sf-1.c
===================================================================
--- testsuite/gcc.target/i386/sse4_1-init-v4sf-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse4_1-init-v4sf-1.c (revision 0)
@@ -0,0 +1,67 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sse4 } */
+/* { dg-options "-O2 -msse4.1" } */
+
+#include "sse4_1-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <emmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128 x, float *v, int j)
+{
+ union
+ {
+ __m128 x;
+ float f[4];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.f[i])
+ {
+#ifdef DEBUG
+ printf ("%i: %f != %f\n", i, v[i], u.f[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.f[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: %f != 0\n", i, u.f[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (float *v)
+{
+ __m128 x;
+
+ x = _mm_set_ps (0, 0, 0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_ps (0, 0, v[1], 0);
+ check (x, v, 1);
+ x = _mm_set_ps (0, v[2], 0, 0);
+ check (x, v, 2);
+ x = _mm_set_ps (v[3], 0, 0, 0);
+ check (x, v, 3);
+}
+
+static void
+sse4_1_test (void)
+{
+ float v[4] = { -3, 2, 1, 9 };
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse2-init-v16qi-1.c
===================================================================
--- testsuite/gcc.target/i386/sse2-init-v16qi-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse2-init-v16qi-1.c (revision 0)
@@ -0,0 +1,76 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -msse2" } */
+
+#include "sse2-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <emmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128i x, unsigned char *v, int j)
+{
+ union
+ {
+ __m128i x;
+ unsigned char i[16];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.i[i])
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.i[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0\n", i, u.i[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (unsigned char *v)
+{
+ __m128i x;
+
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[1], 0);
+ check (x, v, 1);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[2], 0, 0);
+ check (x, v, 2);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[3], 0, 0, 0);
+ check (x, v, 3);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[4], 0, 0, 0, 0);
+ check (x, v, 4);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[5], 0, 0, 0, 0, 0);
+ check (x, v, 5);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, v[6], 0, 0, 0, 0, 0, 0);
+ check (x, v, 6);
+ x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, v[7], 0, 0, 0, 0, 0, 0, 0);
+ check (x, v, 7);
+}
+
+static void
+sse2_test (void)
+{
+ unsigned char v[16]
+ = { 0x7B, 0x5B, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65,
+ 0x63, 0x74, 0x6F, 0x72, 0x5D, 0x53, 0x47, 0x5D };
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse4_1-init-v4si-1.c
===================================================================
--- testsuite/gcc.target/i386/sse4_1-init-v4si-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse4_1-init-v4si-1.c (revision 0)
@@ -0,0 +1,68 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sse4 } */
+/* { dg-options "-O2 -msse4.1" } */
+
+#include "sse4_1-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <emmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128i x, unsigned int *v, int j)
+{
+ union
+ {
+ __m128i x;
+ unsigned int i[4];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.i[i])
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.i[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0\n", i, u.i[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (unsigned int *v)
+{
+ __m128i x;
+
+ x = _mm_set_epi32 (0, 0, 0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_epi32 (0, 0, v[1], 0);
+ check (x, v, 1);
+ x = _mm_set_epi32 (0, v[2], 0, 0);
+ check (x, v, 2);
+ x = _mm_set_epi32 (v[3], 0, 0, 0);
+ check (x, v, 3);
+}
+
+static void
+sse4_1_test (void)
+{
+ unsigned int v[4]
+ = { 0x7B5B5465, 0x73745665, 0x63746F72, 0x5D53475D };
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse2-init-v4si-1.c
===================================================================
--- testsuite/gcc.target/i386/sse2-init-v4si-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse2-init-v4si-1.c (revision 0)
@@ -0,0 +1,67 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -msse2" } */
+
+#include "sse2-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <emmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128i x, unsigned int *v, int j)
+{
+ union
+ {
+ __m128i x;
+ unsigned int i[4];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.i[i])
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.i[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0\n", i, u.i[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (unsigned int *v)
+{
+ __m128i x;
+
+ x = _mm_set_epi32 (0, 0, 0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_epi32 (0, 0, v[1], 0);
+ check (x, v, 1);
+ x = _mm_set_epi32 (0, v[2], 0, 0);
+ check (x, v, 2);
+ x = _mm_set_epi32 (v[3], 0, 0, 0);
+ check (x, v, 3);
+}
+
+static void
+sse2_test (void)
+{
+ unsigned int v[4]
+ = { 0x7B5B5465, 0x73745665, 0x63746F72, 0x5D53475D };
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse-init-v4hi-1.c
===================================================================
--- testsuite/gcc.target/i386/sse-init-v4hi-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse-init-v4hi-1.c (revision 0)
@@ -0,0 +1,67 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -msse" } */
+
+#include "sse-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <mmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m64 x, unsigned short *v, int j)
+{
+ union
+ {
+ __m64 x;
+ unsigned short i[8];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.i[i])
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.i[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0\n", i, u.i[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (unsigned short *v)
+{
+ __m64 x;
+
+ x = _mm_set_pi16 (0, 0, 0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_pi16 (0, 0, v[1], 0);
+ check (x, v, 1);
+ x = _mm_set_pi16 (0, v[2], 0, 0);
+ check (x, v, 2);
+ x = _mm_set_pi16 (v[3], 0, 0, 0);
+ check (x, v, 3);
+}
+
+static void
+sse_test (void)
+{
+ unsigned short v[4]
+ = { 0x7B5B, 0x5465, 0x7374, 0x5665};
+ test (v);
+}
Index: testsuite/gcc.target/i386/sse2-init-v8hi-1.c
===================================================================
--- testsuite/gcc.target/i386/sse2-init-v8hi-1.c (revision 0)
+++ testsuite/gcc.target/i386/sse2-init-v8hi-1.c (revision 0)
@@ -0,0 +1,76 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -msse2" } */
+
+#include "sse2-check.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include <emmintrin.h>
+
+static void
+__attribute__((noinline))
+check (__m128i x, unsigned short *v, int j)
+{
+ union
+ {
+ __m128i x;
+ unsigned short i[8];
+ } u;
+ unsigned int i;
+
+ u.x = x;
+
+ for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
+ if (i == j)
+ {
+ if (v[i] != u.i[i])
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]);
+#endif
+ abort ();
+ }
+ }
+ else if (u.i[i] != 0)
+ {
+#ifdef DEBUG
+ printf ("%i: 0x%x != 0\n", i, u.i[i]);
+#endif
+ abort ();
+ }
+}
+
+static void
+__attribute__((noinline))
+test (unsigned short *v)
+{
+ __m128i x;
+
+ x = _mm_set_epi16 (0, 0, 0, 0, 0, 0, 0, v[0]);
+ check (x, v, 0);
+ x = _mm_set_epi16 (0, 0, 0, 0, 0, 0, v[1], 0);
+ check (x, v, 1);
+ x = _mm_set_epi16 (0, 0, 0, 0, 0, v[2], 0, 0);
+ check (x, v, 2);
+ x = _mm_set_epi16 (0, 0, 0, 0, v[3], 0, 0, 0);
+ check (x, v, 3);
+ x = _mm_set_epi16 (0, 0, 0, v[4], 0, 0, 0, 0);
+ check (x, v, 4);
+ x = _mm_set_epi16 (0, 0, v[5], 0, 0, 0, 0, 0);
+ check (x, v, 5);
+ x = _mm_set_epi16 (0, v[6], 0, 0, 0, 0, 0, 0);
+ check (x, v, 6);
+ x = _mm_set_epi16 (v[7], 0, 0, 0, 0, 0, 0, 0);
+ check (x, v, 7);
+}
+
+static void
+sse2_test (void)
+{
+ unsigned short v[8]
+ = { 0x7B5B, 0x5465, 0x7374, 0x5665,
+ 0x6374, 0x6F72, 0x5D53, 0x475D };
+ test (v);
+}
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c (revision 135245)
+++ config/i386/i386.c (working copy)
@@ -23863,6 +23863,34 @@ ix86_expand_vector_init_one_nonzero (boo
enum machine_mode vsimode;
rtx new_target;
rtx x, tmp;
+ bool use_vector_set = false;
+
+ switch (mode)
+ {
+ case V2DImode:
+ use_vector_set = TARGET_64BIT && TARGET_SSE4_1;
+ break;
+ case V16QImode:
+ case V4SImode:
+ case V4SFmode:
+ use_vector_set = TARGET_SSE4_1;
+ break;
+ case V8HImode:
+ use_vector_set = TARGET_SSE2;
+ break;
+ case V4HImode:
+ use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
+ default:
+ break;
+ }
+
+ if (use_vector_set)
+ {
+ emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
+ var = force_reg (GET_MODE_INNER (mode), var);
+ ix86_expand_vector_set (mmx_ok, target, var, one_var);
+ return true;
+ }
switch (mode)
{