Check for altivec assembly support before trying to use it. :)
authorSam Lantinga <slouken@libsdl.org>
Thu, 29 Jan 2004 16:15:12 +0000
changeset 795 275708f2e838
parent 794 a5defa3b93e1
child 796 dec19b813b04
Check for altivec assembly support before trying to use it. :)
configure.in
src/cpuinfo/SDL_cpuinfo.c
--- a/configure.in	Thu Jan 29 16:14:09 2004 +0000
+++ b/configure.in	Thu Jan 29 16:15:12 2004 +0000
@@ -1723,15 +1723,35 @@
     fi
 }
 
+dnl Check for altivec instruction support using gas syntax
+CheckAltivec()
+{
+    AC_MSG_CHECKING(for GCC Altivec instruction support)
+    have_gcc_altivec=no
+    AC_TRY_COMPILE([
+    ],[
+        asm volatile ("mtspr 256, %0\n\t"
+                      "vand %%v0, %%v0, %%v0"
+                      :
+                      : "r" (-1));
+    ],[
+    have_gcc_altivec=yes
+    ])
+    if test x$have_gcc_altivec = xyes; then
+        CFLAGS="$CFLAGS -DGCC_ALTIVEC"
+    fi
+    AC_MSG_RESULT($have_gcc_altivec)
+}
+
 case "$target" in
     *-*-linux*|*-*-gnu*|*-*-k*bsd*-gnu)
         case "$target" in
-	  *-*-linux*) ARCH=linux ;;
-	  *-*-kfreebsd*-gnu) ARCH=kfreebsd-gnu ;;
-	  *-*-knetbsd*-gnu) ARCH=knetbsd-gnu ;;
-	  *-*-kopenbsd*-gnu) ARCH=kopenbsd-gnu ;;
-	  *-*-gnu*) ARCH=gnu ;; # must be last
-	esac
+          *-*-linux*) ARCH=linux ;;
+          *-*-kfreebsd*-gnu) ARCH=kfreebsd-gnu ;;
+          *-*-knetbsd*-gnu) ARCH=knetbsd-gnu ;;
+          *-*-kopenbsd*-gnu) ARCH=kopenbsd-gnu ;;
+          *-*-gnu*) ARCH=gnu ;; # must be last
+        esac
         CheckDummyVideo
         CheckDiskAudio
         CheckDLOPEN
@@ -1755,6 +1775,7 @@
         CheckOpenGL
         CheckInputEvents
         CheckPTHREAD
+        CheckAltivec
         # Set up files for the main() stub
         if test "x$video_qtopia" = "xyes"; then
           SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main"
--- a/src/cpuinfo/SDL_cpuinfo.c	Thu Jan 29 16:14:09 2004 +0000
+++ b/src/cpuinfo/SDL_cpuinfo.c	Thu Jan 29 16:15:12 2004 +0000
@@ -236,7 +236,7 @@
 	int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0); 
 	if( 0 == error )
 		altivec = (hasVectorUnit != 0); 
-#elseif defined(USE_SETJMP) && defined(__GNUC__) && defined(__powerpc__)
+#elif defined(USE_SETJMP) && defined(GCC_ALTIVEC)
 	void (*handler)(int sig);
 	handler = signal(SIGILL, illegal_instruction);
 	if ( setjmp(jmpbuf) == 0 ) {