From 2cf2247b84369322cff4e69aafeac751b3f83488 Mon Sep 17 00:00:00 2001 From: Spoike Date: Sun, 9 May 2021 13:00:00 +0000 Subject: [PATCH] Optimize endian routines when we know the endian at compile time. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5830 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/image.c | 8 +---- engine/common/bothdefs.h | 15 +++++++++ engine/common/common.c | 66 ++++++++++++++++++---------------------- engine/common/common.h | 52 ++++++++++++++++++++++++------- engine/common/sha1.c | 4 +-- imgtool.c | 2 -- 6 files changed, 89 insertions(+), 58 deletions(-) diff --git a/engine/client/image.c b/engine/client/image.c index 4df31c08d..f58246afa 100644 --- a/engine/client/image.c +++ b/engine/client/image.c @@ -8,13 +8,7 @@ #ifndef HAVE_CLIENT //#define Con_Printf(f, ...) -//hope you're on a littleendian machine -#define LittleShort(s) s -#define LittleLong(s) s -#define LittleFloat(s) s - -#define BigFloat(s) SwapFloat(s) -static float SwapFloat (float l) +float FloatSwap (float l) { union {qbyte b[4]; float f;} in, out; in.f = l; diff --git a/engine/common/bothdefs.h b/engine/common/bothdefs.h index 6f6d0be52..7c143d8c1 100644 --- a/engine/common/bothdefs.h +++ b/engine/common/bothdefs.h @@ -693,6 +693,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif #endif +#if defined(_WIN32) + #define FTE_LITTLE_ENDIAN +#elif defined(__BYTE_ORDER__) + #ifdef __ORDER_BIG_ENDIAN__ + #if (__BYTE_ORDER__==__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__==__ORDER_BIG_ENDIAN__) + #define FTE_BIG_ENDIAN + #endif + #endif + #ifdef __ORDER_LITTLE_ENDIAN__ + #if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) && (__FLOAT_WORD_ORDER__==__ORDER_LITTLE_ENDIAN__) + #define FTE_LITTLE_ENDIAN + #endif + #endif +#endif + #ifdef _MSC_VER #define VARGS __cdecl #define MSVCDISABLEWARNINGS diff --git a/engine/common/common.c b/engine/common/common.c index fe1268f8f..d434c399a 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -745,6 +745,7 @@ void deleetstring(char *result, const char *leet) ============================================================================ */ +#if !defined(FTE_BIG_ENDIAN) && !defined(FTE_LITTLE_ENDIAN) qboolean bigendian; short (*BigShort) (short l); @@ -754,39 +755,36 @@ int (*LittleLong) (int l); float (*BigFloat) (float l); float (*LittleFloat) (float l); -short ShortSwap (short l) +static short ShortNoSwap (short l) { return l; } +static int LongNoSwap (int l) { return l; } +static qint64_t I64NoSwap (qint64_t l) { return l; } +static float FloatNoSwap (float f) { return f; } +#endif + +short ShortSwap (short l) { - qbyte b1,b2; - - b1 = l&255; - b2 = (l>>8)&255; - - return (b1<<8) + b2; + return ((l>> 8)&0x00ff)| + ((l<< 8)&0xff00); } - -static short ShortNoSwap (short l) +int LongSwap (int l) { - return l; + return ((l>>24)&0x000000ff)| + ((l>> 8)&0x0000ff00)| + ((l<< 8)&0x00ff0000)| + ((l<<24)&0xff000000); } - -int LongSwap (int l) +qint64_t I64Swap (qint64_t l) { - qbyte b1,b2,b3,b4; - - b1 = l&255; - b2 = (l>>8)&255; - b3 = (l>>16)&255; - b4 = (l>>24)&255; - - return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; + return ((l>>56)& 0x000000ff)| + ((l>>40)& 0x0000ff00)| + ((l>>24)& 0x00ff0000)| + ((l>> 8)& 0xff000000)| + ((l<< 8)&0x000000ff00000000)| + ((l<<24)&0x0000ff0000000000)| + ((l<<40)&0x00ff000000000000)| + ((l<<56)&0xff00000000000000); } - -static int LongNoSwap (int l) -{ - return l; -} - -static float FloatSwap (float f) +float FloatSwap (float f) { union { @@ -803,11 +801,6 @@ static float FloatSwap (float f) return dat2.f; } -static float FloatNoSwap (float f) -{ - return f; -} - void COM_SwapLittleShortBlock (short *s, int size) { if (size <= 0) @@ -6212,11 +6205,9 @@ COM_Init */ void COM_Init (void) { - qbyte swaptest[2] = {1,0}; - - wantquit = false; - +#if !defined(FTE_BIG_ENDIAN) && !defined(FTE_LITTLE_ENDIAN) // set the qbyte swapping variables in a portable manner + qbyte swaptest[2] = {1,0}; if ( *(short *)swaptest == 1) { bigendian = false; @@ -6237,6 +6228,9 @@ void COM_Init (void) BigFloat = FloatNoSwap; LittleFloat = FloatSwap; } +#endif + + wantquit = false; //random should be random from the start... srand(time(0)); diff --git a/engine/common/common.h b/engine/common/common.h index b80e84bca..fa8140a77 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -232,27 +232,57 @@ void InsertLinkAfter (link_t *l, link_t *after); #define Q_MAXSHORT ((short)0x7fff) #define Q_MAXINT ((int)0x7fffffff) #define Q_MAXLONG ((int)0x7fffffff) -#define Q_MAXFLOAT ((int)0x7fffffff) +//#define Q_MAXFLOAT ((int)0x7fffffff) #define Q_MINCHAR ((char)0x80) #define Q_MINSHORT ((short)0x8000) #define Q_MININT ((int)0x80000000) #define Q_MINLONG ((int)0x80000000) -#define Q_MINFLOAT ((int)0x7fffffff) +//#define Q_MINFLOAT ((int)0x7fffffff) //============================================================================ -extern qboolean bigendian; +#if defined(FTE_LITTLE_ENDIAN) + #define bigendian false -extern short (*BigShort) (short l); -extern short (*LittleShort) (short l); -extern int (*BigLong) (int l); -extern int (*LittleLong) (int l); -extern float (*BigFloat) (float l); -extern float (*LittleFloat) (float l); + #define LittleShort(x) ((short)(x)) + #define LittleLong(x) ((int)(x)) + #define LittleI64(x) ((qint64_t)(x)) + #define LittleFloat(x) ((float)(x)) -short ShortSwap (short l); -int LongSwap (int l); + #define BigShort(x) (ShortSwap(x)) + #define BigLong(x) (LongSwap(x)) + #define BigI64(x) (I64Swap(x)) + #define BigFloat(x) (FloatSwap(x)) +#elif defined(FTE_BIG_ENDIAN) + #define bigendian true + + #define BigShort(x) ((short)(x)) + #define BigLong(x) ((int)(x)) + #define BigI64(x) ((qint64_t)(x)) + #define BigFloat(x) ((float)(x)) + + #define LittleShort(x) (ShortSwap(x)) + #define LittleLong(x) (LongSwap(x)) + #define LittleI64(x) (I64Swap(x)) + #define LittleFloat(x) (FloatSwap(x)) +#else + extern qboolean bigendian; + + extern short (*BigShort) (short l); + extern short (*LittleShort) (short l); + extern int (*BigLong) (int l); + extern int (*LittleLong) (int l); + extern qint64_t (*BigI64) (qint64_t l); + extern qint64_t (*LittleI64) (qint64_t l); + extern float (*BigFloat) (float l); + extern float (*LittleFloat) (float l); +#endif + +short ShortSwap (short l); +int LongSwap (int l); +qint64_t I64Swap (qint64_t l); +float FloatSwap (float f); void COM_CharBias (signed char *c, int size); void COM_SwapLittleShortBlock (short *s, int size); diff --git a/engine/common/sha1.c b/engine/common/sha1.c index 39fc6d030..3dc0fff79 100644 --- a/engine/common/sha1.c +++ b/engine/common/sha1.c @@ -28,12 +28,12 @@ typedef struct } SHA1_CTX; #define SHA1_DIGEST_SIZE 20 -#define BigLong(l) (((unsigned char*)&l)[0]<<24) | (((unsigned char*)&l)[1]<<16) | (((unsigned char*)&l)[2]<<8) | (((unsigned char*)&l)[3]<<0) +#define ShaBigLong(l) (((unsigned char*)&l)[0]<<24) | (((unsigned char*)&l)[1]<<16) | (((unsigned char*)&l)[2]<<8) | (((unsigned char*)&l)[3]<<0) #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) -#define blk0(i) (block->l[i] = BigLong(block->l[i])) +#define blk0(i) (block->l[i] = ShaBigLong(block->l[i])) #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ ^block->l[(i+2)&15]^block->l[i&15],1)) diff --git a/imgtool.c b/imgtool.c index 6d9ea8c55..513fe4f7e 100644 --- a/imgtool.c +++ b/imgtool.c @@ -3,8 +3,6 @@ #undef stderr #define stderr stdout -#define LittleLong(s) s - #include #include #ifdef _WIN32