Search code examples
c++windowswindows-xpsse2

Determine processor support for SSE2?


I need to do determine processor support for SSE2 prior installing a software. From what I understand, I came up with this:

bool TestSSE2(char * szErrorMsg)
{
    __try 
    {
        __asm 
        {
              xorpd xmm0, xmm0        // executing SSE2 instruction
        }
    }
        #pragma warning (suppress: 6320)
        __except (EXCEPTION_EXECUTE_HANDLER) 
        {
            if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) 
            {
                _tcscpy_s(szErrorMsg,MSGSIZE, _T("Streaming SIMD Extensions 2(SSE2) is not supported by the CPU.\r\n Unable to launch APP"));
                return false;

            }
        _tcscpy_s(szErrorMsg,MSGSIZE, _T("Streaming SIMD Extensions 2(SSE2) is not supported by the CPU.\r\n Unable to launch APP"));
        return false;
        }   
    return true;
}

Would this work? I'm not really sure how to test, since my CPU supports it, so I don't get false from the function call.

How do I determine processor support for SSE2?


Solution

  • Call CPUID with eax = 1 to load the feature flags in to edx. Bit 26 is set if SSE2 is available. Some code for demonstration purposes, using MSVC++ inline assembly (only for x86 and not portable!):

    inline unsigned int get_cpu_feature_flags()
    {
        unsigned int features;
    
        __asm
        {
            // Save registers
            push    eax
            push    ebx
            push    ecx
            push    edx
    
            // Get the feature flags (eax=1) from edx
            mov     eax, 1
            cpuid
            mov     features, edx
    
            // Restore registers
            pop     edx
            pop     ecx
            pop     ebx
            pop     eax
        }
    
        return features;
    }
    
    // Bit 26 for SSE2 support
    static const bool cpu_supports_sse2 = (cpu_feature_flags & 0x04000000)!=0;