diff options
-rw-r--r-- | src/bswap.h | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/bswap.h b/src/bswap.h index b3e8a0abb..b9211c3c8 100644 --- a/src/bswap.h +++ b/src/bswap.h @@ -21,7 +21,15 @@ GIT_INLINE(uint32_t) default_swab32(uint32_t val) #undef bswap32 -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +GIT_INLINE(uint16_t) default_swab16(uint16_t val) +{ + return (((val & 0xff00) >> 8) | + ((val & 0x00ff) << 8)); +} + +#undef bswap16 + +#if defined(__GNUC__) && defined(__i386__) #define bswap32(x) ({ \ uint32_t __res; \ @@ -32,11 +40,41 @@ GIT_INLINE(uint32_t) default_swab32(uint32_t val) } \ __res; }) +#define bswap16(x) ({ \ + uint16_t __res; \ + if (__builtin_constant_p(x)) { \ + __res = default_swab16(x); \ + } else { \ + __asm__("xchgb %b0,%h0" : "=q" (__res) : "0" ((uint16_t)(x))); \ + } \ + __res; }) + +#elif defined(__GNUC__) && defined(__x86_64__) + +#define bswap32(x) ({ \ + uint32_t __res; \ + if (__builtin_constant_p(x)) { \ + __res = default_swab32(x); \ + } else { \ + __asm__("bswapl %0" : "=r" (__res) : "0" ((uint32_t)(x))); \ + } \ + __res; }) + +#define bswap16(x) ({ \ + uint16_t __res; \ + if (__builtin_constant_p(x)) { \ + __res = default_swab16(x); \ + } else { \ + __asm__("xchgb %b0,%h0" : "=Q" (__res) : "0" ((uint16_t)(x))); \ + } \ + __res; }) + #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) #include <stdlib.h> #define bswap32(x) _byteswap_ulong(x) +#define bswap16(x) _byteswap_ushort(x) #endif @@ -48,3 +86,12 @@ GIT_INLINE(uint32_t) default_swab32(uint32_t val) #define htonl(x) bswap32(x) #endif + +#ifdef bswap16 + +#undef ntohs +#undef htons +#define ntohs(x) bswap16(x) +#define htons(x) bswap16(x) + +#endif |