Index: src/OFMacros.h ================================================================== --- src/OFMacros.h +++ src/OFMacros.h @@ -67,11 +67,11 @@ ((uint64_t)i & UINT64_C(0x0000000000FF0000)) << 24 | \ ((uint64_t)i & UINT64_C(0x000000000000FF00)) << 40 | \ ((uint64_t)i & UINT64_C(0x00000000000000FF)) << 56) static OF_INLINE uint16_t -OF_BSWAP16(uint16_t i) +OF_BSWAP16_NONCONST(uint16_t i) { #if defined(OF_X86_ASM) || defined(OF_AMD64_ASM) asm("xchgb %h0, %b0" : "=Q"(i) : "Q"(i)); #elif defined(OF_PPC_ASM) asm("lhbrx %0, 0, %1" : "=r"(i) : "r"(&i), "m"(i)); @@ -83,11 +83,11 @@ #endif return i; } static OF_INLINE uint32_t -OF_BSWAP32(uint32_t i) +OF_BSWAP32_NONCONST(uint32_t i) { #if defined(OF_X86_ASM) || defined(OF_AMD64_ASM) asm("bswap %0" : "=q"(i) : "q"(i)); #elif defined(OF_PPC_ASM) asm("lwbrx %0, 0, %1" : "=r"(i) : "r"(&i), "m"(i)); @@ -101,11 +101,11 @@ #endif return i; } static OF_INLINE uint64_t -OF_BSWAP64(uint64_t i) +OF_BSWAP64_NONCONST(uint64_t i) { #if defined(OF_AMD64_ASM) asm("bswap %0" : "=r"(i) : "r"(i)); #elif defined(OF_X86_ASM) asm("bswap %%eax\n\t" @@ -114,10 +114,23 @@ #else i = (uint64_t)OF_BSWAP32(i & 0xFFFFFFFF) << 32 | OF_BSWAP32(i >> 32); #endif return i; } + +#ifdef __GNUC__ +#define OF_BSWAP16(i) \ + (__builtin_constant_p(i) ? OF_BSWAP16_CONST(i) : OF_BSWAP16_NONCONST(i)) +#define OF_BSWAP32(i) \ + (__builtin_constant_p(i) ? OF_BSWAP32_CONST(i) : OF_BSWAP32_NONCONST(i)) +#define OF_BSWAP64(i) \ + (__builtin_constant_p(i) ? OF_BSWAP64_CONST(i) : OF_BSWAP64_NONCONST(i)) +#else +#define OF_BSWAP16(i) OF_BSWAP16_CONST(i) +#define OF_BSWAP32(i) OF_BSWAP32_CONST(i) +#define OF_BSWAP64(i) OF_BSWAP64_CONST(i) +#endif static OF_INLINE void OF_BSWAP32_V(uint32_t *buf, size_t len) { while (len--) { @@ -125,30 +138,18 @@ buf++; } } #ifdef OF_BIG_ENDIAN -#define OF_BSWAP16_CONST_IF_BE(i) OF_BSWAP16_CONST(i) -#define OF_BSWAP32_CONST_IF_BE(i) OF_BSWAP32_CONST(i) -#define OF_BSWAP64_CONST_IF_BE(i) OF_BSWAP64_CONST(i) -#define OF_BSWAP16_CONST_IF_LE(i) i -#define OF_BSWAP32_CONST_IF_LE(i) i -#define OF_BSWAP64_CONST_IF_LE(i) i #define OF_BSWAP16_IF_BE(i) OF_BSWAP16(i) #define OF_BSWAP32_IF_BE(i) OF_BSWAP32(i) #define OF_BSWAP64_IF_BE(i) OF_BSWAP64(i) #define OF_BSWAP16_IF_LE(i) i #define OF_BSWAP32_IF_LE(i) i #define OF_BSWAP64_IF_LE(i) i #define OF_BSWAP32_V_IF_BE(buf, len) OF_BSWAP32_V(buf, len) #else -#define OF_BSWAP16_CONST_IF_BE(i) i -#define OF_BSWAP32_CONST_IF_BE(i) i -#define OF_BSWAP64_CONST_IF_BE(i) i -#define OF_BSWAP16_CONST_IF_LE(i) OF_BSWAP16_CONST(i) -#define OF_BSWAP32_CONST_IF_LE(i) OF_BSWAP32_CONST(i) -#define OF_BSWAP64_CONST_IF_LE(i) OF_BSWAP64_CONST(i) #define OF_BSWAP16_IF_BE(i) i #define OF_BSWAP32_IF_BE(i) i #define OF_BSWAP64_IF_BE(i) i #define OF_BSWAP16_IF_LE(i) OF_BSWAP16(i) #define OF_BSWAP32_IF_LE(i) OF_BSWAP32(i)