cris: Enable general "and", "or", "xor", "not" to set condition codes.
authorHans-Peter Nilsson <hp@axis.com>
Sun, 2 Feb 2020 11:57:12 +0000 (12:57 +0100)
committerHans-Peter Nilsson <hp@axis.com>
Sat, 9 May 2020 02:14:26 +0000 (04:14 +0200)
Enabling dropping of compares with zero of the result, through
any CCmode substitution.  Beware that this will cause
size-suboptimal operands to appear for e.g. 32-bit "and":
-65536, -256, 255, 65535; for 16-bit "and" -256, -31..-1, 255;
for 8-bit "and" -31..-1.  Fixed for 0..31 for 16- and 8-bit
sizes as it seemed worthwhile and used in libgcc.

gcc:
* config/cris/cris.md ("*expanded_andsi<setcc><setnz><setnzvc>"):
Rename from "*expanded_andsi".
("*iorsi3<setcc><setnz><setnzvc>"): Similar from "*iorsi3".
Decorate "cc" attribute to make "cc<cccc><ccnz><ccnzvc>".
("*iorhi3<setcc><setnz><setnzvc>"): Similar from "*iorhi3".
("*iorqi3<setcc><setnz><setnzvc>"): Similar from "*iorqi3".
("*expanded_andhi<setcc><setnz><setnzvc>"): Similar from
"*expanded_andhi".  Add quick cc-setting alternative for 0..31.
("*andqi3<setcc><setnz><setnzvc>"): Similar from "*andqi3".
("<acc><anz><anzvc>xorsi3<setcc><setnz><setnzvc>"): Rename
from "xorsi3".
("<acc><anz><anzvc>one_cmplsi2<setcc><setnz><setnzvc>"): Rename
from "one_cmplsi2".

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

index 9ec085218af9f054b0923ebbc7926283f748a835..54073e2749d1d42b6e24d27d698adb7e4184890b 100644 (file)
        "cc" attribute to "cc<ccnz>".
        ("*addqi3<setnz>"): Similarly from "*addqi3".
        ("*sub<mode>3<setnz>"): Similarly from "*sub<mode>3".
+       ("*expanded_andsi<setcc><setnz><setnzvc>"): Rename from
+       "*expanded_andsi".
+       ("*iorsi3<setcc><setnz><setnzvc>"): Similar from "*iorsi3".
+       Decorate "cc" attribute to make "cc<cccc><ccnz><ccnzvc>".
+       ("*iorhi3<setcc><setnz><setnzvc>"): Similar from "*iorhi3".
+       ("*iorqi3<setcc><setnz><setnzvc>"): Similar from "*iorqi3".
+       ("*expanded_andhi<setcc><setnz><setnzvc>"): Similar from
+       "*expanded_andhi".  Add quick cc-setting alternative for 0..31.
+       ("*andqi3<setcc><setnz><setnzvc>"): Similar from "*andqi3".
+       ("<acc><anz><anzvc>xorsi3<setcc><setnz><setnzvc>"): Rename
+       from "xorsi3".
+       ("<acc><anz><anzvc>one_cmplsi2<setcc><setnz><setnzvc>"): Rename
+       from "one_cmplsi2".
 
 2020-05-08  Vladimir Makarov  <vmakarov@redhat.com>
 
index 8652f358630c38d1afaad1c599f62679000c2cfc..6faef6cda0279fe6ddbc0140bbfbdea203eaed2c 100644 (file)
 ;; pressure (worse code).  That will hopefully change with an
 ;; improved reload pass.
 
