aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2005-04-13 19:47:30 +0000
committerFariborz Jahanian <fjahanian@gcc.gnu.org>2005-04-13 19:47:30 +0000
commit6bd1354069cc2ccbfa82e79eb2908b370888d0e8 (patch)
treee476fa5d605916079ad210bcd6b6d58c66b60f36 /gcc
parentfda5e9366caaa3e5e5f80c7554ce5f47195e1ee3 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/simplify-rtx.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-xorps.c31
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;
+}