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); }