[Bug rtl-optimization/44288] [Extended inline asm] wrong assembly generation on IA32
dg dot recrutement31 at gmail dot com
gcc-bugzilla@gcc.gnu.org
Thu May 27 12:22:00 GMT 2010
------- Comment #9 from dg dot recrutement31 at gmail dot com 2010-05-27 12:21 -------
(In reply to comment #7)
> You are wrong. It is user's responsibility to choose correct constraints for
> the inline assembly, the compiler doesn't try to understand what the inline
> assembly is doing or even check its semantics, all it does is perform
> replacements in it (replacing %0, %1, %2 in this case).
> Not every constraint is suitable for every use in the assembly obviously,
> otherwise we wouldn't need multiple constraints.
> The "g" constraint allows a register, immediate or memory, all must be valid in
> the instruction and it is up to the compiler which one it chooses.
> "g" constraint is usable say for mov eax, %2; which can work well with
> registers, immediates or memory. But as you use [%2] instead, memory isn't
> valid, all that is valid is either a register or register + immediate or
> register + X*register2 + immediate (the usual i?86 addressing modes).
Yes, yes, but ...
I've (naively) delete [] of deferencing :
inline T operator*(void)
{
T item;
__asm__
(
"\
.intel_syntax noprefix; \n\
mov gs, %1; \n\
mov %0, gs:%2; \n\
"
:"=q"(item)
:"r"(this->segmentSelector), "g"(this->offset)
);
return item;
}
The example works because of static parameter '&main'.
But, in some others cases, it tries to generate :
mov al, gs:eax
... Argh !!
So, the inline assembly can't fully participate to optimization.
Should be nice, if it did it.
I wonder if inline RTL would be better to use (if it was supported)
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44288
More information about the Gcc-bugs
mailing list