summaryrefslogtreecommitdiff
path: root/compat/bswap.h
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-08-28 00:00:35 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-08-28 00:00:35 (GMT)
commit106a36509dc78e32e0b0e64c8da12ace639c879a (patch)
tree9d072ffcbb9d2c102edd98efc40b49561bedc6ac /compat/bswap.h
parent24343c609926e0163c9956b89c010e907fe755ee (diff)
parent30ae47b4cc19dce42f51b4fa378d315a71b08957 (diff)
downloadgit-106a36509dc78e32e0b0e64c8da12ace639c879a.zip
git-106a36509dc78e32e0b0e64c8da12ace639c879a.tar.gz
git-106a36509dc78e32e0b0e64c8da12ace639c879a.tar.bz2
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/bswap.h')
-rw-r--r--compat/bswap.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/compat/bswap.h b/compat/bswap.h
new file mode 100644
index 0000000..7246a12
--- /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