[PATCH] util.h: getbe32() and putbe32() use intrinsic function to improve performance

elson.wei at gmail.com elson.wei at gmail.com
Fri Sep 13 22:23:36 CDT 2013


# HG changeset patch
# User Wei, Elson <elson.wei at gmail.com>
# Date 1379128954 -28800
#      Sat Sep 14 11:22:34 2013 +0800
# Node ID 5e59af7da42418a2d79ad8720d4eb9725851112b
# Parent  f3beb092c0285cd118c4af05688495f05aca8f3a
util.h: getbe32() and putbe32() use intrinsic function to improve performance

Refer to https://bugzilla.mozilla.org/show_bug.cgi?id=351557. It can improve
byte-swapping performance by intrinsic function.

diff --git a/mercurial/util.h b/mercurial/util.h
--- a/mercurial/util.h
+++ b/mercurial/util.h
@@ -151,6 +151,17 @@
 #define inline __inline
 #endif
 
+#if defined(_MSC_VER) && (_MSC_VER >= 1300)
+static inline uint32_t getbe32(const char *c)
+{
+	return _byteswap_ulong(*(uint32_t *)c);
+}
+#elif GCC_VERSION >= 403
+static inline uint32_t getbe32(const char *c)
+{
+	return __builtin_bswap32(*(uint32_t *)c);
+}
+#else
 static inline uint32_t getbe32(const char *c)
 {
 	const unsigned char *d = (const unsigned char *)c;
@@ -160,7 +171,21 @@
 		(d[2] << 8) |
 		(d[3]));
 }
+#endif
 
+#if defined(_MSC_VER) && (_MSC_VER >= 1300)
+static inline void putbe32(uint32_t x, char *c)
+{
+	x = _byteswap_ulong(x);
+	*(uint32_t *)c = x;
+}
+#elif GCC_VERSION >= 403
+static inline void putbe32(uint32_t x, char *c)
+{
+	x = __builtin_bswap32(x);
+	*(uint32_t *)c = x;
+}
+#else
 static inline void putbe32(uint32_t x, char *c)
 {
 	c[0] = (x >> 24) & 0xff;
@@ -168,5 +193,6 @@
 	c[2] = (x >> 8) & 0xff;
 	c[3] = (x) & 0xff;
 }
+#endif
 
 #endif /* _HG_UTIL_H_ */


More information about the Mercurial-devel mailing list