Mercurial > sdl-ios-xcode
changeset 5268:e1122f31fec5
Fixed SSE4 detection, and split it into SSE 4.1 and 4.2
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 11 Feb 2011 23:02:35 -0800 |
parents | b530ef003506 |
children | 7ace5f8f432f |
files | include/SDL_cpuinfo.h src/cpuinfo/SDL_cpuinfo.c test/testplatform.c |
diffstat | 3 files changed, 47 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/include/SDL_cpuinfo.h Fri Feb 11 22:37:15 2011 -0800 +++ b/include/SDL_cpuinfo.h Fri Feb 11 23:02:35 2011 -0800 @@ -85,9 +85,14 @@ extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); /** - * This function returns true if the CPU has SSE4 features. + * This function returns true if the CPU has SSE4.1 features. */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE4(void); +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); + +/** + * This function returns true if the CPU has SSE4.2 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); /* Ends C function definitions when using C++ */
--- a/src/cpuinfo/SDL_cpuinfo.c Fri Feb 11 22:37:15 2011 -0800 +++ b/src/cpuinfo/SDL_cpuinfo.c Fri Feb 11 23:02:35 2011 -0800 @@ -41,7 +41,8 @@ #define CPU_HAS_SSE 0x00000010 #define CPU_HAS_SSE2 0x00000020 #define CPU_HAS_SSE3 0x00000040 -#define CPU_HAS_SSE4 0x00000080 +#define CPU_HAS_SSE41 0x00000080 +#define CPU_HAS_SSE42 0x00000100 static __inline__ int @@ -234,15 +235,30 @@ } static __inline__ int -CPU_haveSSE4(void) +CPU_haveSSE41(void) { if (CPU_haveCPUID()) { int a, b, c, d; - cpuid(0, a, b, c, d); + cpuid(1, a, b, c, d); if (a >= 1) { cpuid(1, a, b, c, d); - return (c & 0x00000100); + return (c & 0x00080000); + } + } + return 0; +} + +static __inline__ int +CPU_haveSSE42(void) +{ + if (CPU_haveCPUID()) { + int a, b, c, d; + + cpuid(1, a, b, c, d); + if (a >= 1) { + cpuid(1, a, b, c, d); + return (c & 0x00100000); } } return 0; @@ -427,8 +443,11 @@ if (CPU_haveSSE3()) { SDL_CPUFeatures |= CPU_HAS_SSE3; } - if (CPU_haveSSE4()) { - SDL_CPUFeatures |= CPU_HAS_SSE4; + if (CPU_haveSSE41()) { + SDL_CPUFeatures |= CPU_HAS_SSE41; + } + if (CPU_haveSSE42()) { + SDL_CPUFeatures |= CPU_HAS_SSE42; } } return SDL_CPUFeatures; @@ -480,9 +499,18 @@ } SDL_bool -SDL_HasSSE4(void) +SDL_HasSSE41(void) { - if (SDL_GetCPUFeatures() & CPU_HAS_SSE4) { + if (SDL_GetCPUFeatures() & CPU_HAS_SSE41) { + return SDL_TRUE; + } + return SDL_FALSE; +} + +SDL_bool +SDL_HasSSE42(void) +{ + if (SDL_GetCPUFeatures() & CPU_HAS_SSE42) { return SDL_TRUE; } return SDL_FALSE; @@ -504,7 +532,8 @@ printf("SSE: %d\n", SDL_HasSSE()); printf("SSE2: %d\n", SDL_HasSSE2()); printf("SSE3: %d\n", SDL_HasSSE3()); - printf("SSE4: %d\n", SDL_HasSSE4()); + printf("SSE4.1: %d\n", SDL_HasSSE41()); + printf("SSE4.2: %d\n", SDL_HasSSE42()); return 0; }
--- a/test/testplatform.c Fri Feb 11 22:37:15 2011 -0800 +++ b/test/testplatform.c Fri Feb 11 23:02:35 2011 -0800 @@ -146,7 +146,8 @@ printf("SSE %s\n", SDL_HasSSE()? "detected" : "not detected"); printf("SSE2 %s\n", SDL_HasSSE2()? "detected" : "not detected"); printf("SSE3 %s\n", SDL_HasSSE3()? "detected" : "not detected"); - printf("SSE4 %s\n", SDL_HasSSE4()? "detected" : "not detected"); + printf("SSE4.1 %s\n", SDL_HasSSE41()? "detected" : "not detected"); + printf("SSE4.2 %s\n", SDL_HasSSE42()? "detected" : "not detected"); } return (0); }