From: David Miller <da...@davemloft.net>
Date: Tue, 23 Oct 2012 21:44:05 -0400 (EDT)

> The first issue sparc runs into is that it does not define it's
> extra constraints properly.  In particular 'T' and 'W' must use
> define_memory_constraint.
> 
> Otherwise the EXTRA_MEMORY_CONSTRAINT logic in process_alt_operands()
> does not trigger and we therefore cannot even load a constant into
> floating point registers properly.

Ok, the next problem we hit will be a little bit more difficult
to solve.

Sparc accepts addresses of the form:

(plus:DI (lo_sum:DI (reg/f:DI 282)
        (symbol_ref:DI ("__mf_opts") <var_decl 0xf78d74a0 __mf_opts>))
    (const_int 40 [0x28]))

These make use of Sparc's offsetable %lo() relocations.

But LRA is unable to cope with this expression when it is processed by
extract_address_regs() because when the LO_SUM is inspected
ad->disp_loc is already non-NULL triggering this assertion:

        /* If this machine only allows one register per address, it             
                        
           must be in the first operand.  */
        if (MAX_REGS_PER_ADDRESS == 1 || code == LO_SUM)
          {
=>          lra_assert (ad->disp_loc == NULL);
            ad->disp_loc = arg1_loc;
            extract_loc_address_regs (false, mode, as, arg0_loc, false, code,
                                      code1, modify_p, ad);
          }

Reply via email to