summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-09 19:27:55 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-09 19:27:55 +0000
commit7be10878f39694e05b3bd2f0c9ece6f5a1fd9928 (patch)
tree96aa90127b4a4b4bb4eebac21fbf671df91a35bb /gcc
parent4074191c6abc4a479906d6f72a28d6ab9c42e1ea (diff)
downloadgcc-7be10878f39694e05b3bd2f0c9ece6f5a1fd9928.tar.gz
2004-10-09 Roger Sayle <roger@eyesopen.com>
PR rtl-optimization/17853 * simplify-rtx.c (simplify_relational_operation): Correct comment. Reorganize handling of comparison operations with floating point results (always return 0.0 even without FLOAT_STORE_FLAG_VALUE). Likewise, introduce support for comparison operations with vector result types, introducing a new VECTOR_STORE_FLAG_VALUE target macro. * doc/rtl.texi: Document new VECTOR_STORE_FLAG_VALUE target macro. * doc/tm.texi: Likewise. 2004-10-09 Stuart Hastings <stuart@apple.com> Roger Sayle <roger@eyesopen.com> PR rtl-optimization/17853 * gcc.dg/i386-mmx-5.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88826 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/doc/rtl.texi7
-rw-r--r--gcc/doc/tm.texi14
-rw-r--r--gcc/simplify-rtx.c42
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/i386-mmx-5.c18
6 files changed, 88 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e1386742412..1107817bc82 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2004-10-09 Roger Sayle <roger@eyesopen.com>
+
+ PR rtl-optimization/17853
+ * simplify-rtx.c (simplify_relational_operation): Correct comment.
+ Reorganize handling of comparison operations with floating point
+ results (always return 0.0 even without FLOAT_STORE_FLAG_VALUE).
+ Likewise, introduce support for comparison operations with vector
+ result types, introducing a new VECTOR_STORE_FLAG_VALUE target macro.
+
+ * doc/rtl.texi: Document new VECTOR_STORE_FLAG_VALUE target macro.
+ * doc/tm.texi: Likewise.
+
2004-10-09 Steven Bosscher <stevenb@suse.de>
* regs.h (struct reg_info_def): Remove the last_node_uid and
diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi
index 113dc147e79..3a72c167341 100644
--- a/gcc/doc/rtl.texi
+++ b/gcc/doc/rtl.texi
@@ -2028,10 +2028,13 @@ Comparison operators test a relation on two operands and are considered
to represent a machine-dependent nonzero value described by, but not
necessarily equal to, @code{STORE_FLAG_VALUE} (@pxref{Misc})
if the relation holds, or zero if it does not, for comparison operators
-whose results have a `MODE_INT' mode, and
+whose results have a `MODE_INT' mode,
@code{FLOAT_STORE_FLAG_VALUE} (@pxref{Misc}) if the relation holds, or
zero if it does not, for comparison operators that return floating-point
-values. The mode of the comparison operation is independent of the mode
+values, and a vector of either @code{VECTOR_STORE_FLAG_VALUE} (@pxref{Misc})
+if the relation holds, or of zeros if it does not, for comparison operators
+that return vector results.
+The mode of the comparison operation is independent of the mode
of the data being compared. If the comparison operation is being tested
(e.g., the first operand of an @code{if_then_else}), the mode must be
@code{VOIDmode}.
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 71c72c84603..69f60c14335 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -8920,11 +8920,23 @@ instructions, or if the value generated by these instructions is 1.
@defmac FLOAT_STORE_FLAG_VALUE (@var{mode})
A C expression that gives a nonzero @code{REAL_VALUE_TYPE} value that is
returned when comparison operators with floating-point results are true.
-Define this macro on machine that have comparison operations that return
+Define this macro on machines that have comparison operations that return
floating-point values. If there are no such operations, do not define
this macro.
@end defmac
+@defmac VECTOR_STORE_FLAG_VALUE (@var{mode})
+A C expression that gives a rtx representing the non-zero true element
+for vector comparisons. The returned rtx should be valid for the inner
+mode of @var{mode} which is guaranteed to be a vector mode. Define
+this macro on machines that have vector comparison operations that
+return a vector result. If there are no such operations, do not define
+this macro. Typically, this macro is defined as @code{const1_rtx} or
+@code{constm1_rtx}. This macro may return @code{NULL_RTX} to prevent
+the compiler optimizing such vector comparison operations for the
+given mode.
+@end defmac
+
@defmac CLZ_DEFINED_VALUE_AT_ZERO (@var{mode}, @var{value})
@defmacx CTZ_DEFINED_VALUE_AT_ZERO (@var{mode}, @var{value})
A C expression that evaluates to true if the architecture defines a value
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index eec2a5816a3..7236bbfc064 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -2679,7 +2679,7 @@ simplify_plus_minus (enum rtx_code code, enum machine_mode mode, rtx op0,
/* Like simplify_binary_operation except used for relational operators.
MODE is the mode of the result. If MODE is VOIDmode, both operands must
- also be VOIDmode.
+ not also be VOIDmode.
CMP_MODE specifies in which mode the comparison is done in, so it is
the mode of the operands. If CMP_MODE is VOIDmode, it is taken from
@@ -2699,19 +2699,45 @@ simplify_relational_operation (enum rtx_code code, enum machine_mode mode,
tem = simplify_const_relational_operation (code, cmp_mode, op0, op1);
if (tem)
{
-#ifdef FLOAT_STORE_FLAG_VALUE
if (GET_MODE_CLASS (mode) == MODE_FLOAT)
{
if (tem == const0_rtx)
return CONST0_RTX (mode);
- else if (GET_MODE_CLASS (mode) == MODE_FLOAT)
- {
- REAL_VALUE_TYPE val;
- val = FLOAT_STORE_FLAG_VALUE (mode);
- return CONST_DOUBLE_FROM_REAL_VALUE (val, mode);
- }
+#ifdef FLOAT_STORE_FLAG_VALUE
+ {
+ REAL_VALUE_TYPE val;
+ val = FLOAT_STORE_FLAG_VALUE (mode);
+ return CONST_DOUBLE_FROM_REAL_VALUE (val, mode);
+ }
+#else
+ return NULL_RTX;
+#endif
}
+ if (VECTOR_MODE_P (mode))
+ {
+ if (tem == const0_rtx)
+ return CONST0_RTX (mode);
+#ifdef VECTOR_STORE_FLAG_VALUE
+ {
+ int i, units;
+ rtvec c;
+
+ rtx val = VECTOR_STORE_FLAG_VALUE (mode);
+ if (val == NULL_RTX)
+ return NULL_RTX;
+ if (val == const1_rtx)
+ return CONST1_RTX (mode);
+
+ units = GET_MODE_NUNITS (mode);
+ v = rtvec_alloc (units);
+ for (i = 0; i < units; i++)
+ RTVEC_ELT (v, i) = val;
+ return gen_rtx_raw_CONST_VECTOR (mode, v);
+ }
+#else
+ return NULL_RTX;
#endif
+ }
return tem;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 52522b8278c..5fc35b8cc98 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2004-10-09 Stuart Hastings <stuart@apple.com>
+ Roger Sayle <roger@eyesopen.com>
+
+ PR rtl-optimization/17853
+ * gcc.dg/i386-mmx-5.c: New testcase.
+
2004-10-09 Andrew Pinski <pinskia@physics.uc.edu>
* g++.dg/opt/pr17902.C: Fix typo in dg-do.
diff --git a/gcc/testsuite/gcc.dg/i386-mmx-5.c b/gcc/testsuite/gcc.dg/i386-mmx-5.c
new file mode 100644
index 00000000000..6021825a47d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/i386-mmx-5.c
@@ -0,0 +1,18 @@
+/* PR rtl-optimization/17853 */
+/* Contributed by Stuart Hastings <stuart@apple.com> */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -mmmx" } */
+#include <mmintrin.h>
+#include <stdlib.h>
+
+__m64 global_mask;
+
+int main()
+{
+ __m64 zero = _mm_setzero_si64();
+ __m64 mask = _mm_cmpeq_pi8( zero, zero );
+ mask = _mm_unpacklo_pi8( mask, zero );
+ global_mask = mask;
+ return 0;
+}
+