if (can_create_pseudo_p ())
tmp_reg = gen_reg_rtx (mode);
+ HOST_WIDE_INT mid_const = 0;
+ if (TARGET_PECOFF)
+ {
+ poly_int64 offset;
+ strip_offset (imm, &offset);
+
+ HOST_WIDE_INT const_offset;
+ if (offset.is_constant (&const_offset))
+ /* Written this way for the sake of negative offsets. */
+ mid_const = const_offset / (1 << 20) * (1 << 20);
+ }
+ imm = plus_constant (mode, imm, -mid_const);
+
emit_move_insn (tmp_reg, gen_rtx_HIGH (mode, copy_rtx (imm)));
+ if (mid_const)
+ emit_set_insn (tmp_reg, plus_constant (mode, tmp_reg, mid_const));
emit_insn (gen_add_losym (dest, tmp_reg, imm));
return;
}