On 01/08/2010 16:26, Gabor Kerenyi wrote:
> I'm porting GCC 4.4.4 to a new arch and while cross-compiling libgcc I get
> the
> following error:
> ../../../libgcc/../gcc/libgcc2.c: In function ‘__clzsi2’:
> ../../../libgcc/../gcc/libgcc2.c:716: error: unrecognizable insn:
> (insn 49 48 50 16 ../../../libgcc/../gcc/libgcc2.c:713 (set (reg:QI 25)
> (mem/s/u/j:QI (plus:SI (reg/f:SI 22)
> (reg:SI 23)) [0 __clz_tab S1 A8])) -1 (nil))
> ../../../libgcc/../gcc/libgcc2.c:716: internal compiler error: in
> extract_insn, at recog.c:2048
> Please submit a full bug report,
>
> If I understand correctly it complains about a move instruction where src
> memory location should be (reg22+reg23). My arch defines:
> #define MAX_REGS_PER_ADDRESS 1
> the first pseudo reg is 13
>
> So I don't really understand why it tries to use such a pattern.
I think the wording of the second sentence in the M_R_P_A documentation
(beginning 'Note that ...'):
-- Macro: MAX_REGS_PER_ADDRESS
A number, the maximum number of registers that can appear in a
valid memory address. Note that it is up to you to specify a
value equal to the maximum number that
`TARGET_LEGITIMATE_ADDRESS_P' would ever accept.
... is meant to imply that you /also/ need to reject such address patterns in
TARGET_LEGITIMATE_ADDRESS_P, i.e. M_R_P_A only /informs/ the compiler of the
most registers that will be in any address that T_L_A_P ends up accepting, it
doesn't set a limit on what the compiler will ask T_L_A_P to decide if it's ok
or not.
cheers,
DaveK