1

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

#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 兼容吗?

4

2 回答 2

2

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

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

为了使用_statusfp,您需要将原始 8087 标志转换为_statusfp.

更新

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

于 2012-12-28T14:32:17.450 回答
2

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

#elif 定义 _MSC_VER

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

于 2012-12-28T20:06:08.030 回答