-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; }