On 9/10/07, Rask Ingemann Lambertsen <[EMAIL PROTECTED]> wrote:
>    It would help a lot if you post your GO_IF_LEGITIMATE_ADDRESS.

It's really very basic:

# define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
    { if (legitimate_address_p (MODE, X, true)) goto ADDR; }

and in the .c-file:

bool
legitimate_address_p (enum machine_mode mode, rtx addr, bool strict
ATTRIBUTE_UNUSED)
{
  return (legitimate_offset_address_p (mode, addr)
          || legitimate_nonoffset_address_p (mode, addr));
}

static bool
legitimate_nonoffset_address_p (enum machine_mode mode
ATTRIBUTE_UNUSED, rtx addr)
{
  return (GET_CODE (addr) == REG && REG_OK_FOR_BASE_P (addr));
}

static bool
legitimate_offset_address_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx addr)
{
  rtx reg, offset;

  if (GET_CODE (addr) != PLUS)
    return false;

  reg = XEXP (addr, 0);
  offset = XEXP (addr, 1);

  if ((GET_CODE (reg) == REG && REG_OK_FOR_BASE_P (reg))
      && legitimate_address_integer_p (offset, 0))
    return true;

  return false;
}

static bool
legitimate_address_integer_p (rtx addr, int offset ATTRIBUTE_UNUSED)
{
  return (GET_CODE (addr) == CONST_INT
          && SMALL_INT (INTVAL (addr));
}

/Tomas

Reply via email to