_control87()是否也设置了SSE MXCSR控制寄存器?

时间:2013-11-18 10:53:08

标签: visual-c++ sse msvcrt crt fpu

_control87笔记的文档:

  

_control87 [...]影响[s] x87和SSE2的控制字(如果存在)。

SSE和SSE2 MXCSR控制寄存器似乎相同,但是文档中没有提到SSE单元。 _control87是否会影响SSE单元的MXCSR控制寄存器,或者这仅适用于SSE2?

2 个答案:

答案 0 :(得分:5)

我挖出旧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

结果令人惊讶,但符合文档。如果至少有一个SSE2单元可用,则_control87仅对MXCSR控制寄存器有影响。

答案 1 :(得分:0)

一个MXCSR控制sse和sse2(以及sse3和ssse3以及sse4.1和......)