@@ -18342,6 +18342,23 @@ ix86_split_lea_for_addr (rtx insn, rtx operands[], enum machine_mode mode)
}
else
{
+ if (mode != GET_MODE (operands[0]))
+ {
+ gcc_assert (mode == SImode && GET_MODE (operands[0]) == DImode);
+ if ((!parts.disp || parts.disp == const0_rtx)
+ && ((parts.base && !parts.index)
+ || (!parts.base && parts.index)))
+ {
+ if (parts.base)
+ emit_insn (gen_zero_extendsidi2 (operands[0],
+ parts.base));
+ else
+ emit_insn (gen_zero_extendsidi2 (operands[0],
+ parts.index));
+ return;
+ }
+ }
+
if (!parts.base)
{
if (regno0 != regno2)
@@ -18375,7 +18392,7 @@ ix86_split_lea_for_addr (rtx insn, rtx operands[], enum machine_mode mode)
ix86_emit_binop (PLUS, mode, target, parts.disp);
ix86_emit_binop (PLUS, mode, target, tmp1);
- return;
+ goto check_mode;
}
ix86_emit_binop (PLUS, mode, target, tmp);
@@ -18384,6 +18401,13 @@ ix86_split_lea_for_addr (rtx insn, rtx operands[], enum machine_mode mode)
if (parts.disp && parts.disp != const0_rtx)
ix86_emit_binop (PLUS, mode, target, parts.disp);
}
+
+check_mode:
+ if (mode != GET_MODE (operands[0]))
+ {
+ gcc_assert (mode == SImode && GET_MODE (operands[0]) == DImode);
+ emit_insn (gen_zero_extendsidi2 (operands[0], target));
+ }
}
/* Return true if it is ok to optimize an ADD operation to LEA