Hi,

I'm working on a new target port in which there are different base
registers 
allowed depending on the offset:
r0-r7 are allowed as base register only when the offset is zero.
r6-r7 are allowed as base register for every offset.

I'm wondering if gcc is prepared for such scenario, examine the code in 
find_reloads_address(), for the architecture I'm working on, it seems
the 
condition here should be true, because it might not be valid because the
base reg isn't r6-r7, not only because the disp is too large.
Yet it fails because of REG_MODE_OK_FOR_BASE_P (XEXP (ad, 0), mode).


  /* If we have address of a stack slot but it's not valid because the
     displacement is too large, compute the sum in a register.
     Handle all base registers here, not just fp/ap/sp, because on some
     targets (namely SH) we can also get too large displacements from
     big-endian corrections.  */
  else if (GET_CODE (ad) == PLUS
         && REG_P (XEXP (ad, 0))
         && REGNO (XEXP (ad, 0)) < FIRST_PSEUDO_REGISTER
         && REG_MODE_OK_FOR_BASE_P (XEXP (ad, 0), mode)
         && GET_CODE (XEXP (ad, 1)) == CONST_INT)
    {
      /* Unshare the MEM rtx so we can safely alter it.  */
      if (memrefloc)
      {
        *memrefloc = copy_rtx (*memrefloc);
        loc = &XEXP (*memrefloc, 0);

        if (removed_and)
          loc = &XEXP (*loc, 0);
      }
...
 
Is there any way to get along by defining r0-r7 as legal base regs and
deal 
with r6-r7 in GO_IF_LEGITIMATE_ADDRESS and in the constraint
definitions, 
or am I right with my assumption that gcc doesn't support that?

Does someone knows if there's a target with a similar behavior?

Thanks in advance,

Tal Agmon.

Reply via email to