This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RX: Fix LT and GE comparisons


Hi Guys,

  I am checking in the patch below to fix the LT and GE comparisons on
  the RX target.  These need the Overflow bit to be valid in the
  processor status word.

  The patch fixes 27 failures in the gcc testsuite.

Cheers
  Nick

gcc/ChangeLog
2011-02-03  Nick Clifton  <nickc@redhat.com>

	* config/rx/predicates.md (rx_zs_comparison_operator): Remove
	lt and ge.
	* config/rx/rx.md (abssi2_flags): Use CC_ZSmode rather than
	CC_ZSOmode.
	* config/rx/rx.c (rx_print_operand): Use "lt" and "ge" suffixes
	instead of "n" and "pz".
	(flags_from_code): LT and GE tests need CC_FLAG_O as well as
	CC_FLAG_S.

Index: gcc/config/rx/predicates.md
===================================================================
--- gcc/config/rx/predicates.md	(revision 169784)
+++ gcc/config/rx/predicates.md	(working copy)
@@ -284,7 +284,7 @@
 )
 
 (define_predicate "rx_zs_comparison_operator"
-  (match_code "eq,ne,lt,ge")
+  (match_code "eq,ne")
 )
 
 ;; GT and LE omitted due to operand swap required.
Index: gcc/config/rx/rx.md
===================================================================
--- gcc/config/rx/rx.md	(revision 169784)
+++ gcc/config/rx/rx.md	(working copy)
@@ -797,7 +797,10 @@
    (set (reg CC_REG)
 	(compare (abs:SI (match_dup 1))
 		 (const_int 0)))]
-  "reload_completed && rx_match_ccmode (insn, CC_ZSOmode)"
+  ;; Note - although the ABS instruction does set the O bit in the processor
+  ;; status word, it does not do so in a way that is comparable with the CMP
+  ;; instruction.  Hence we use CC_ZSmode rather than CC_ZSOmode.
+  "reload_completed && rx_match_ccmode (insn, CC_ZSmode)"
   "@
   abs\t%0
   abs\t%1, %0"
Index: gcc/config/rx/rx.c
===================================================================
--- gcc/config/rx/rx.c	(revision 169784)
+++ gcc/config/rx/rx.c	(working copy)
@@ -450,10 +450,10 @@
 	    switch (code)
 	      {
 	      case LT:
-		ret = "n";
+		ret = "lt";
 		break;
 	      case GE:
-		ret = "pz";
+		ret = "ge";
 		break;
 	      case GT:
 		ret = "gt";
@@ -2625,7 +2625,7 @@
     {
     case LT:
     case GE:
-      return CC_FLAG_S;
+      return CC_FLAG_S | CC_FLAG_O;
     case GT:
     case LE:
       return CC_FLAG_S | CC_FLAG_O | CC_FLAG_Z;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]