Hello
This patch adds support for the unordered floating-point comparison operators
(UNEQ, UNGE, UNGT, UNLE, UNLT), which return true if one of the operands is a
NaN. These comparisons can be generated by builtins such as __builtin_isgreater.
GCC 10 appears to have a fall-back if the unordered comparisons are not
available (by generating an unordered comparison first, followed by the main
comparison), whereas previous versions would simply throw an ICE. Still, it
should be a little more efficient to have direct support for these operators.
Tested on a GCN3 board with no regressions noted. Okay for trunk?
Kwok
commit ea811ce38ae2127554f0aca9cd34aca6e42f814d
Author: Kwok Cheung Yeung <k...@codesourcery.com>
Date: Thu Apr 2 07:47:28 2020 -0700
amdgcn: Support unordered floating-point comparison operators
2020-04-02 Kwok Cheung Yeung <k...@codesourcery.com>
gcc/
* config/gcn/gcn.c (print_operand): Handle unordered comparison
operators.
* config/gcn/predicates.md (gcn_fp_compare_operator): Add unordered
comparison operators.
diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
index 12438cf..38b5b98 100644
--- a/gcc/config/gcn/gcn.c
+++ b/gcc/config/gcn/gcn.c
@@ -6007,6 +6007,21 @@ print_operand (FILE *file, rtx x, int code)
case UNORDERED:
s = "_u_";
break;
+ case UNEQ:
+ s = "_nlg_";
+ break;
+ case UNGE:
+ s = "_nlt_";
+ break;
+ case UNGT:
+ s = "_nle_";
+ break;
+ case UNLE:
+ s = "_ngt_";
+ break;
+ case UNLT:
+ s = "_nge_";
+ break;
case LTGT:
s = "_lg_";
break;
diff --git a/gcc/config/gcn/predicates.md b/gcc/config/gcn/predicates.md
index 7bf763a..91e5ca1 100644
--- a/gcc/config/gcn/predicates.md
+++ b/gcc/config/gcn/predicates.md
@@ -165,7 +165,7 @@
(match_code "eq,ne,gt,ge,lt,le,gtu,geu,ltu,leu"))
(define_predicate "gcn_fp_compare_operator"
- (match_code "eq,ne,gt,ge,lt,le,gtu,geu,ltu,leu,ordered,unordered,ltgt"))
+ (match_code
"eq,ne,gt,ge,lt,le,gtu,geu,ltu,leu,ordered,unordered,uneq,unge,ungt,unle,unlt,ltgt"))
(define_predicate "unary_operator"
(match_code "not,popcount"))