===================================================================
@@ -1793,17 +1793,14 @@
&& ((REG_P (operands[0]) && MEM_P (operands[1]))
|| (REG_P (operands[1]) && MEM_P (operands[0]))))
{
- bool load_p = REG_P (operands[0]);
+ bool load_p = arith_reg_dest (operands[0], GET_MODE (operands[0]));
rtx reg = operands[load_p ? 0 : 1];
- rtx adr = XEXP (operands[load_p ? 1 : 0], 0);
+ rtx mem = operands[load_p ? 1 : 0];
- if (REGNO (reg) >= FIRST_PSEUDO_REGISTER
- && GET_CODE (adr) == PLUS
- && REG_P (XEXP (adr, 0))
- && (REGNO (XEXP (adr, 0)) >= FIRST_PSEUDO_REGISTER)
- && CONST_INT_P (XEXP (adr, 1))
- && INTVAL (XEXP (adr, 1)) != 0
- && sh_legitimate_index_p (mode, XEXP (adr, 1), false, true))
+ if (displacement_mem_operand (mem, mode)
+ && sh_disp_addr_displacement (mem) > 0
+ && REGNO (reg) != R0_REG
+ && !refers_to_regno_p (R0_REG, R0_REG + 1, mem, NULL))
{
rtx r0_rtx = gen_rtx_REG (mode, R0_REG);
emit_move_insn (r0_rtx, operands[1]);