diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-11-05 06:33:55 -0800 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-11-05 06:33:55 -0800 |
commit | 189627cd588c2937de7b655595b8ed777f445c85 (patch) | |
tree | a705e86785a06f293aa255a0263ddc25ca1ba202 /compat/bswap.h | |
download | git-189627cd588c2937de7b655595b8ed777f445c85.tar.gz git-189627cd588c2937de7b655595b8ed777f445c85.tar.bz2 git-189627cd588c2937de7b655595b8ed777f445c85.zip |
Imported Upstream version 1.7.10.4upstream/1.7.10.4
Diffstat (limited to 'compat/bswap.h')
-rw-r--r-- | compat/bswap.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/compat/bswap.h b/compat/bswap.h new file mode 100644 index 00000000..5061214f --- /dev/null +++ b/compat/bswap.h @@ -0,0 +1,50 @@ +/* + * Let's make sure we always have a sane definition for ntohl()/htonl(). + * Some libraries define those as a function call, just to perform byte + * shifting, bringing significant overhead to what should be a simple + * operation. + */ + +/* + * Default version that the compiler ought to optimize properly with + * constant values. + */ +static inline uint32_t default_swab32(uint32_t val) +{ + return (((val & 0xff000000) >> 24) | + ((val & 0x00ff0000) >> 8) | + ((val & 0x0000ff00) << 8) | + ((val & 0x000000ff) << 24)); +} + +#undef bswap32 + +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + +#define bswap32 git_bswap32 +static inline uint32_t git_bswap32(uint32_t x) +{ + uint32_t result; + if (__builtin_constant_p(x)) + result = default_swab32(x); + else + __asm__("bswap %0" : "=r" (result) : "0" (x)); + return result; +} + +#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) + +#include <stdlib.h> + +#define bswap32(x) _byteswap_ulong(x) + +#endif + +#ifdef bswap32 + +#undef ntohl +#undef htonl +#define ntohl(x) bswap32(x) +#define htonl(x) bswap32(x) + +#endif |