summaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2020-01-28 00:59:41 +0100
committerHans-Peter Nilsson <hp@axis.com>2020-05-09 03:48:52 +0200
commit12bdaa7d3e94cf30f8ce1750325a245175bdbee5 (patch)
treef943b7fe887870eb89d3e1bf05c5b06bf0072545 /gcc/config
parente49cee5c8dce341f688741e5b093f6b5560c8090 (diff)
cris.md: Post-reload, split/generate clobberless zero source moves
A separated follow-up to the previous change: Also emit moves from zero as not clobbering condition-codes. (note: actually folded into the previous ChangeLog-entry) gcc: * config/cris/cris.md ("movsi"): For a zero-source post-reload, generate a clobberless variant. ("*mov_fromzero<mode>_split"): New split. ("*mov_fromzero<mode>"): New insn.
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/cris/cris.md19
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/config/cris/cris.md b/gcc/config/cris/cris.md
index 3de2f5a136f..bf2cf966387 100644
--- a/gcc/config/cris/cris.md
+++ b/gcc/config/cris/cris.md
@@ -449,8 +449,9 @@
/* At post-reload time, we'll get here for e.g. split multi-mode insns
with a memory destination. Go directly to the clobber-less variant.
- FIXME: Also applies to zero source. */
- if (MEM_P (operands[0]) && reload_completed)
+ FIXME: Also applies to special-register source or destination. */
+ if (reload_completed
+ && (MEM_P (operands[0]) || operands[1] == const0_rtx))
{
emit_insn (gen_rtx_SET (operands[0], operands[1]));
DONE;
@@ -697,6 +698,20 @@
move %1,%0"
[(set_attr "slottable" "yes,yes,yes,no,no,no")
(set_attr "enabled" "<mov_tomem_enabled>")])
+
+(define_split ;; "*mov_fromzero<mode>_split"
+ [(set (match_operand:BWD 0 "register_operand") (const_int 0))
+ (clobber (reg:CC CRIS_CC0_REGNUM))]
+ "reload_completed
+ && REGNO(operands[0]) <= CRIS_LAST_GENERAL_REGISTER"
+ [(set (match_dup 0) (const_int 0))]
+ "")
+
+(define_insn "*mov_fromzero<mode>"
+ [(set (match_operand:BWD 0 "register_operand" "=r") (const_int 0))]
+ "reload_completed"
+ "clear<m> %0"
+ [(set_attr "slottable" "yes")])
;; Movem patterns. Primarily for use in function prologue and epilogue.
;; Unfortunately, movem stores R0 in the highest memory location, thus