aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2009-04-08 15:18:49 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2009-04-08 15:18:49 +0000
commitc6963675ebad4a3396521df8e49d558a04cf12b3 (patch)
treec22913f141a234b21391cc1fee6f3ed3aa5a1a7e /gcc
parent6d07ad98760362cd9615c673cf8302908ce60980 (diff)
downloadgcc-c6963675ebad4a3396521df8e49d558a04cf12b3.zip
gcc-c6963675ebad4a3396521df8e49d558a04cf12b3.tar.gz
gcc-c6963675ebad4a3396521df8e49d558a04cf12b3.tar.bz2
recog.c (ordered_comparison_operator): New.
2009-04-08 Paolo Bonzini <bonzini@gnu.org> * recog.c (ordered_comparison_operator): New. * gensupport.c (std_preds): Add it. * doc/md.texi (Machine-Independent Predicates): Document it. From-SVN: r145748
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/doc/md.texi10
-rw-r--r--gcc/gensupport.c3
-rw-r--r--gcc/recog.c26
4 files changed, 44 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c6ec14d..7934933 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-04-08 Paolo Bonzini <bonzini@gnu.org>
+
+ * recog.c (ordered_comparison_operator): New.
+ * gensupport.c (std_preds): Add it.
+ * doc/md.texi (Machine-Independent Predicates): Document it.
+
2009-04-08 Jan Hubicka <jh@suse.cz>
* tree-eh.c (cleanup_eh): When not optimizing, do not try EH merging.
diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi
index 18a1a4d..25de8b1 100644
--- a/gcc/doc/md.texi
+++ b/gcc/doc/md.texi
@@ -860,7 +860,7 @@ valid for @var{mode}.
@end defun
@noindent
-Finally, there is one generic operator predicate.
+Finally, there are two generic operator predicates.
@defun comparison_operator
This predicate matches any expression which performs an arithmetic
@@ -868,6 +868,14 @@ comparison in @var{mode}; that is, @code{COMPARISON_P} is true for the
expression code.
@end defun
+@defun ordered_comparison_operator
+This predicate matches any expression which performs an arithmetic
+comparison in @var{mode} and whose expression code is valid for integer
+modes; that is, the expression code will be one of @code{eq}, @code{ne},
+@code{lt}, @code{ltu}, @code{le}, @code{leu}, @code{gt}, @code{gtu},
+@code{ge}, @code{geu}.
+@end defun
+
@node Defining Predicates
@subsection Defining Machine-Specific Predicates
@cindex defining predicates
diff --git a/gcc/gensupport.c b/gcc/gensupport.c
index 0851596..3c94863 100644
--- a/gcc/gensupport.c
+++ b/gcc/gensupport.c
@@ -1367,6 +1367,9 @@ static const struct std_pred_table std_preds[] = {
{"pop_operand", false, false, {MEM}},
{"memory_operand", false, false, {SUBREG, MEM}},
{"indirect_operand", false, false, {SUBREG, MEM}},
+ {"ordered_comparison_operator", false, false, {EQ, NE,
+ LE, LT, GE, GT,
+ LEU, LTU, GEU, GTU}},
{"comparison_operator", false, false, {EQ, NE,
LE, LT, GE, GT,
LEU, LTU, GEU, GTU,
diff --git a/gcc/recog.c b/gcc/recog.c
index 70370e3..95f6e9a 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -1319,6 +1319,32 @@ indirect_operand (rtx op, enum machine_mode mode)
&& general_operand (XEXP (op, 0), Pmode));
}
+/* Return 1 if this is an ordered comparison operator (not including
+ ORDERED and UNORDERED). */
+
+int
+ordered_comparison_operator (rtx op, enum machine_mode mode)
+{
+ if (mode != VOIDmode && GET_MODE (op) != mode)
+ return false;
+ switch (GET_CODE (op))
+ {
+ case EQ:
+ case NE:
+ case LT:
+ case LTU:
+ case LE:
+ case LEU:
+ case GT:
+ case GTU:
+ case GE:
+ case GEU:
+ return true;
+ default:
+ return false;
+ }
+}
+
/* Return 1 if this is a comparison operator. This allows the use of
MATCH_OPERATOR to recognize all the branch insns. */