Фесетверн с MSVC x64 - PullRequest
       11

Фесетверн с MSVC x64

2 голосов
/ 05 июня 2010

Я портирую некоторый код на 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). Или мне придется пойти на двухнедельный обход, чтобы выучить некоторую сборку и понять, как использовать MASM? Любой совет приветствуется. Спасибо.

1 Ответ

6 голосов
/ 05 июня 2010

Библиотека времени выполнения VC ++ предоставляет эквиваленты, например, _control87, _controlfp, __control87_2 , чтобы вы могли предоставить реализацию без обращения к ассемблеру.

...