@@ -29346,7 +29673,7 @@ x86_output_mi_thunk (FILE *file,
/* Adjust the this parameter by a value stored in the vtable. */
if (vcall_offset)
{
- rtx vcall_addr, vcall_mem;
+ rtx vcall_addr, vcall_mem, this_mem;
unsigned int tmp_regno;
if (TARGET_64BIT)
@@ -29361,7 +29688,10 @@ x86_output_mi_thunk (FILE *file,
}
tmp = gen_rtx_REG (Pmode, tmp_regno);
- emit_move_insn (tmp, gen_rtx_MEM (ptr_mode, this_reg));
+ this_mem = gen_rtx_MEM (ptr_mode, this_reg);
+ if (Pmode == DImode && ptr_mode == SImode)
+ this_mem = gen_rtx_ZERO_EXTEND (DImode, this_mem);
+ emit_move_insn (tmp, this_mem);
/* Adjust the this parameter. */
vcall_addr = plus_constant (tmp, vcall_offset);
@@ -29373,8 +29703,13 @@ x86_output_mi_thunk (FILE *file,
vcall_addr = gen_rtx_PLUS (Pmode, tmp, tmp2);
}
- vcall_mem = gen_rtx_MEM (Pmode, vcall_addr);
- emit_insn (ix86_gen_add3 (this_reg, this_reg, vcall_mem));
+ vcall_mem = gen_rtx_MEM (ptr_mode, vcall_addr);
+ if (Pmode == DImode && ptr_mode == SImode)
+ emit_insn (gen_addsi_1_zext (this_reg,
+ gen_rtx_REG (SImode, REGNO (this_reg)),
+ vcall_mem));
+ else
+ emit_insn (ix86_gen_add3 (this_reg, this_reg, vcall_mem));
}
/* If necessary, drop THIS back to its stack slot. */
@@ -5508,11 +5574,11 @@
;; operands so proper swapping will be done in reload. This allow
;; patterns constructed from addsi_1 to match.
-(define_insn "*addsi_1_zext"
+(define_insn "addsi_1_zext"
[(set (match_operand:DI 0 "register_operand" "=r,r,r")
(zero_extend:DI
(plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,r,r")
(match_operand:SI 2 "general_operand" "g,0,li"))))
(clobber (reg:CC FLAGS_REG))]
"TARGET_64BIT && ix86_binary_operator_ok (PLUS, SImode, operands)"
{