cris: Enable "neg" to set condition codes.
authorHans-Peter Nilsson <hp@axis.com>
Thu, 6 Feb 2020 17:12:11 +0000 (18:12 +0100)
committerHans-Peter Nilsson <hp@axis.com>
Sat, 9 May 2020 02:22:20 +0000 (04:22 +0200)
While gcc seems to prefer transforming tests on the result of
reversible operations, into tests on the original, it also can
work with the destination, if allocated to the same register as
it commonly-enough is.  The re-use is easily covered in a
test-case.  (N.B.: the value 0x80000000 appears to be considered
invalid and unimportant.)  Spotted as a "microregression" in
libgcc when comparing to the cc0 version.

gcc:
* config/cris/cris.c (cris_select_cc_mode): Return CC_NZmode for
NEG too.  Correct comment.
* config/cris/cris.md ("<anz>neg<mode>2<setnz>"): Rename from
"neg<mode>2".

gcc/ChangeLog
gcc/config/cris/cris.c
gcc/config/cris/cris.md

index 8f14fdba64a73b9e3a20ec5321db152be632d082..178973f0e734673ca4eb5cbf3bf0caceeef61351 100644 (file)
        Handle output of CC_ZnNmode.
        ("*b<nzcond:code>_reversed<mode>"): Ditto.
 
+       * config/cris/cris.c (cris_select_cc_mode): Return CC_NZmode for
+       NEG too.  Correct comment.
+       * config/cris/cris.md ("<anz>neg<mode>2<setnz>"): Rename from
+       "neg<mode>2".
+
 2020-05-08  Vladimir Makarov  <vmakarov@redhat.com>
 
        * ira-color.c (update_costs_from_allocno): Remove
index d0807adc87f1801f29b1fafdb498a4c7becfe91c..2bad9393c6ed8863756627b1c67b49152364213e 100644 (file)
@@ -1531,9 +1531,9 @@ cris_select_cc_mode (enum rtx_code op, rtx x, rtx y)
     return CCmode;
 
   /* If we have a comparison that doesn't have to look at V or C, check
-     operand x; if it looks like a binary operator, return CC_NZmode,
-     else CCmode, so we only use CC_NZmode for the cases where we don't
-     actually have both V and C valid.  */
+     operand x; if it's a valid operator, return CC_NZmode, else CCmode,
+     so we only use CC_NZmode for the cases where we don't actually have
+     both V and C valid.  */
   if (op == EQ || op ==  NE || op ==  GTU || op ==  LEU
       || op ==  LT || op ==  GE)
     {
@@ -1542,7 +1542,7 @@ cris_select_cc_mode (enum rtx_code op, rtx x, rtx y)
     /* Mentioning the rtx_code here is required but not sufficient: the
        insn also needs to be decorated with <setnz> (and the
        anonymization prefix <anz> for a named pattern).  */
-      return e == PLUS || e == MINUS || e == MULT || e == NOT
+      return e == PLUS || e == MINUS || e == MULT || e == NOT || e == NEG
        ? CC_NZmode : CCmode;
     }
 
index 1e895a375c33e10b780007c8de1dbadfb4d247b2..081041fa24561af28077503746a53e9293912e5c 100644 (file)
 ;; No "negdi2" although we could make one up that may be faster than
 ;; the one in libgcc.
 
-(define_insn "neg<mode>2"
+(define_insn "<anz>neg<mode>2<setnz>"
   [(set (match_operand:BWD 0 "register_operand" "=r")
        (neg:BWD (match_operand:BWD 1 "register_operand" "r")))
    (clobber (reg:CC CRIS_CC0_REGNUM))]