diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2020-02-02 12:57:12 +0100 |
---|---|---|
committer | Hans-Peter Nilsson <hp@axis.com> | 2020-05-09 04:14:26 +0200 |
commit | 730cafefe6b96ddacfd1c2145b39dde68bed4f4f (patch) | |
tree | fed3489dd3558feef1bf4b28b1dc2c767f3244a8 /gcc | |
parent | e561b9fe0b4b3702e18b7bf12f03b1fbe0d111b4 (diff) | |
download | gcc-730cafefe6b96ddacfd1c2145b39dde68bed4f4f.zip gcc-730cafefe6b96ddacfd1c2145b39dde68bed4f4f.tar.gz gcc-730cafefe6b96ddacfd1c2145b39dde68bed4f4f.tar.bz2 |
cris: Enable general "and", "or", "xor", "not" to set condition codes.
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".
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/config/cris/cris.md | 51 |
2 files changed, 43 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ec0852..54073e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -132,6 +132,19 @@ "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> diff --git a/gcc/config/cris/cris.md b/gcc/config/cris/cris.md index 8652f35..6faef6c 100644 --- a/gcc/config/cris/cris.md +++ b/gcc/config/cris/cris.md @@ -1419,7 +1419,7 @@ ;; 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"))) @@ -1499,10 +1499,12 @@ ;; 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 @@ -1513,14 +1515,16 @@ "" "@ andq %2,%0 + andq %2,%0 and.w %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. @@ -1568,21 +1572,23 @@ "" "") -(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 @@ -1613,7 +1619,7 @@ "" "") -(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"))) @@ -1627,9 +1633,10 @@ 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"))) @@ -1644,9 +1651,10 @@ 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"))) @@ -1660,14 +1668,15 @@ 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")]) ;; 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"))) @@ -1730,7 +1739,7 @@ ;; 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))] |