Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 429
DogDog Avatar asked Mar 08 '10 18:03

DogDog


4 Answers

I found this one by accident in the MSDN:

BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );

Windows-only, but if you are not interested in anything cross-platform, very simple.

like image 62
Timbo Avatar answered Oct 12 '22 19:10

Timbo


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;
like image 37
AshleysBrain Avatar answered Oct 12 '22 17:10

AshleysBrain


The most basic way to check for SSE2 support is by using the CPUID instruction (on platforms where it is available). Either using inline assembly or using compiler intrinsics.

like image 10
Alexander Gessler Avatar answered Oct 12 '22 19:10

Alexander Gessler


You can use the _cpuid function. All is explained in the MSDN.

like image 8
Patrice Bernassola Avatar answered Oct 12 '22 19:10

Patrice Bernassola