@@ -245,7 +245,9 @@ void aarch64_simd_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
/* Emit code for reinterprets. */
void aarch64_simd_reinterpret (rtx, rtx);
-void aarch64_split_doubleword_move (rtx, rtx);
+void aarch64_split_128bit_move (rtx, rtx);
+
+bool aarch64_split_128bit_move_p (rtx, rtx);
#if defined (RTX_CODE)
@@ -537,7 +537,7 @@ aarch64_emit_move (rtx dest, rtx src)
}
void
-aarch64_split_doubleword_move (rtx dst, rtx src)
+aarch64_split_128bit_move (rtx dst, rtx src)
{
rtx low_dst;
@@ -569,7 +569,7 @@ aarch64_split_doubleword_move (rtx dst, rtx src)
}
/* Fall through to r -> r cases. */
}
-
+
low_dst = gen_lowpart (word_mode, dst);
if (REG_P (low_dst)
&& reg_overlap_mentioned_p (low_dst, src))
@@ -586,6 +586,13 @@ aarch64_split_doubleword_move (rtx dst, rtx src)
}
}
+bool
+aarch64_split_128bit_move_p (rtx dst, rtx src)
+{
+ return (! REG_P (src)
+ || ! (FP_REGNUM_P (REGNO (dst)) && FP_REGNUM_P (REGNO (src))));
+}
+
static rtx
aarch64_force_temporary (rtx x, rtx value)
{
@@ -947,10 +947,10 @@
(define_split
[(set (match_operand:TI 0 "register_operand" "")
(match_operand:TI 1 "aarch64_reg_or_imm" ""))]
- "reload_completed"
+ "reload_completed && aarch64_split_128bit_move_p (operands[0], operands[1])"
[(const_int 0)]
{
- aarch64_split_doubleword_move (operands[0], operands[1]);
+ aarch64_split_128bit_move (operands[0], operands[1]);
DONE;
})
--
1.7.12.rc0.22.gcdd159b