#include "libbmcpuid.h"
#ifdef _MSC_VER
#include <intrin.h>
#endif
unsigned BM_x86_simd(void)
{
unsigned eax, ebx, ecx, edx, flag = 0;
#ifdef _MSC_VER
int cpuid[4];
__cpuid(cpuid, 1);
eax = cpuid[0], ebx = cpuid[1], ecx = cpuid[2], edx = cpuid[3];
#else
asm volatile("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (1));
#endif
if (edx>>25&1) flag |= SIMD_SSE;
if (edx>>26&1) flag |= SIMD_SSE2;
if (ecx>>0 &1) flag |= SIMD_SSE3;
if (ecx>>19&1) flag |= SIMD_SSE4_1;
if (ecx>>20&1) flag |= SIMD_SSE4_2;
if (ecx>>28&1) flag |= SIMD_AVX;
if (ebx>>5 &1) flag |= SIMD_AVX2;
if (ebx>>16&1) flag |= SIMD_AVX512F;
return flag;
}