aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2008-05-13 19:42:30 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2008-05-13 12:42:30 -0700
commitaf7ae5d1075e9e7f2eddd0a7b113ebca3429b9e4 (patch)
tree858d6a6a54d1ba105516b832ac78bb6a1c0500e8 /gcc/config
parent5db9ba0c38a08b7313ab2e10b1aabc98c5b73301 (diff)
downloadgcc-af7ae5d1075e9e7f2eddd0a7b113ebca3429b9e4.zip
gcc-af7ae5d1075e9e7f2eddd0a7b113ebca3429b9e4.tar.gz
gcc-af7ae5d1075e9e7f2eddd0a7b113ebca3429b9e4.tar.bz2
i386.c (ix86_expand_vector_init_one_nonzero): Use ix86_expand_vector_set if supported.
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. From-SVN: r135272
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/i386/i386.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 0ebfb1b..6d551e0 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -23643,6 +23643,34 @@ ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
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)
{