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

Windows x64平台中具有内联asm的libsoxr未编译,windows,assembly,x86,x86-64,inline-assembly,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

我正在尝试编译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

我不知道fnstenv和fldenv是干什么的。有人可以指导我如何与x64兼容吗

假设您使用Microsoft编译器进行编译,则可以使用RTL函数而不是内联汇编

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

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

更新


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

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

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

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

更新


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

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

已定义的elif\u MSC\u版本


为您的编译器包装此代码的指令_M_X64不使用这些内联程序集版本默认较慢的代码应生效

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

已定义的elif\u MSC\u版本


为您的编译器包装此代码的指令_M_X64不使用这些内联程序集版本默认较慢的代码应生效

这些指令在x87状态下工作。Windows X64通常不使用X87浮点,而是SSE浮点指令。我使用Visual C++快照版2012。这些指令都在X87状态下工作。Windows X64通常不使用X87浮点,而是SSE浮点指令。我使用Visual C++快照版2012。问题中的两个函数是C标准的一部分?真正地标准在哪里?对不起,我不知道页码!一个快速的谷歌揭示了它有以下的参考:ISO/IEC 9899:1999 AFAIK,这些功能也在C+C++标准的更新的2011个版本中。实际上,我不必使用MS编译器。我也可以使用gcc。这是一个dll项目。我在Windows上没有gcc经验。我已经下载了MinGW64编译器。cmake和MinGW64存在问题。你有没有在64位Windows和gcc中使用过fenv.h?@Rob啊,我现在就要到了!Q中的代码是fenv.h for MSVC的实现,MSVC不是C99编译器+1问题中的两个功能是C标准的一部分?真正地标准在哪里?对不起,我不知道页码!一个快速的谷歌揭示了它有以下的参考:ISO/IEC 9899:1999 AFAIK,这些功能也在C+C++标准的更新的2011个版本中。实际上,我不必使用MS编译器。我也可以使用gcc。这是一个dll项目。我在Windows上没有gcc经验。我已经下载了MinGW64编译器。cmake和MinGW64存在问题。你有没有在64位Windows和gcc中使用过fenv.h?@Rob啊,我现在就要到了!Q中的代码是fenv.h for MSVC的实现,MSVC不是C99编译器+谢谢你的回答。我看了fnstenv,它需要28个字节的信息,但是_statusfp只返回了一个int 4字节。在代码中,他们只使用第二个16位的按位操作。你认为我需要试一试吗?因为它接受无符号整数指针。我找不到关于它需要多少字节的信息。嗯,feclearexcept允许您清除选定的异常,但_clearfp清除所有异常。我不确定MSVC RTL是否只支持清除一些异常。但只清理一些是很奇怪的。我打赌所有的电话都会被清除,现在我明白了。我可以试试看
他对结果表示怀疑。可能是因为性能原因,它们只清除了第二个16位。你觉得fnstsw怎么样?这是我可以用于相同作业的功能吗?fnstsw最多匹配_statusfp。但是你需要注意确保FE_XXX宏正确映射。谢谢,我可以用MinGW64编译器编译64位版本:谢谢你的回答。我看了fnstenv,它需要28个字节的信息,但是_statusfp只返回了一个int 4字节。在代码中,他们只使用第二个16位的按位操作。你认为我需要试一试吗?因为它接受无符号整数指针。我找不到关于它需要多少字节的信息。嗯,feclearexcept允许您清除选定的异常,但_clearfp清除所有异常。我不确定MSVC RTL是否只支持清除一些异常。但只清理一些是很奇怪的。我打赌所有的电话都会被清除,现在我明白了。我可以试试clearfp并查看结果。可能是因为性能原因,它们只清除了第二个16位。你觉得fnstsw怎么样?这是我可以用于相同作业的功能吗?fnstsw最多匹配_statusfp。但您需要注意确保FE_XXX宏正确映射。谢谢,我可以使用MinGW64编译器编译64位版本: