From: David Miller <[email protected]>
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);
}