From e30056275c2a6d857d004d850658ccf3490a7876 Mon Sep 17 00:00:00 2001 From: Ramsay Jones Date: Tue, 12 Oct 2010 19:11:51 +0100 Subject: [PATCH] bswap.h: Add ntohs() and htons() functions Since commit 70aab459, the msvc and MinGW builds have relied on the built-in implementation of ntohl() and htonl(), rather than linking the wsock32 library. The new index manipulation code now calls ntohs()/htons() in addition to ntohl()/htonl(), so we need to provide a built-in implementation of the 16-bit functions. Signed-off-by: Ramsay Jones --- src/bswap.h | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) 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 #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