From 72602cd16b4e34843845c7b39aa5028e211cdbbf Mon Sep 17 00:00:00 2001
From: Richard Henderson <rth@redhat.com>
Date: Thu, 10 Feb 2011 08:03:48 -0800
Subject: [PATCH] predicates.md (rx_zs_comparison_operator): Revert change from 2011-02-03.

* config/rx/predicates.md (rx_zs_comparison_operator): Revert
        change from 2011-02-03.
        * config/rx/rx.c (flags_from_code): Likewise.
        (rx_print_operand) ['B']: For LT/GE, use lt/ge if overflow flag
        is valid, n/pz otherwise.
        (rx_select_cc_mode): Return CCmode if Y is not zero.

From-SVN: r170004
---
 gcc/ChangeLog               |  9 +++++++++
 gcc/config/rx/predicates.md |  2 +-
 gcc/config/rx/rx.c          | 15 +++++++++------
 3 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6094cde..b46b1bf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2011-02-10  Richard Henderson  <rth@redhat.com>
+
+	* config/rx/predicates.md (rx_zs_comparison_operator): Revert
+	change from 2011-02-03.
+	* config/rx/rx.c (flags_from_code): Likewise.
+	(rx_print_operand) ['B']: For LT/GE, use lt/ge if overflow flag
+	is valid, n/pz otherwise.
+	(rx_select_cc_mode): Return CCmode if Y is not zero.
+
 2011-02-10  Richard Guenther  <rguenther@suse.de>
 
 	* tree-ssa-structalias.c (bitpos_of_field): Use BITS_PER_UNIT,
diff --git a/gcc/config/rx/predicates.md b/gcc/config/rx/predicates.md
index 82cac42..77b3353 100644
--- a/gcc/config/rx/predicates.md
+++ b/gcc/config/rx/predicates.md
@@ -284,7 +284,7 @@
 )
 
 (define_predicate "rx_zs_comparison_operator"
-  (match_code "eq,ne")
+  (match_code "eq,ne,lt,ge")
 )
 
 ;; GT and LE omitted due to operand swap required.
diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c
index 839523f..e01f453 100644
--- a/gcc/config/rx/rx.c
+++ b/gcc/config/rx/rx.c
@@ -447,13 +447,14 @@ rx_print_operand (FILE * file, rtx op, int letter)
 	  }
 	else
 	  {
+	    unsigned int flags = flags_from_mode (mode);
 	    switch (code)
 	      {
 	      case LT:
-		ret = "lt";
+		ret = (flags & CC_FLAG_O ? "lt" : "n");
 		break;
 	      case GE:
-		ret = "ge";
+		ret = (flags & CC_FLAG_O ? "ge" : "pz");
 		break;
 	      case GT:
 		ret = "gt";
@@ -482,8 +483,7 @@ rx_print_operand (FILE * file, rtx op, int letter)
 	      default:
 		gcc_unreachable ();
 	      }
-	    gcc_checking_assert ((flags_from_code (code)
-				  & ~flags_from_mode (mode)) == 0);
+	    gcc_checking_assert ((flags_from_code (code) & ~flags) == 0);
 	  }
 	fputs (ret, file);
 	break;
@@ -2625,7 +2625,7 @@ flags_from_code (enum rtx_code code)
     {
     case LT:
     case GE:
-      return CC_FLAG_S | CC_FLAG_O;
+      return CC_FLAG_S;
     case GT:
     case LE:
       return CC_FLAG_S | CC_FLAG_O | CC_FLAG_Z;
@@ -2666,11 +2666,14 @@ rx_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
 /* Return the minimal CC mode needed to implement (CMP_CODE X Y).  */
 
 enum machine_mode
-rx_select_cc_mode (enum rtx_code cmp_code, rtx x, rtx y ATTRIBUTE_UNUSED)
+rx_select_cc_mode (enum rtx_code cmp_code, rtx x, rtx y)
 {
   if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
     return CC_Fmode;
 
+  if (y != const0_rtx)
+    return CCmode;
+
   return mode_from_flags (flags_from_code (cmp_code));
 }
 
--
libgit2 0.26.0