_control87
メモのドキュメント:
_control87
[...] 存在する場合、x87 と SSE2 の両方の制御ワードに影響します。
SSE と SSE2 の MXCSR 制御レジスタは同一のようですが、ドキュメントには SSE ユニットについての言及はありません。SSE ユニットの MXCSR 制御レジスタに影響しますか_control87
、それとも SSE2 にのみ当てはまりますか?
_control87
メモのドキュメント:
_control87
[...] 存在する場合、x87 と SSE2 の両方の制御ワードに影響します。
SSE と SSE2 の MXCSR 制御レジスタは同一のようですが、ドキュメントには SSE ユニットについての言及はありません。SSE ユニットの MXCSR 制御レジスタに影響しますか_control87
、それとも SSE2 にのみ当てはまりますか?
古い Pentium III を掘り出し、次のコードで確認しました。
#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;
}
Pentium III (SSE) での結果:
Exception Mask: 0x00000000
Exception Mask: 0x00000000
Xeon での結果 (SSE、SSE2、SSE3、SSSE3):
Exception Mask: 0x00000000
Exception Mask: 0x00001e80
結果は驚くべきものですが、ドキュメントと一致しています。_control87
少なくとも SSE2 ユニットが利用可能な場合にのみ、MXCSR 制御レジスタに影響を与えます。