This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: [patch] MIPS gas problems with gcc's explicit relocs
>>>>> "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