与MSVC x64相比

时间:2010-06-05 14:11:18

标签: visual-c++ floating-point 64-bit

我正在将一些代码移植到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?任何建议表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:6)

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