【问题标题】:fesetround with MSVC x64带有 MSVC x64 的 fesetround
【发布时间】: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


    【解决方案1】:

    VC++ 运行时库确实提供了等价物,例如_control87, _controlfp, __control87_2 所以你应该能够在不求助于汇编程序的情况下提供一个实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 2021-03-13
      • 2014-08-06
      • 2020-12-31
      • 2013-01-07
      相关资源
      最近更新 更多