-(define_insn "*expanded_andsi"
+(define_insn "*expanded_andsi<setcc><setnz><setnzvc>"
   [(set (match_operand:SI 0 "register_operand"        "=r,r,r, r,r")
        (and:SI (match_operand:SI 1 "register_operand" "%0,0,0, 0,r")
                (match_operand:SI 2 "general_operand"   "I,r,Q>,g,!To")))
 
 ;; Catch-all andhi3 pattern.
 
-(define_insn "*expanded_andhi"
-  [(set (match_operand:HI 0 "register_operand"        "=r,r,r, r,r,r,r")
-       (and:HI (match_operand:HI 1 "register_operand" "%0,0,0, 0,0,0,r")
-               (match_operand:HI 2 "general_operand"   "I,r,Q>,L,O,g,!To")))
+(define_insn "*expanded_andhi<setcc><setnz><setnzvc>"
+  [(set (match_operand:HI 0 "register_operand"        "=r,r, r,r, r,r,r,r")
+       (and:HI (match_operand:HI 1 "register_operand" "%0,0, 0,0, 0,0,0,r")
+               (match_operand:HI 2 "general_operand"   "I,Kc,r,Q>,L,O,g,!To")))
+               ;; The "Kc" alternative above, is there to match for cmpelim;
+               ;; it will be dominated by the "I" alternative at other times.
    (clobber (reg:CC CRIS_CC0_REGNUM))]
 
 ;; Sidenote: the tightening from "general_operand" to
 
   ""
   "@
+   andq %2,%0
    andq %2,%0
    and.w %2,%0
    and.w %2,%0
    anDq %b2,%0
    and.w %2,%0
    and.w %2,%1,%0"
-  [(set_attr "slottable" "yes,yes,yes,no,yes,no,no")
-   (set_attr "cc" "clobber,normal,normal,normal,clobber,normal,normal")])
+  [(set_attr "slottable" "yes,yes,yes,yes,no,yes,no,no")
+   (set_attr "cc<cccc><ccnz><ccnzvc>"
+            "clobber,normal,normal,normal,normal,clobber,normal,normal")])
 
 ;; A strict_low_part pattern.
 
   ""
   "")
 
-(define_insn "*andqi3"
-  [(set (match_operand:QI 0 "register_operand"        "=r,r,r, r,r,r")
-       (and:QI (match_operand:QI 1 "register_operand" "%0,0,0, 0,0,r")
-               (match_operand:QI 2 "general_operand"   "I,r,Q>,O,g,!To")))
+(define_insn "*andqi3<setcc><setnz><setnzvc>"
+  [(set (match_operand:QI 0 "register_operand"        "=r,r, r,r, r,r,r")
+       (and:QI (match_operand:QI 1 "register_operand" "%0,0, 0,0, 0,0,r")
+               (match_operand:QI 2 "general_operand"   "I,Kc,r,Q>,O,g,!To")))
    (clobber (reg:CC CRIS_CC0_REGNUM))]
   ""
   "@
+   andq %2,%0
    andq %2,%0
    and.b %2,%0
    and.b %2,%0
    andQ %b2,%0
    and.b %2,%0
    and.b %2,%1,%0"
-  [(set_attr "slottable" "yes,yes,yes,yes,no,no")
-   (set_attr "cc" "clobber,normal,normal,clobber,normal,normal")])
+  [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no")
+   (set_attr "cc<cccc><ccnz><ccnzvc>"
+            "clobber,normal,normal,normal,clobber,normal,normal")])
 
 (define_insn "*andqi_lowpart"
   [(set (strict_low_part
   ""
   "")
 
-(define_insn "*iorsi3"
+(define_insn "*iorsi3<setcc><setnz><setnzvc>"
   [(set (match_operand:SI 0 "register_operand"        "=r,r,r, r,r,r")
        (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0, 0,0,r")
                (match_operand:SI 2 "general_operand"  "I, r,Q>,n,g,!To")))
    or.d %2,%0
    or.d %2,%1,%0"
   [(set_attr "slottable" "yes,yes,yes,no,no,no")
-   (set_attr "cc" "normal,normal,normal,clobber,normal,normal")])
+   (set_attr "cc<cccc><ccnz><ccnzvc>"
+            "normal,normal,normal,clobber,normal,normal")])
 
-(define_insn "*iorhi3"
+(define_insn "*iorhi3<setcc><setnz><setnzvc>"
   [(set (match_operand:HI 0 "register_operand"        "=r,r,r, r,r,r,r")
        (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0, 0,0,0,r")
                (match_operand:HI 2 "general_operand"   "I,r,Q>,L,O,g,!To")))
    or.w %2,%0
    or.w %2,%1,%0"
   [(set_attr "slottable" "yes,yes,yes,no,yes,no,no")
-   (set_attr "cc" "clobber,normal,normal,normal,clobber,normal,normal")])
+   (set_attr "cc<cccc><ccnz><ccnzvc>"
+            "clobber,normal,normal,normal,clobber,normal,normal")])
 
-(define_insn "*iorqi3"
+(define_insn "*iorqi3<setcc><setnz><setnzvc>"
   [(set (match_operand:QI 0 "register_operand"        "=r,r,r, r,r,r")
        (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0, 0,0,r")
                (match_operand:QI 2 "general_operand"   "I,r,Q>,O,g,!To")))
    or.b %2,%0
    or.b %2,%1,%0"
   [(set_attr "slottable" "yes,yes,yes,yes,no,no")
-   (set_attr "cc" "clobber,normal,normal,clobber,normal,normal")])
+   (set_attr "cc<cccc><ccnz><ccnzvc>"
+            "clobber,normal,normal,clobber,normal,normal")])
 \f
 ;; Exclusive-or
 
 ;; See comment about "anddi3" for xordi3 - no need for such a pattern.
 ;; FIXME: Do we really need the shorter variants?
 
-(define_insn "xorsi3"
+(define_insn "<acc><anz><anzvc>xorsi3<setcc><setnz><setnzvc>"
   [(set (match_operand:SI 0 "register_operand" "=r")
        (xor:SI (match_operand:SI 1 "register_operand" "%0")
                (match_operand:SI 2 "register_operand" "r")))
 ;; See comment on anddi3 - no need for a DImode pattern.
 ;; See also xor comment.
 
-(define_insn "one_cmplsi2"
+(define_insn "<acc><anz><anzvc>one_cmplsi2<setcc><setnz><setnzvc>"
   [(set (match_operand:SI 0 "register_operand" "=r")
        (not:SI (match_operand:SI 1 "register_operand" "0")))
    (clobber (reg:CC CRIS_CC0_REGNUM))]