src/cpuinfo/SDL_cpuinfo.c
changeset 778 8ac3f46f9d09
parent 769 b8d311d90021
child 784 a2dde6aff60e
--- a/src/cpuinfo/SDL_cpuinfo.c	Tue Jan 06 17:16:02 2004 +0000
+++ b/src/cpuinfo/SDL_cpuinfo.c	Tue Jan 06 17:18:38 2004 +0000
@@ -30,10 +30,15 @@
 #include "SDL.h"
 #include "SDL_cpuinfo.h"
 
+#ifdef MACOSX
+#include <sys/sysctl.h> /* For AltiVec check */
+#endif
+
 #define CPU_HAS_RDTSC	0x00000001
 #define CPU_HAS_MMX	0x00000002
 #define CPU_HAS_3DNOW	0x00000004
 #define CPU_HAS_SSE	0x00000008
+#define CPU_HAS_ALTIVEC	0x00000010
 
 static __inline__ int CPU_haveCPUID()
 {
@@ -186,6 +191,23 @@
 	return 0;
 }
 
+static __inline__ int CPU_haveAltiVec()
+{
+#ifdef MACOSX
+	/* TODO: This check works on OS X. It would be nice to detect AltiVec
+	   properly on for example Linux/PPC, too. But I don't know how that
+	   is done in Linux (or FreeBSD, or whatever other OS you run PPC :-)
+	 */
+	int selectors[2] = { CTL_HW, HW_VECTORUNIT }; 
+	int hasVectorUnit = 0; 
+	size_t length = sizeof(hasVectorUnit); 
+	int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0); 
+	if( 0 == error )
+		return hasVectorUnit != 0; 
+#endif
+	return 0; 
+}
+
 static Uint32 SDL_CPUFeatures = 0xFFFFFFFF;
 
 static Uint32 SDL_GetCPUFeatures()
@@ -204,6 +226,9 @@
 		if ( CPU_haveSSE() ) {
 			SDL_CPUFeatures |= CPU_HAS_SSE;
 		}
+		if ( CPU_haveAltiVec() ) {
+			SDL_CPUFeatures |= CPU_HAS_ALTIVEC;
+		}
 	}
 	return SDL_CPUFeatures;
 }
@@ -240,15 +265,25 @@
 	return SDL_FALSE;
 }
 
+SDL_bool SDL_HasAltiVec()
+{
+	if ( SDL_GetCPUFeatures() & CPU_HAS_ALTIVEC ) {
+		return SDL_TRUE;
+	}
+	return SDL_FALSE;
+}
+
 #ifdef TEST_MAIN
 
 #include <stdio.h>
 
 int main()
 {
+	printf("RDTSC: %d\n", SDL_HasRDTSC());
 	printf("MMX: %d\n", SDL_HasMMX());
 	printf("3DNow: %d\n", SDL_Has3DNow());
 	printf("SSE: %d\n", SDL_HasSSE());
+	printf("AltiVec: %d\n", SDL_HasAltiVec());
 	return 0;
 }