diff options
author | Michael Matz <matz@gcc.gnu.org> | 2010-01-28 14:11:34 +0000 |
---|---|---|
committer | Michael Matz <matz@gcc.gnu.org> | 2010-01-28 14:11:34 +0000 |
commit | 3d952fb7837516c37b16810e15fa8f197cc5cbb3 (patch) | |
tree | 8f2b4df277e78922ba65064613ff3e0ca7ac5a34 /gcc | |
parent | 2b30b635ab157720a179a95fc445efda866dd802 (diff) | |
download | gcc-3d952fb7837516c37b16810e15fa8f197cc5cbb3.zip gcc-3d952fb7837516c37b16810e15fa8f197cc5cbb3.tar.gz gcc-3d952fb7837516c37b16810e15fa8f197cc5cbb3.tar.bz2 |
re PR target/42881 (SSE2 intrinsics miscompiled at -O0 -march=k8)
PR target/42881
* config/i386/i386.c (ix86_expand_vector_init_duplicate):
Wrap force_reg into a sequence, emit it before user.
testsuite/
* gcc.target/i386/pr42881.c: New test.
From-SVN: r156320
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr42881.c | 14 |
4 files changed, 33 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 211407f..7df2ce2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-28 Michael Matz <matz@suse.de> + + PR target/42881 + * config/i386/i386.c (ix86_expand_vector_init_duplicate): + Wrap force_reg into a sequence, emit it before user. + 2010-01-28 Stephen Thomas <stephen.thomas@arm.com> * config/arm/arm.md (bswapsi2): Add support for bswapsi2. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6b1c9b9..84b652f 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -26644,8 +26644,16 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode, insn = emit_insn (gen_rtx_SET (VOIDmode, target, dup)); if (recog_memoized (insn) < 0) { + rtx seq; /* If that fails, force VAL into a register. */ + + start_sequence (); XEXP (dup, 0) = force_reg (GET_MODE_INNER (mode), val); + seq = get_insns (); + end_sequence (); + if (seq) + emit_insn_before (seq, insn); + ok = recog_memoized (insn) >= 0; gcc_assert (ok); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d45911..675c6c5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-01-28 Michael Matz <matz@suse.de> + + * gcc.target/i386/pr42881.c: New test. + 2010-01-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * gcc.misc-tests/linkage.exp: Remove mips-sgi-irix6*o32 support. @@ -12,7 +16,7 @@ 2010-01-27 Stephen Thomas <stephen.thomas@arm.com> - * testsuite/gcc.dg/optimize-bswap*.c: Add ARM target + * testsuite/gcc.dg/optimize-bswap*.c: Add ARM target 2010-01-27 Richard Guenther <rguenther@suse.de> diff --git a/gcc/testsuite/gcc.target/i386/pr42881.c b/gcc/testsuite/gcc.target/i386/pr42881.c new file mode 100644 index 0000000..8c1f571 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr42881.c @@ -0,0 +1,14 @@ +/* PR target/42881 */ +/* { dg-do run } */ +/* { dg-options "-O0 -msse" } */ +#include "sse-check.h" +#include <xmmintrin.h> +static void +sse_test (void) +{ + double a[2]; + __m128d x = _mm_set1_pd(3); + _mm_storeu_pd(a,x); + if (a[0] != 3.0 || a[1] != 3.0) + __builtin_abort (); +} |