On 10/30/2017 09:09 PM, Daniel Santos wrote:
> 3. Modify choose_baseaddr to take an optional scratch_regno argument
> and never return rtx that cannot be used as an immediate.
I should amend this, it actually does a gcc_assert, so that won't happen
if --enable-checking=no, but it would still fail later in expand.
> static rtx
> -choose_baseaddr (HOST_WIDE_INT cfa_offset, unsigned int *align)
> +choose_baseaddr (HOST_WIDE_INT cfa_offset, unsigned int *align,
> + int scratch_regno = -1)
> {
> rtx base_reg = NULL;
> HOST_WIDE_INT base_offset = 0;
> @@ -11534,6 +11535,28 @@ choose_baseaddr (HOST_WIDE_INT cfa_offset, unsigned
> int *align)
> choose_basereg (cfa_offset, base_reg, base_offset, 0, align);
>
> gcc_assert (base_reg != NULL);
> +
> + if (TARGET_64BIT)
> + {
> + rtx base_offset_rtx = GEN_INT (base_offset);
> +
> + if (scratch_regno >= 0)
> + {
> + if (!x86_64_immediate_operand (base_offset_rtx, DImode))
> + {
> + rtx tmp;
> + rtx scratch_reg = gen_rtx_REG (DImode, scratch_regno);
> +
> + emit_insn (gen_rtx_SET (scratch_reg, base_offset_rtx));
> + tmp = gen_rtx_PLUS (DImode, scratch_reg, base_reg);
> + emit_insn (gen_rtx_SET (scratch_reg, tmp));
> + return scratch_reg;
> + }
> + }
> + else
> + gcc_assert (x86_64_immediate_operand (base_offset_rtx, DImode));
> + }
> +
> return plus_constant (Pmode, base_reg, base_offset);
> }
Daniel