This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RX: Fix LT and GE comparisons
- From: Nick Clifton <nickc at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 03 Feb 2011 11:42:10 +0000
- Subject: 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;