-rw-r--r-- 1030 djbsort-20260210/skipcompilers/amd64+sse3+ssse3+sse41+sse42.c raw
#include <inttypes.h>
#ifdef __FILC__
#include <cpuid.h>
#include <stdfil.h>
#elif defined(_MSC_VER)
#include <immintrin.h>
#include <intrin.h>
#endif
static void cpuid0(uint32_t func,uint32_t *a,uint32_t *b,uint32_t *c,uint32_t *d)
{
#ifdef __FILC__
__get_cpuid(func,a,b,c,d);
#elif defined(_MSC_VER)
uint32_t x[4];
__cpuid(x,func);
*a = x[0];
*b = x[1];
*c = x[2];
*d = x[3];
#else
asm volatile("cpuid":"=a"(*a),"=b"(*b),"=c"(*c),"=d"(*d):"a"(func),"c"(0));
#endif
}
#define WANT_1_3 ((1<<23)|(1<<25)|(1<<26))
/* 23=mmx; 25=sse; 26=sse2 */
#define WANT_1_2 ((1<<0)|(1<<9)|(1<<19)|(1<<20))
/* 0=sse3; 9=ssse3; 19=sse41; 20=sse42 */
int supports(void)
{
uint32_t cpuidmax,id0,id1,id2;
uint32_t familymodelstepping;
uint32_t feature1,feature2,feature3;
cpuid0(0,&cpuidmax,&id0,&id1,&id2);
if (cpuidmax < 1) return 0;
cpuid0(1,&familymodelstepping,&feature1,&feature2,&feature3);
if (WANT_1_2 != (WANT_1_2 & feature2)) return 0;
if (WANT_1_3 != (WANT_1_3 & feature3)) return 0;
return 1;
}