aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2020-02-02 12:57:12 +0100
committerHans-Peter Nilsson <hp@axis.com>2020-05-09 04:14:26 +0200
commit730cafefe6b96ddacfd1c2145b39dde68bed4f4f (patch)
treefed3489dd3558feef1bf4b28b1dc2c767f3244a8 /gcc
parente561b9fe0b4b3702e18b7bf12f03b1fbe0d111b4 (diff)
downloadgcc-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/ChangeLog13
-rw-r--r--gcc/config/cris/cris.md51
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))]