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
This commit is contained in:
Spoike 2021-05-09 13:00:00 +00:00
parent 134de2cfb2
commit 2cf2247b84
6 changed files with 89 additions and 58 deletions

View file

@ -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;

View file

@ -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

View file

@ -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);
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)
{
return l;
}
int LongSwap (int 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>>24)&0x000000ff)|
((l>> 8)&0x0000ff00)|
((l<< 8)&0x00ff0000)|
((l<<24)&0xff000000);
}
static int LongNoSwap (int l)
qint64_t I64Swap (qint64_t l)
{
return l;
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 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));

View file

@ -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))
#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);

View file

@ -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))

View file

@ -3,8 +3,6 @@
#undef stderr
#define stderr stdout
#define LittleLong(s) s
#include <limits.h>
#include <ctype.h>
#ifdef _WIN32