From d1429e3921867aec37abb0250315549b11bea0cc Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 11 Apr 2004 19:47:28 +0000 Subject: [PATCH] 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 | 12 ++++++------ src/video/SDL_blit.c | 10 +++++++--- src/video/SDL_blit_A.c | 20 ++++++++++++-------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/video/SDL_RLEaccel.c b/src/video/SDL_RLEaccel.c index e03d711ff..72865c511 100644 --- a/src/video/SDL_RLEaccel.c +++ b/src/video/SDL_RLEaccel.c @@ -102,11 +102,11 @@ static char rcsid = #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 @@ do { \ #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 @@ do { \ } \ } 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 @@ do { \ #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 { \ diff --git a/src/video/SDL_blit.c b/src/video/SDL_blit.c index 35e3ae463..095d03c53 100644 --- a/src/video/SDL_blit.c +++ b/src/video/SDL_blit.c @@ -37,7 +37,11 @@ static char rcsid = #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 @@ static int SDL_SoftBlit(SDL_Surface *src, SDL_Rect *srcrect, 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 @@ static void SDL_BlitCopy(SDL_BlitInfo *info) 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-- ) { diff --git a/src/video/SDL_blit_A.c b/src/video/SDL_blit_A.c index fee27ee37..35384155d 100644 --- a/src/video/SDL_blit_A.c +++ b/src/video/SDL_blit_A.c @@ -31,7 +31,11 @@ static char rcsid = #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 @@ static void BlitNto1SurfaceAlphaKey(SDL_BlitInfo *info) } } -#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 @@ static void BlitRGBtoRGBPixelAlpha(SDL_BlitInfo *info) } } -#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 @@ static void Blit16to16SurfaceAlpha128(SDL_BlitInfo *info, Uint16 mask) } } -#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 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) 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 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) } 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 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) && (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 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) { -#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT) +#ifdef MMX_ASMBLIT if(SDL_Has3DNow()) return BlitRGBtoRGBPixelAlphaMMX3DNOW; else