带有 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编译器编译项目报错”编译器的堆空间不足“错误 的解决方法

关于 QtCreator使用msvc2017x64编译器编译项目报错”编译器的堆空间不足“错误 的解决方法

MSVC 的 _M_X64 预定义宏说明

QT 5.1.1:QWebview 中的复选框在 Win 7 (x64) / Win 8 下显示奇怪的行为