注释的文档_control87
:
_control87
[...] 影响 x87 和 SSE2 的控制字(如果存在)。
看起来 SSE 和 SSE2 MXCSR 控制寄存器是相同的,但是,文档中没有提到 SSE 单元。是否_control87
会影响 SSE 单元的 MXCSR 控制寄存器,还是仅适用于 SSE2?
注释的文档_control87
:
_control87
[...] 影响 x87 和 SSE2 的控制字(如果存在)。
看起来 SSE 和 SSE2 MXCSR 控制寄存器是相同的,但是,文档中没有提到 SSE 单元。是否_control87
会影响 SSE 单元的 MXCSR 控制寄存器,还是仅适用于 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 控制寄存器产生影响。
一个 MXCSR 控制 sse 和 sse2(以及 sse3 和 ssse3 以及 sse4.1 和 ...)