具有内联asm的Windows x64平台中的libsoxr未编译

时间:2012-12-28 10:52:54

标签: windows assembly x86 x86-64 inline-assembly

我正在尝试编译libsoxr(它来自Audacity团队的libsox库)库。我可以编译osx 32,osx 64和win32。他们使用内联asm和Windows x64平台不支持内联asm。有问题的代码是:

#if HAVE_FENV_H
  #include <fenv.h>
#elif defined _MSC_VER
  #define FE_INVALID    1
  #define FE_DIVBYZERO  4
  #define FE_OVERFLOW   8
  #define FE_UNDERFLOW  16
  #define FE_INEXACT    32
  #define FE_ALL_EXCEPT (FE_INEXACT|FE_DIVBYZERO|FE_UNDERFLOW|FE_OVERFLOW|FE_INVALID)
  static __inline int fetestexcept(int excepts)
  {
    short status_word;
    __asm fnstsw status_word
    return status_word & excepts & FE_ALL_EXCEPT;
  }

  static __inline int feclearexcept(int excepts)
  {
    int16_t status[14];
    __asm fnstenv status
    status[2] &= ~(excepts & FE_ALL_EXCEPT);
    __asm fldenv status
    return 0;
  }
#endif

我不知道fnstenvfldenv做了什么。有人可以指导我与x64兼容吗?

2 个答案:

答案 0 :(得分:2)

假设您正在使用Microsoft编译器进行编译,那么您可以使用RTL函数而不是内联汇编。

要测试特定的浮点状态标志,请调用_statusfp。要清除浮点状态标志,请调用_clearfp

为了使用_statusfp,您需要将原始8087标志转换为_statusfp使用的抽象标志。

<强>更新

问题中的代码是fenv.h的一小部分的实现,它是C99的一部分。它是MS编译器所必需的,因为它只实现了C89。在我看来,使用真正的C99编译器会好得多。这将伴随fenv.h的实现。

答案 1 :(得分:2)

这两个功能是C标准的一部分,所以我怀疑这是第一次有人想要它们用于MSVC - 看看其他项目做了什么。如果没有任何问题,并且您想要一个快速简便的解决方案,那么您应该能够进一步获得

的资格

#elif定义_MSC_VER

指令将编译器(_M_X64)的此代码包装为不使用这些内联汇编版本 - 默认(较慢)代码应该生效。