Skip to content

Commit

Permalink
* Fix to qvm compilation on big endian architectures
Browse files Browse the repository at this point in the history
  • Loading branch information
timangus committed Oct 13, 2007
1 parent 8f43965 commit 6dffd08
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 103 deletions.
8 changes: 4 additions & 4 deletions Makefile
Expand Up @@ -44,12 +44,12 @@ PLATFORM=$(COMPILE_PLATFORM)
endif
export PLATFORM

ifndef ARCH
ARCH=$(COMPILE_ARCH)
ifeq ($(COMPILE_ARCH),powerpc)
COMPILE_ARCH=ppc
endif

ifeq ($(ARCH),powerpc)
ARCH=ppc
ifndef ARCH
ARCH=$(COMPILE_ARCH)
endif
export ARCH

Expand Down
101 changes: 10 additions & 91 deletions code/tools/asm/cmdlib.c
Expand Up @@ -975,13 +975,7 @@ int ParseNum (const char *str)
============================================================================
*/

#ifdef _SGI_SOURCE
#define __BIG_ENDIAN__
#endif

#ifdef __BIG_ENDIAN__

short LittleShort (short l)
short ShortSwap (short l)
{
byte b1,b2;

Expand All @@ -991,13 +985,7 @@ short LittleShort (short l)
return (b1<<8) + b2;
}

short BigShort (short l)
{
return l;
}


int LittleLong (int l)
int LongSwap (int l)
{
byte b1,b2,b3,b4;

Expand All @@ -1009,89 +997,20 @@ int LittleLong (int l)
return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
}

int BigLong (int l)
{
return l;
}


float LittleFloat (float l)
{
union {byte b[4]; float f;} in, out;

in.f = l;
out.b[0] = in.b[3];
out.b[1] = in.b[2];
out.b[2] = in.b[1];
out.b[3] = in.b[0];

return out.f;
}

float BigFloat (float l)
{
return l;
}


#else


short BigShort (short l)
{
byte b1,b2;

b1 = l&255;
b2 = (l>>8)&255;

return (b1<<8) + b2;
}

short LittleShort (short l)
{
return l;
}
typedef union {
float f;
unsigned int i;
} _FloatByteUnion;

float FloatSwap (const float *f) {
_FloatByteUnion out;

int BigLong (int l)
{
byte b1,b2,b3,b4;
out.f = *f;
out.i = LongSwap(out.i);

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

int LittleLong (int l)
{
return l;
}

float BigFloat (float l)
{
union {byte b[4]; float f;} in, out;

in.f = l;
out.b[0] = in.b[3];
out.b[1] = in.b[2];
out.b[2] = in.b[1];
out.b[3] = in.b[0];

return out.f;
}

float LittleFloat (float l)
{
return l;
}


#endif


//=======================================================


Expand Down
8 changes: 0 additions & 8 deletions code/tools/asm/cmdlib.h
Expand Up @@ -115,14 +115,6 @@ void ExtractFileExtension( const char *path, char *dest );

int ParseNum (const char *str);

short BigShort (short l);
short LittleShort (short l);
int BigLong (int l);
int LittleLong (int l);
float BigFloat (float l);
float LittleFloat (float l);


char *COM_Parse (char *data);

extern char com_token[1024];
Expand Down
9 changes: 9 additions & 0 deletions code/tools/asm/q3asm.c
Expand Up @@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/

#include "../../qcommon/q_platform.h"
#include "cmdlib.h"
#include "mathlib.h"
#include "../../qcommon/qfiles.h"
Expand Down Expand Up @@ -1356,6 +1357,7 @@ void WriteVmFile( void ) {
vmHeader_t header;
FILE *f;
int headerSize;
int i;

report( "%i total errors\n", errorCount );

Expand Down Expand Up @@ -1400,6 +1402,13 @@ void WriteVmFile( void ) {

report( "Writing to %s\n", imageName );

#ifdef Q3_BIG_ENDIAN
// byte swap the header
for ( i = 0 ; i < sizeof( vmHeader_t ) / 4 ; i++ ) {
((int *)&header)[i] = LittleLong( ((int *)&header)[i] );
}
#endif

CreatePath( imageName );
f = SafeOpenWrite( imageName );
SafeWrite( f, &header, headerSize );
Expand Down

0 comments on commit 6dffd08

Please sign in to comment.