Fix scc clobber in movdi_symbol.
authorAndrew Stubbs <ams@codesourcery.com>
Wed, 27 Mar 2019 17:06:26 +0000 (17:06 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Wed, 27 Mar 2019 17:06:26 +0000 (17:06 +0000)
2019-03-27  Andrew Stubbs  <ams@codesourcery.com>

gcc/
* config/gcn/gcn.md (CC_SAVE_REG): New constant.
(movdi): Call gen_movdi_symbol_save_scc.
(gen_movdi_symbol_save_scc): New insn and split.

From-SVN: r269970

gcc/ChangeLog
gcc/config/gcn/gcn.md

index 132af149fe75508564a6c2900e9428111eee0121..8801525a06cebd609121198bfc7742247990aee6 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-27  Andrew Stubbs  <ams@codesourcery.com>
+
+       * config/gcn/gcn.md (CC_SAVE_REG): New constant.
+       (movdi): Call gen_movdi_symbol_save_scc.
+       (gen_movdi_symbol_save_scc): New insn and split.
+
 2019-03-27  Peter Bergner  <bergner@linux.ibm.com>
 
        PR rtl-optimization/89313
index 4573a4ce32f0b3982170349b7667c71c454df50a..2b805a73c5616f5626bc902346a990c60d045444 100644 (file)
@@ -24,6 +24,7 @@
 ; Named registers
 (define_constants
   [(FIRST_SGPR_REG              0)
+   (CC_SAVE_REG                         22)
    (LAST_SGPR_REG               101)
    (FLAT_SCRATCH_REG            102)
    (FLAT_SCRATCH_LO_REG                 102)
        && (GET_CODE (operands[1]) == SYMBOL_REF
            || GET_CODE (operands[1]) == LABEL_REF))
       {
-       emit_insn (gen_movdi_symbol (operands[0], operands[1]));
+       if (lra_in_progress)
+         emit_insn (gen_movdi_symbol_save_scc (operands[0], operands[1]));
+       else
+         emit_insn (gen_movdi_symbol (operands[0], operands[1]));
        DONE;
       }
   })
  [(set_attr "type" "mult")
   (set_attr "length" "32")])
 
+(define_insn_and_split "movdi_symbol_save_scc"
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=Sg")
+       (match_operand:DI 1 "general_operand" "Y"))
+  (clobber (reg:BI CC_SAVE_REG))]
+ "GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == LABEL_REF
+  && (lra_in_progress || reload_completed)"
+ "#"
+ "reload_completed"
+ [(set (reg:BI CC_SAVE_REG) (reg:BI SCC_REG))
+  (parallel [(set (match_dup 0) (match_dup 1))
+            (clobber (reg:BI SCC_REG))])
+  (set (reg:BI SCC_REG) (reg:BI CC_SAVE_REG))])
+
 (define_insn "gcn_indirect_call"
   [(call (mem (match_operand:DI 0 "register_operand" "Sg"))
         (match_operand 1 "" ""))