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


Reply via email to