From patchwork Sat Sep 14 03:23:36 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: util.h: getbe32() and putbe32() use intrinsic function to improve performance From: elson.wei@gmail.com X-Patchwork-Id: 2500 Message-Id: <5e59af7da42418a2d79a.1379129016@ElsonWei-NB.PrimeVOLT> To: mercurial-devel@selenic.com Date: Sat, 14 Sep 2013 11:23:36 +0800 # HG changeset patch # User Wei, Elson # 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_ */