diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2005-04-13 19:47:30 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@gcc.gnu.org> | 2005-04-13 19:47:30 +0000 |
commit | 6bd1354069cc2ccbfa82e79eb2908b370888d0e8 (patch) | |
tree | e476fa5d605916079ad210bcd6b6d58c66b60f36 /gcc | |
parent | fda5e9366caaa3e5e5f80c7554ce5f47195e1ee3 (diff) | |
download | gcc-6bd1354069cc2ccbfa82e79eb2908b370888d0e8.zip gcc-6bd1354069cc2ccbfa82e79eb2908b370888d0e8.tar.gz gcc-6bd1354069cc2ccbfa82e79eb2908b370888d0e8.tar.bz2 |
Fix result of folding of xor operation on two identical vectors.
OKed by Roger Sayle.
From-SVN: r98107
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/i386-xorps.c | 31 |
3 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2ac5bb..507bef1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-04-13 Fariborz Jahanian <fjahanian@apple.com> + + * simplify-rtx.c (simplify_binary_operation_1): Return + scalar or vector of constant 0, depending on the xor's + mode. + 2005-04-13 Dale Johannesen <dalej@apple.com> * objc/Make-lang.in (objc-lang.o): Depend on tree-gimple.h. diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index de7ed38..9e02a7a 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -1641,7 +1641,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode, if (trueop0 == trueop1 && ! side_effects_p (op0) && GET_MODE_CLASS (mode) != MODE_CC) - return const0_rtx; + return CONST0_RTX (mode); /* Canonicalize XOR of the most significant bit to PLUS. */ if ((GET_CODE (op1) == CONST_INT diff --git a/gcc/testsuite/gcc.dg/i386-xorps.c b/gcc/testsuite/gcc.dg/i386-xorps.c new file mode 100644 index 0000000..86daa79 --- /dev/null +++ b/gcc/testsuite/gcc.dg/i386-xorps.c @@ -0,0 +1,31 @@ +/* { dg-do compile { target i?86-*-* } } */ +/* { dg-options "-Os -msse2" } */ + +typedef float __m128 __attribute__ ((vector_size (16))); + +static __inline __m128 +_mm_mul_ps (__m128 __A, __m128 __B) +{ + return __builtin_ia32_mulps (__A, __B); +} + +static __inline __m128 +_mm_sub_ps (__m128 __A, __m128 __B) +{ + return __builtin_ia32_subps (__A, __B); +} + +__m128 POW_FUNC (__m128 x, __m128 y) +{ + __m128 xmm0 = x, xmm1 = y, xmm2; + + xmm0 = __builtin_ia32_xorps (xmm1, xmm1); + + xmm0 = _mm_mul_ps (xmm0, xmm1); + + xmm0 = _mm_sub_ps (xmm0, xmm1); + + xmm0 = _mm_mul_ps (xmm0, xmm1); + + return xmm0; +} |