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.