Enabled 3DNow! intrinsic support
authorSam Lantinga <slouken@libsdl.org>
Fri, 17 Aug 2007 03:22:03 +0000
changeset 2261 c20476d7d7b3
parent 2260 202ddfd1cfb1
child 2262 bee005ace1bf
Enabled 3DNow! intrinsic support
VisualC/SDL/SDL.vcproj
configure.in
src/video/SDL_blit.h
src/video/SDL_blit_A.c
--- a/VisualC/SDL/SDL.vcproj	Fri Aug 17 02:55:21 2007 +0000
+++ b/VisualC/SDL/SDL.vcproj	Fri Aug 17 03:22:03 2007 +0000
@@ -47,7 +47,7 @@
 				Name="VCCLCompilerTool"
 				Optimization="0"
 				AdditionalIncludeDirectories="..\..\include"
-				PreprocessorDefinitions="_DEBUG;_WINDOWS;_WIN32_WINNT=0x0400;__SSE__;__MMX__"
+				PreprocessorDefinitions="_DEBUG;_WINDOWS;_WIN32_WINNT=0x0400;__MMX__;__3dNOW__;__SSE__"
 				RuntimeLibrary="2"
 				BufferSecurityCheck="false"
 				UsePrecompiledHeader="0"
@@ -145,7 +145,7 @@
 				InlineFunctionExpansion="1"
 				EnableIntrinsicFunctions="false"
 				AdditionalIncludeDirectories="..\..\include"
-				PreprocessorDefinitions="NDEBUG;_WINDOWS;_WIN32_WINNT=0x0400;__SSE__;__MMX__"
+				PreprocessorDefinitions="NDEBUG;_WINDOWS;_WIN32_WINNT=0x0400;__MMX__;__3dNOW__;__SSE__"
 				StringPooling="true"
 				RuntimeLibrary="2"
 				BufferSecurityCheck="false"
--- a/configure.in	Fri Aug 17 02:55:21 2007 +0000
+++ b/configure.in	Fri Aug 17 03:22:03 2007 +0000
@@ -290,6 +290,9 @@
 
         AC_TRY_COMPILE([
         #include <mmintrin.h>
+        #ifndef __MMX__
+        #error Assembler CPP flag not enabled
+        #endif
         ],[
         ],[
         have_gcc_mmx=yes
@@ -301,6 +304,32 @@
         fi
     fi
 
+    AC_ARG_ENABLE(3dnow,
+AC_HELP_STRING([--enable-3dnow], [use MMX assembly routines [[default=yes]]]),
+                  , enable_3dnow=yes)
+    if test x$enable_3dnow = xyes; then
+        save_CFLAGS="$CFLAGS"
+        have_gcc_3dnow=no
+        AC_MSG_CHECKING(for GCC -m3dnow option)
+        amd3dnow_CFLAGS="-m3dnow"
+        CFLAGS="$save_CFLAGS $amd3dnow_CFLAGS"
+
+        AC_TRY_COMPILE([
+        #include <mm3dnow.h>
+        #ifndef __3dNOW__
+        #error Assembler CPP flag not enabled
+        #endif
+        ],[
+        ],[
+        have_gcc_3dnow=yes
+        ])
+        AC_MSG_RESULT($have_gcc_3dnow)
+
+        if test x$have_gcc_3dnow = xyes; then
+            EXTRA_CFLAGS="$EXTRA_CFLAGS $amd3dnow_CFLAGS"
+        fi
+    fi
+
     AC_ARG_ENABLE(sse,
 AC_HELP_STRING([--enable-sse], [use SSE assembly routines [[default=yes]]]),
                   , enable_sse=yes)
@@ -313,6 +342,9 @@
 
         AC_TRY_COMPILE([
         #include <xmmintrin.h>
+        #ifndef __SSE__
+        #error Assembler CPP flag not enabled
+        #endif
         ],[
         ],[
         have_gcc_sse=yes
--- a/src/video/SDL_blit.h	Fri Aug 17 02:55:21 2007 +0000
+++ b/src/video/SDL_blit.h	Fri Aug 17 03:22:03 2007 +0000
@@ -27,6 +27,9 @@
 #ifdef __MMX__
 #include <mmintrin.h>
 #endif
+#ifdef __3dNOW__
+#include <mm3dnow.h>
+#endif
 #ifdef __SSE__
 #include <xmmintrin.h>
 #endif
--- a/src/video/SDL_blit_A.c	Fri Aug 17 02:55:21 2007 +0000
+++ b/src/video/SDL_blit_A.c	Fri Aug 17 03:22:03 2007 +0000
@@ -1369,7 +1369,7 @@
     }
 }
 
-#ifdef __MMX__
+#ifdef __3dNOW__
 /* fast (as in MMX with prefetch) ARGB888->(A)RGB888 blending with pixel alpha */
 static void
 BlitRGBtoRGBPixelAlphaMMX3DNOW(SDL_BlitInfo * info)
@@ -2250,17 +2250,21 @@
             if (sf->Rmask == df->Rmask
                 && sf->Gmask == df->Gmask
                 && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) {
-#ifdef __MMX__
+#if defined(__MMX__) || defined(__3dNOW__)
                 if (sf->Rshift % 8 == 0
                     && sf->Gshift % 8 == 0
                     && sf->Bshift % 8 == 0
                     && sf->Ashift % 8 == 0 && sf->Aloss == 0) {
+#ifdef __3dNOW__
                     if (SDL_Has3DNow())
                         return BlitRGBtoRGBPixelAlphaMMX3DNOW;
+#endif
+#ifdef __MMX__
                     if (SDL_HasMMX())
                         return BlitRGBtoRGBPixelAlphaMMX;
+#endif
                 }
-#endif
+#endif /* __MMX__ || __3dNOW__ */
                 if (sf->Amask == 0xff000000) {
 #if SDL_ALTIVEC_BLITTERS
                     if (SDL_HasAltiVec())