2010-06-05 3 views
2

Je porte un peu de code à Windows (soupir) et besoin d'utiliser fesetround. MSVC ne supporte pas C99, donc pour x86 je copiais une implémentation de MinGW et piraté-il:fesetround avec MSVC x64

//__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 } 
} 

Les lignes sont les originaux commentées pour gcc; décommenté pour msvc. Cela semble fonctionner.

Toutefois, le x64 cl.exe ne prend pas en charge asm inline, donc je suis bloqué. Y at-il du code là-bas que je peux "emprunter" pour cela? (J'ai passé des heures avec Google). Ou devrais-je faire un détour de deux semaines pour apprendre à assembler et comprendre comment utiliser MASM? Tout conseil est apprécié. Je vous remercie.

Répondre

6

La bibliothèque d'exécution VC++ fournit des équivalents, par ex. _control87, _controlfp, __control87_2 donc vous devriez être en mesure de fournir une implémentation sans recourir à l'assembleur.

+0

Voilà le billet. Merci. –