util.h: backout cb07828e14e0 and 7d902369e960 for big-endian breakage

getbe32 and putbe32 need to behave differently on big-endian and little-endian
systems. On big-endian ones, they should be roughly equivalent to the identity
function with a cast, but on little-endian ones they should reverse the order
of the bytes. That is achieved by the original definition, but
__builtin_bswap32 and _byteswap_ulong, as the names suggest, swap bytes around
unconditionally.

There was no measurable performance improvement, so there's no point adding
extra complexity with even more ifdefs for endianncess.
This commit is contained in:
Siddharth Agarwal 2013-09-30 12:36:26 -07:00
parent c0d5c1e51a
commit 4500805b25

View File

@ -151,17 +151,6 @@ typedef unsigned __int64 uint64_t;
#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 __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
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;
@ -171,21 +160,7 @@ static inline uint32_t getbe32(const char *c)
(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 __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
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;
@ -193,6 +168,5 @@ static inline void putbe32(uint32_t x, char *c)
c[2] = (x >> 8) & 0xff;
c[3] = (x) & 0xff;
}
#endif
#endif /* _HG_UTIL_H_ */