cris.md: Post-reload, split/generate clobberless zero source moves
authorHans-Peter Nilsson <hp@axis.com>
Mon, 27 Jan 2020 23:59:41 +0000 (00:59 +0100)
committerHans-Peter Nilsson <hp@axis.com>
Sat, 9 May 2020 01:48:52 +0000 (03:48 +0200)
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.

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

index 6234bd71bdb0139047081394b94ba857128456c4..b6f7d46adeb5beb4a1fefda09c95a5703f72c81f 100644 (file)
        * config/cris/cris.h (REVERSIBLE_CC_MODE): Define to true.
 
        * config/cris/cris.md ("movsi"): For memory destination
-       post-reload, generate clobberless variant.
+       post-reload, generate clobberless variant.  Similarly for a
+       zero-source post-reload.
        ("*mov_tomem<mode>_split"): New split.
        ("*mov_tomem<mode>"): New insn.
        ("enabled", mov_tomem_enabled): Define and use to exclude "x" ->
        "Q>m" for less-than-SImode.
+       ("*mov_fromzero<mode>_split"): New split.
+       ("*mov_fromzero<mode>"): New insn.
 
 2020-05-08  Vladimir Makarov  <vmakarov@redhat.com>
 
index 3de2f5a136fd45b9cb36d69c9060ec3f6339d744..bf2cf96638766584ee172f2df21e47f615dbc5a8 100644 (file)
 
    /* 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;
    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")])
 \f
 ;; Movem patterns.  Primarily for use in function prologue and epilogue.
 ;; Unfortunately, movem stores R0 in the highest memory location, thus