在FP表示中访问位的可移植方式是写入union,union写入内存。至少,glibc就是这么做的。但是下面的代码看起来过于复杂,而且速度很慢。我想知道是否有x86指令将浮点寄存器的64个可访问位复制到整数寄存器中,以便对这些位进行操作?这是不可移植的,但其思想是有一个内联函数,每个端口都必须实现一个标准的clean(和fast)例程。
在本例中,我将看到isnan,它实现为:
#define EXTRACT_WORDS(ix0,ix1,d) \
do { \
ieee_double_shape_type ew_u; \
ew_u.value = (d); \
(ix0) = ew_u.parts.msw; \
(ix1) = ew_u.parts.lsw; \
} while (0)
int __isnan(double x)
{
int32_t hx,lx;
EXTRACT_WORDS(hx,lx,x);
hx &= 0x7fffffff;
hx |= (u_int32_t)(lx|(-lx))>>31;
hx = 0x7ff00000 - hx;
return (int)(((u_int32_t)hx)>>31);
}