Gcc x86程序集是否将寄存器获取为int?

Gcc x86程序集是否将寄存器获取为int?,gcc,floating-point,bit-manipulation,Gcc,Floating Point,Bit Manipulation,访问FP表示中的位的可移植方式是写入一个并集,该并集写入内存。至少,glibc就是这么做的。但是下面的代码看起来过于复杂,而且速度很慢。我想知道是否有x86指令将FP寄存器的64个可访问位复制到整数寄存器中,以便对这些位进行操作?这不是可移植的,但其想法是要有一个内联函数,每个端口都必须实现一个标准的干净(快速)例程 在本例中,我关注的是isnan,它的实现方式如下: #define EXTRACT_WORDS(ix0,ix1,d) \ do {

访问FP表示中的位的可移植方式是写入一个并集,该并集写入内存。至少,glibc就是这么做的。但是下面的代码看起来过于复杂,而且速度很慢。我想知道是否有x86指令将FP寄存器的64个可访问位复制到整数寄存器中,以便对这些位进行操作?这不是可移植的,但其想法是要有一个内联函数,每个端口都必须实现一个标准的干净(快速)例程

在本例中,我关注的是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);
}

没有x86指令将FP寄存器复制到整数寄存器,反之亦然。使用SSE instrinsics可能会得到您想要的结果,因为SSE寄存器可以同时包含整数值和浮点值。

FP寄存器的宽度为80位,因此无法放入普通寄存器中……此外,请注意,通过并集访问位肯定是不可移植的。编译器内部函数可以不受影响,因为根据定义,它们是为特定平台编写的。实际上,glibc代码是可移植的。它适用于IEEE 754数学,这是一个标准。80位硬件不是标准的,是的。我很好奇是否可以像写入内存那样提取64位。例如,IEEE-754没有指定内存中表示的endianness。是否有针对Nan和Inf等“特殊”值的硬件测试?@Dov,我不这么认为。你可以做一件事=a表示NaN和QNaN,可能直接与Inf或-Inf进行比较,但由于它们的速度可能很慢,因此您最好使用math.h中的函数。