UltimateZoneBuilder/Source/Native/VPO/sys_endian.h
Magnus Norddahl 8eb522c873 Move vpo native code into BuilderNative as it is easier to manage. The plugins folder doesn't support including native dlls properly anyway.
Fix visplane explorer busy looping when waiting for data and reduce the used core count to 75% of the total available
Made vpo native code thread safe, removing the need for ungodly DLL patching hacks
2020-04-19 15:56:24 +02:00

128 lines
3.6 KiB
C

//------------------------------------------------------------------------
// EDGE Endian handling
//------------------------------------------------------------------------
//
// Eureka DOOM Editor
//
// Copyright (C) 2006-2008 Andrew Apted
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
//------------------------------------------------------------------------
//
// Using code from SDL_byteorder.h and SDL_endian.h.
// Copyright (C) 1997-2004 Sam Lantinga.
//
//------------------------------------------------------------------------
#ifndef __SYS_ENDIAN_H__
#define __SYS_ENDIAN_H__
// ---- determine byte order ----
#define UT_LIL_ENDIAN 1234
#define UT_BIG_ENDIAN 4321
#if defined(__LITTLE_ENDIAN__) || defined(WIN32) || \
defined(__i386__) || defined(__i386) || \
defined(__ia64__) || defined(__x86_64__) || \
defined(__alpha__) || defined(__alpha) || \
defined(__arm__) || defined(__SYMBIAN32__) || \
(defined(__mips__) && defined(__MIPSEL__))
#define UT_BYTEORDER UT_LIL_ENDIAN
#else
#define UT_BYTEORDER UT_BIG_ENDIAN
#endif
// ---- the gruntwork of swapping ----
#if defined(__GNUC__) && defined(__i386__)
static inline u16_t UT_Swap16(u16_t x)
{
__asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x));
return x;
}
#elif defined(__GNUC__) && defined(__x86_64__)
static inline u16_t UT_Swap16(u16_t x)
{
__asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x));
return x;
}
#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
static inline u16_t UT_Swap16(u16_t x)
{
u16_t result;
__asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x));
return result;
}
#else
static inline u16_t UT_Swap16(u16_t x) {
return((x<<8)|(x>>8));
}
#endif
#if defined(__GNUC__) && defined(__i386__)
static inline u32_t UT_Swap32(u32_t x)
{
__asm__("bswap %0" : "=r" (x) : "0" (x));
return x;
}
#elif defined(__GNUC__) && defined(__x86_64__)
static inline u32_t UT_Swap32(u32_t x)
{
__asm__("bswapl %0" : "=r" (x) : "0" (x));
return x;
}
#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
static inline u32_t UT_Swap32(u32_t x)
{
u32_t result;
__asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x));
__asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x));
__asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x));
return result;
}
#else
static inline u32_t UT_Swap32(u32_t x) {
return ((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24));
}
#endif
// ---- byte swap from specified endianness to native ----
#if (UT_BYTEORDER == UT_LIL_ENDIAN)
#define LE_U16(X) ((u16_t)(X))
#define LE_U32(X) ((u32_t)(X))
#define BE_U16(X) UT_Swap16(X)
#define BE_U32(X) UT_Swap32(X)
#else
#define LE_U16(X) UT_Swap16(X)
#define LE_U32(X) UT_Swap32(X)
#define BE_U16(X) ((u16_t)(X))
#define BE_U32(X) ((u32_t)(X))
#endif
// signed versions of the above
#define LE_S16(X) ((s16_t) LE_U16((u16_t) (X)))
#define LE_S32(X) ((s32_t) LE_U32((u32_t) (X)))
#define BE_S16(X) ((s16_t) BE_U16((u16_t) (X)))
#define BE_S32(X) ((s32_t) BE_U32((u32_t) (X)))
#endif // __SYS_ENDIAN_H__
//--- editor settings ---
// vi:ts=4:sw=4:noexpandtab