Я портирую некоторый код на 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? Любой совет приветствуется. Спасибо.