[patch] MIPS gas problems with gcc's explicit relocs

Paul Koning pkoning@equallogic.com
Fri Jun 4 16:37:00 GMT 2004


>>>>> "Thiemo" == Thiemo Seufer <ica2_ts@csv.ica.uni-stuttgart.de> writes:

 Thiemo> Andreas Schwab wrote:
 >> Eric Christopher <echristo@redhat.com> writes:
 >> 
 >> >> - Work around the problem by not using "m" constraints for
 >> (d)la in >> the inline assembler, that is instead of
 >> >> 
 >> >> asm("dla\t%0,%1" : "=r" (result) : "m" (foo));
 >> >> 
 >> >> something like
 >> >> 
 >> >> asm("dla\t%0,foo" : "=r" (result));
 >> >
 >> > I like this I think the most. It fits with what people are
 >> trying to do > with the la instruction, i.e. load an address for a
 >> symbol that they > know.
 >> 
 >> For "load address" and "push address" type insns there is the "p"
 >> constraint letter.  Wouldn't that be the correct constraint here?

 Thiemo> Interestingly, "p" causes this expansion:

 Thiemo> lui $2,%highest(foo) daddiu $2,$2,%higher(foo) sll $2,$2,16
 Thiemo> daddiu $2,$2,%hi(foo) dsll $2,$2,16 ld $2,%lo(foo)($2) #APP
 Thiemo> dla $2,$2 #NO_APP

 Thiemo> So the inline assembler gets a fully loaded register for it.

That sounds like a bug -- it does not match what the documentation
says it should do, and it doesn't make any real sense either.

My view is that the built-in macro stuff of the MIPS assembler is a
mistake, and the compiler should always do the job, not the
assembler, because the compiler can do it better.  So for the compiler
to expand the multiple steps needed to load an address is correct.

For example, if I use an "m" constraint, I'd expect the corresponding
%x operand to become an offset and base register pair with a valid
offset and the base register loaded with the rest of the address.

       paul


 Thiemo> Thiemo



More information about the Binutils mailing list