带有 MSVC x64 的 fesetround
Posted
技术标签:
【中文标题】带有 MSVC x64 的 fesetround【英文标题】:fesetround with MSVC x64 【发布时间】: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?任何建议表示赞赏。谢谢。
【问题讨论】:
【参考方案1】:VC++ 运行时库确实提供了等价物,例如_control87, _controlfp, __control87_2 所以你应该能够在不求助于汇编程序的情况下提供一个实现。
【讨论】:
以上是关于带有 MSVC x64 的 fesetround的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Windows7x64 (MSVC) 和 Linux64 (GCC4.8.2) 的 .cu 文件 (CUDA5.5) 中使用 C++11 吗?
Hdf5开发笔记:hdf5介绍,在windows上编译msvc2015x64版本
关于 QtCreator使用msvc2017x64编译器编译项目报错”编译器的堆空间不足“错误 的解决方法