From fc7ca5fd397370a7c606e631b399e43b22397ef9 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Sat, 9 Oct 2004 19:27:55 +0000 Subject: [PATCH] [multiple changes] 2004-10-09 Roger Sayle 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 Roger Sayle PR rtl-optimization/17853 * gcc.dg/i386-mmx-5.c: New testcase. From-SVN: r88826 --- gcc/ChangeLog | 12 +++++++++ gcc/doc/rtl.texi | 7 ++++-- gcc/doc/tm.texi | 14 ++++++++++- gcc/simplify-rtx.c | 42 +++++++++++++++++++++++++------ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gcc.dg/i386-mmx-5.c | 18 +++++++++++++ 6 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/i386-mmx-5.c 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 + + 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 * 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 + Roger Sayle + + PR rtl-optimization/17853 + * gcc.dg/i386-mmx-5.c: New testcase. + 2004-10-09 Andrew Pinski * 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 */ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -mmmx" } */ +#include +#include + +__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; +} +