+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
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);
}
}
+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. */
(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" "")