我正在尝试编译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兼容吗?
答案 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)的此代码包装为不使用这些内联汇编版本 - 默认(较慢)代码应该生效。