代码之家  ›  专栏  ›  技术社区  ›  Dov

x86程序集以获取注册为int?

  •  0
  • Dov  · 技术社区  · 13 年前

    在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);
    }
    
    1 回复  |  直到 12 年前
        1
  •  0
  •   MSN    13 年前

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