diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-08-27 17:00:35 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-08-27 17:00:35 -0700 |
commit | 106a36509dc78e32e0b0e64c8da12ace639c879a (patch) | |
tree | 9d072ffcbb9d2c102edd98efc40b49561bedc6ac /compat | |
parent | Merge branch 'as/maint-graph-interesting-fix' (diff) | |
parent | remove ARM and Mozilla SHA1 implementations (diff) | |
download | tgif-106a36509dc78e32e0b0e64c8da12ace639c879a.tar.xz |
Merge branch 'lt/block-sha1'
* lt/block-sha1:
remove ARM and Mozilla SHA1 implementations
block-sha1: guard gcc extensions with __GNUC__
make sure byte swapping is optimal for git
block-sha1: make the size member first in the context struct
Diffstat (limited to 'compat')
-rw-r--r-- | compat/bswap.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/compat/bswap.h b/compat/bswap.h new file mode 100644 index 0000000000..7246a12c6e --- /dev/null +++ b/compat/bswap.h @@ -0,0 +1,36 @@ +/* + * 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 unsigned int default_swab32(unsigned int val) +{ + return (((val & 0xff000000) >> 24) | + ((val & 0x00ff0000) >> 8) | + ((val & 0x0000ff00) << 8) | + ((val & 0x000000ff) << 24)); +} + +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + +#define bswap32(x) ({ \ + unsigned int __res; \ + if (__builtin_constant_p(x)) { \ + __res = default_swab32(x); \ + } else { \ + __asm__("bswap %0" : "=r" (__res) : "0" (x)); \ + } \ + __res; }) + +#undef ntohl +#undef htonl +#define ntohl(x) bswap32(x) +#define htonl(x) bswap32(x) + +#endif |