【发布时间】:2010-06-05 14:11:17
【问题描述】:
我正在将一些代码移植到 Windows(叹气)并且需要使用 fesetround。 MSVC 不支持 C99,因此对于 x86,我从 MinGW 复制了一个实现并对其进行了破解:
//__asm__ volatile ("fnstcw %0;": "=m" (_cw));
__asm { fnstcw _cw }
_cw &= ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO);
_cw |= mode;
//__asm__ volatile ("fldcw %0;" : : "m" (_cw));
__asm { fldcw _cw }
if (has_sse) {
unsigned int _mxcsr;
//__asm__ volatile ("stmxcsr %0" : "=m" (_mxcsr));
__asm { stmxcsr _mxcsr }
_mxcsr &= ~ 0x6000;
_mxcsr |= (mode << __MXCSR_ROUND_FLAG_SHIFT);
//__asm__ volatile ("ldmxcsr %0" : : "m" (_mxcsr));
__asm { ldmxcsr _mxcsr }
}
注释行是 gcc 的原件;取消对 msvc 的注释。这似乎有效。
但是 x64 cl.exe 不支持内联 asm,所以我被卡住了。那里有一些我可以“借用”的代码吗? (我在 Google 上花了几个小时)。还是我必须绕道 2 周来学习一些组装并弄清楚如何使用 MASM?任何建议表示赞赏。谢谢。
【问题讨论】:
标签: visual-c++ floating-point 64-bit