Date: Tue, 30 Mar 2004 21:26:47 -0600
authorSam Lantinga <slouken@libsdl.org>
Sun, 11 Apr 2004 19:47:28 +0000
changeset 880 9ef41050100c
parent 879 2bacec7930b1
child 881 9eb85a211abd
Date: Tue, 30 Mar 2004 21:26:47 -0600 From: Tyler Montbriand Subject: [SDL] Opteron MMX patches for SDL_blit.c and SDL_blit_A.c The inline MMX assembly in SDL_blit.c and SDL_blit_A.c compiles and runs fine unmodified under AMD Opteron. The inline assembly in SDL_yuv_mmx.c and SDL_blit_N.c unfortunately isn't directly compatible. I've included diffs from SDL_blit.c and SDL_blit_A.c that allow the MMX assembly to be compiled when USE_ASMBLIT, __x86_64__, and __GNUC__ are all defined. All I had to modify was typedefs, the inline assembly itself wasn't touched.
src/video/SDL_RLEaccel.c
src/video/SDL_blit.c
src/video/SDL_blit_A.c
--- a/src/video/SDL_RLEaccel.c	Thu Apr 08 21:13:14 2004 +0000
+++ b/src/video/SDL_RLEaccel.c	Sun Apr 11 19:47:28 2004 +0000
@@ -102,11 +102,11 @@
 #include "SDL_memops.h"
 #include "SDL_RLEaccel_c.h"
 
-#if defined(i386) || defined(__x86_64__)
-#define MMX_CAPABLE
+#if (defined(i386) || defined(__x86_64__)) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#define MMX_ASMBLIT
 #endif
 
-#if defined(MMX_CAPABLE) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 #include "mmx.h"
 #include "SDL_cpuinfo.h"
 #endif
@@ -134,7 +134,7 @@
 #define OPAQUE_BLIT(to, from, length, bpp, alpha)	\
     PIXEL_COPY(to, from, length, bpp)
 
-#if defined(MMX_CAPABLE) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 
 #define ALPHA_BLIT32_888MMX(to, from, length, bpp, alpha)	\
     do {							\
@@ -515,7 +515,7 @@
 	}								\
     } while(0)
 
-#if defined(MMX_CAPABLE) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 
 #define ALPHA_BLIT32_888_50MMX(to, from, length, bpp, alpha)		\
     do {								\
@@ -628,7 +628,7 @@
 #define ALPHA_BLIT16_555_50(to, from, length, bpp, alpha)	\
     ALPHA_BLIT16_50(to, from, length, bpp, alpha, 0xfbde)
 
-#if defined(MMX_CAPABLE) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 
 #define CHOOSE_BLIT(blitter, alpha, fmt)				\
     do {								\
--- a/src/video/SDL_blit.c	Thu Apr 08 21:13:14 2004 +0000
+++ b/src/video/SDL_blit.c	Sun Apr 11 19:47:28 2004 +0000
@@ -37,7 +37,11 @@
 #include "SDL_pixels_c.h"
 #include "SDL_memops.h"
 
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#if (defined(i386) || defined(__x86_64__)) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#define MMX_ASMBLIT
+#endif
+
+#if defined(MMX_ASMBLIT)
 #include "SDL_cpuinfo.h"
 #include "mmx.h"
 #endif
@@ -111,7 +115,7 @@
 	return(okay ? 0 : -1);
 }
 
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 void SDL_memcpyMMX(char* to,char* from,int len)
 {
 	int i;
@@ -165,7 +169,7 @@
 	dst = info->d_pixels;
 	srcskip = w+info->s_skip;
 	dstskip = w+info->d_skip;
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 	if(SDL_HasSSE())
 	{
 		while ( h-- ) {
--- a/src/video/SDL_blit_A.c	Thu Apr 08 21:13:14 2004 +0000
+++ b/src/video/SDL_blit_A.c	Sun Apr 11 19:47:28 2004 +0000
@@ -31,7 +31,11 @@
 #include "SDL_video.h"
 #include "SDL_blit.h"
 
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#if (defined(i386) || defined(__x86_64__)) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#define MMX_ASMBLIT
+#endif
+
+#ifdef MMX_ASMBLIT
 /* Function to check the CPU flags */
 #include "SDL_cpuinfo.h"
 #include "mmx.h"
@@ -201,7 +205,7 @@
 	}
 }
 
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 /* fast RGB888->(A)RGB888 blending with surface alpha=128 special case */
 static void BlitRGBtoRGBSurfaceAlpha128MMX(SDL_BlitInfo *info)
 {
@@ -557,7 +561,7 @@
 	}
 }
 
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 /* fast (as in MMX with prefetch) ARGB888->(A)RGB888 blending with pixel alpha */
 inline static void BlitRGBtoRGBPixelAlphaMMX3DNOW(SDL_BlitInfo *info)
 {
@@ -759,7 +763,7 @@
 	}
 }
 
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 /* fast RGB565->RGB565 blending with surface alpha */
 static void Blit565to565SurfaceAlphaMMX(SDL_BlitInfo *info)
 {
@@ -1379,7 +1383,7 @@
 		if(surface->map->identity) {
 		    if(df->Gmask == 0x7e0)
 		    {
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 		if(SDL_HasMMX())
 			return Blit565to565SurfaceAlphaMMX;
 		else
@@ -1388,7 +1392,7 @@
 		    }
 		    else if(df->Gmask == 0x3e0)
 		    {
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 		if(SDL_HasMMX())
 			return Blit555to555SurfaceAlphaMMX;
 		else
@@ -1405,7 +1409,7 @@
 		   && (sf->Rmask | sf->Gmask | sf->Bmask) == 0xffffff
 		   && sf->BytesPerPixel == 4)
 		{
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 		if(SDL_HasMMX())
 		    return BlitRGBtoRGBSurfaceAlphaMMX;
 		else
@@ -1445,7 +1449,7 @@
 	       && sf->Bmask == df->Bmask
 	       && sf->BytesPerPixel == 4)
 	    {
-#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
+#ifdef MMX_ASMBLIT
 		if(SDL_Has3DNow())
 		    return BlitRGBtoRGBPixelAlphaMMX3DNOW;
 		else