From: "Hu, Lin1" <[email protected]>
Currently, when we input !__builtin_isunordered (a, b) && (a != b), gcc
will emit
ucomiss %xmm1, %xmm0
movl $1, %ecx
setp %dl
setnp %al
cmovne %ecx, %edx
andl %edx, %eax
movzbl %al, %eax
In fact,
xorl %eax, %eax
ucomiss %xmm1, %xmm0
setne %al
is better.
gcc/ChangeLog:
* match.pd: Optimize (and ordered non-equal) to
(not (or unordered equal))
gcc/testsuite/ChangeLog:
* gcc.target/i386/optimize_one.c: New test.
---
gcc/match.pd | 3 +++
gcc/testsuite/gcc.target/i386/optimize_one.c | 9 +++++++++
2 files changed, 12 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/i386/optimize_one.c
diff --git a/gcc/match.pd b/gcc/match.pd
index 78f1957e8c7..aaadd2e977c 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6636,6 +6636,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(ltgt @0 @0)
(if (!flag_trapping_math || !tree_expr_maybe_nan_p (@0))
{ constant_boolean_node (false, type); }))
+(simplify
+ (bit_and (ordered @0 @1) (ne @0 @1))
+ (bit_not (uneq @0 @1)))
/* x == ~x -> false */
/* x != ~x -> true */
diff --git a/gcc/testsuite/gcc.target/i386/optimize_one.c
b/gcc/testsuite/gcc.target/i386/optimize_one.c
new file mode 100644
index 00000000000..62728d3c5ba
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/optimize_one.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mfpmath=sse" } */
+/* { dg-final { scan-assembler-times "comi" 1 } } */
+/* { dg-final { scan-assembler-times "set" 1 } } */
+
+int is_ordered_or_nonequal_sh (float a, float b)
+{
+ return !__builtin_isunordered (a, b) && (a != b);
+}
--
2.31.1