我正在将一些代码移植到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,所以我卡住了。那里有一些代码,我可以“借”这个吗? (我花了几个小时与谷歌合作)。或者我是否需要绕行2周才能学习装配并弄清楚如何使用MASM?任何建议表示赞赏。谢谢。
答案 0 :(得分:6)
VC ++运行时库确实提供了等价物,例如_control87, _controlfp, __control87_2所以你应该能够在不诉诸汇编程序的情况下提供实现。