diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2008-05-13 19:42:30 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2008-05-13 12:42:30 -0700 |
commit | af7ae5d1075e9e7f2eddd0a7b113ebca3429b9e4 (patch) | |
tree | 858d6a6a54d1ba105516b832ac78bb6a1c0500e8 /gcc/config | |
parent | 5db9ba0c38a08b7313ab2e10b1aabc98c5b73301 (diff) | |
download | gcc-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.c | 28 |
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) { |