_control87() définit-il également le registre de contrôle SSE MXCSR ?
-
26-12-2019 - |
Question
La documentation pour _control87
Remarques:
_control87
[...] affectent les mots de contrôle pour le x87 et le SSE2, le cas échéant.
Il semble que les registres de contrôle SSE et SSE2 MXCSR soient identiques, cependant, il n'y a aucune mention de l'unité SSE dans la documentation.Fait _control87
affecter le registre de contrôle MXCSR d'une unité SSE ou est-ce uniquement vrai pour SSE2 ?
La solution
J'ai sorti un vieux Pentium III et vérifié avec le code suivant :
#include <Windows.h>
#include <float.h>
#include <xmmintrin.h>
#include <iostream>
#include <iomanip>
int _tmain( int argc, _TCHAR* argv[] ) {
using namespace std;
// Unmask all SSE/SSE2 exceptions
_MM_SET_EXCEPTION_MASK( 0 );
// Get SSE/SSE2 exception mask
DWORD dwExceptionMask = _MM_GET_EXCEPTION_MASK();
cout << "Exception Mask: 0x" << hex << setw( 8 )
<< setfill( '0' ) << dwExceptionMask << endl;
// Mask all FPU exceptions
_control87( 0xFFFF, _MCW_EM );
// Get SSE/SSE2 exception mask
dwExceptionMask = _MM_GET_EXCEPTION_MASK();
cout << "Exception Mask: 0x" << hex << setw( 8 )
<< setfill( '0' ) << dwExceptionMask << endl;
return 0;
}
Résultat sur Pentium III (SSE) :
Exception Mask: 0x00000000
Exception Mask: 0x00000000
Résultat sur Xeon (SSE, SSE2, SSE3, SSSE3) :
Exception Mask: 0x00000000
Exception Mask: 0x00001e80
Les résultats sont surprenants, mais conformes à la documentation. _control87
n'a d'effet sur le registre de contrôle MXCSR que si au moins une unité SSE2 est disponible.
Autres conseils
Un MXCSR contrôle à la fois sse et sse2 (et sse3 et ssse3 et sse4.1 et ...)