rl78-protos.h: New function declaration rl78_split_movdi
authorSebastian Perta <sebastian.perta@renesas.com>
Mon, 22 Jan 2018 19:53:55 +0000 (19:53 +0000)
committerSebastian Perta <sebastianperta@gcc.gnu.org>
Mon, 22 Jan 2018 19:53:55 +0000 (19:53 +0000)
2018-01-22  Sebastian Perta  <sebastian.perta@renesas.com>

* config/rl78/rl78-protos.h: New function declaration rl78_split_movdi
* config/rl78/rl78.md: New define_expand "movdi"
* config/rl78/rl78.c: New function definition rl78_split_movdi

From-SVN: r256960

gcc/ChangeLog
gcc/config/rl78/rl78-protos.h
gcc/config/rl78/rl78.c
gcc/config/rl78/rl78.md

index bfcf4dada09b003ed888d8ba94b88ebf89f2b7b0..c565758523879e8a48c04027b6869afd8fa9bf70 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-22  Sebastian Perta  <sebastian.perta@renesas.com>
+
+       * config/rl78/rl78-protos.h: New function declaration rl78_split_movdi
+       * config/rl78/rl78.md: New define_expand "movdi"
+       * config/rl78/rl78.c: New function definition rl78_split_movdi
+
 2018-01-22  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/83862
index 852190f9ed6ee507db4eb8cdf5da4b11fbf12b29..a599e7e6cae289aae8ff7ccd1defcb299d605e55 100644 (file)
@@ -23,6 +23,7 @@ void          rl78_emit_eh_epilogue (rtx);
 void           rl78_expand_compare (rtx *);
 void           rl78_expand_movsi (rtx *);
 void           rl78_split_movsi (rtx *, machine_mode);
+void           rl78_split_movdi (rtx *, enum machine_mode);
 int            rl78_force_nonfar_2 (rtx *, rtx (*gen)(rtx,rtx));
 int            rl78_force_nonfar_3 (rtx *, rtx (*gen)(rtx,rtx,rtx));
 void           rl78_expand_eh_epilogue (rtx);
index 3e34a88f0b797173ee9d9562251e18c3c1df9167..6f2551cb833d0eb982f8bdef1995a04434918206 100644 (file)
@@ -598,6 +598,18 @@ rl78_split_movsi (rtx *operands, machine_mode omode)
     }
 }
 
+void
+rl78_split_movdi (rtx *operands, enum machine_mode omode)
+{
+    rtx op00, op04, op10, op14;
+    op00 = rl78_subreg (SImode, operands[0], omode, 0);
+    op04 = rl78_subreg (SImode, operands[0], omode, 4);
+    op10 = rl78_subreg (SImode, operands[1], omode, 0);
+    op14 = rl78_subreg (SImode, operands[1], omode, 4);
+    emit_insn (gen_movsi (op00, op10));
+    emit_insn (gen_movsi (op04, op14));
+}
+
 /* Used by various two-operand expanders which cannot accept all
    operands in the "far" namespace.  Force some such operands into
    registers so that each pattern has at most one far operand.  */
index 1c44e870b04d5001477d1909e7e51ea419b48b81..2b39b469ef5d59c2d8641d33fcea1cb502bdc7d5 100644 (file)
    (set_attr "is_g13_muldiv_insn" "yes")]
 )
 
+(define_expand "movdi"
+  [(set (match_operand:DI 0 "nonimmediate_operand" "")
+        (match_operand:DI 1 "general_operand"      ""))]
+  ""
+  "rl78_split_movdi(operands, DImode);
+  DONE;"
+)
+
 (define_expand "umindi3"
  [(set (match_operand:DI          0 "nonimmediate_operand" "")
        (umin:DI (match_operand:DI 1 "general_operand"      "")