summaryrefslogtreecommitdiff
path: root/zutil.h
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2012-02-11 00:26:38 -0800
committerMark Adler <madler@alumni.caltech.edu>2012-02-11 00:26:38 -0800
commit7d45cf5a1dbe9d34f9fb18e2f485efda83019493 (patch)
tree290e01d92e398389e83c943ca26e4c9201d3a5bb /zutil.h
parent1a4ba8cd912466fe538f62d61fbcc25eead6d31a (diff)
downloadzlib-7d45cf5a1dbe9d34f9fb18e2f485efda83019493.tar.gz
Use optimized byte swap operations for Microsoft and GNU [Snyder].
Diffstat (limited to 'zutil.h')
-rw-r--r--zutil.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/zutil.h b/zutil.h
index dff1112..2f4d14d 100644
--- a/zutil.h
+++ b/zutil.h
@@ -245,4 +245,17 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+/* Reverse the bytes in a 64-bit or 32-bit or 16-bit value */
+#if defined(_WIN32) && (_MSC_VER >= 1300) && (defined(_M_IX86) || defined(_M_X64))
+# include <stdlib.h>
+# pragma intrinsic(_byteswap_ulong)
+# define ZSWAP32(q) _byteswap_ulong(q)
+#elif defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+# include <byteswap.h>
+# define ZSWAP32(q) __builtin_bswap32(q)
+#else
+# define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
+ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
+#endif
+
#endif /* ZUTIL_H */