PATCH: Update sysdeps/x86_64/fpu_control.h
H.J. Lu
hjl.tools@gmail.com
Mon Jun 18 13:16:00 GMT 2012
On Sun, Jun 17, 2012 at 1:38 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sun, Jun 17, 2012 at 1:11 PM, Roland McGrath <roland@hack.frob.com> wrote:
>>> +/* Macros for accessing the hardware control word.
>>> +
>>> + Note that the use of these macros is no sufficient anymore with
>>
>> "not sufficient"
>
> Fixed.
>
>>> + recent hardware. Some floating point operations are executed in
>>> + the SSE/SSE2 engines which have their own control and status register. */
>>> +#define _FPU_GETCW(cw) __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw))
>>> +#define _FPU_SETCW(cw) __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw))
>>
>> Why *&? That seems like a no-op. There should be a comment explaining the
>
> "*&" was added by Ulrich on Aug 26, 1996, I couldn't find anything beyond
> that. It could be a workaround for a compiler bug.
>
For GCC 4.6,
[hjl@gnu-6 tmp]$ cat x.c
#include <fpu_control.h>
void
foo ()
{
_FPU_SETCW (0x200);
}
[hjl@gnu-6 tmp]$
("fldcw %0" : : "m" (*&cw))
gives:
[hjl@gnu-6 tmp]$ gcc -S x.c
x.c: In function \u2018foo\u2019:
x.c:6:3: error: lvalue required as unary \u2018&\u2019 operand
x.c:6:3: error: memory input 0 is not directly addressable
[hjl@gnu-6 tmp]$
and
("fldcw %0" : : "m" (cw))
gives
[hjl@gnu-6 tmp]$ gcc -S x.c
x.c: In function \u2018foo\u2019:
x.c:6:3: error: memory input 0 is not directly addressable
[hjl@gnu-6 tmp]$
The older compilers may behave differently.
--
H.J.
More information about the Libc-alpha
mailing list