x87 register clobber returns "unknown register name" error
Hadrien Grasland
hadrien.grasland@neel.cnrs.fr
Thu Oct 15 09:49:00 GMT 2015
Le 15/10/2015 11:29, Segher Boessenkool a écrit :
> I'm not sure you can clobber stack regs at all. You could add it as
> an output and just not use the result? Like
>
> asm ("fyl2xp1" : "=t" (result), "=u" (dummy) : "0" (x), "1" (y));
>
>
> Segher
Indeed, this compiles and works as intended :
float st0; // Will not be used, just a way to clobber the
floating-point stack
asm volatile ("fstps (%2)" :
"=t" (st0) :
"0" (input), "r" (output) :
"memory");
And for the code aesthetes out there, I can also think of a version that
looks better and uses less storage, at the cost of erasing input :
asm volatile ("fstps (%2)" :
"+t" (input) :
"r" (output) :
"memory");
One thing that makes me sad is that GCC might perform a useless x87
stack pop (depending on how clever its optimizer is), which can become
an issue in a performance-sensitive code path.
Another is that the documentation suggests that it is possible to
clobber stack registers (at the very bottom of
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#OutputOperands ),
whereas it seems impossible in practice. So I guess that either the
ability to clobber stack registers should be added to GCC, or the
documentation should be fixed to reflect this situation.
Hadrien
More information about the Gcc-help
mailing list