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

Reply via email to