byteswap: make use of glibc specific bytswap primitives
authorLennart Poettering <lennart@poettering.net>
Tue, 19 May 2009 20:34:43 +0000 (22:34 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 20 May 2009 00:09:32 +0000 (02:09 +0200)
glibc knows three bswap_{16|32|64}() calls that internally make use of a
gcc extension to implement faster byteswapping. We should make use of it
if we can.

configure.in
dbus/dbus-marshal-basic.h

index c2c6a8c..036679c 100644 (file)
@@ -679,6 +679,8 @@ AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
 
 AC_CHECK_HEADERS(errno.h)
 
+AC_CHECK_HEADERS(byteswap.h)
+
 AC_CHECK_HEADERS(unistd.h)
 
 # checking for a posix version of getpwnam_r
index bcc15ee..f09c520 100644 (file)
 #define DBUS_MARSHAL_BASIC_H
 
 #include <config.h>
+
+#ifdef HAVE_BYTESWAP_H
+#include <byteswap.h>
+#endif
+
 #include <dbus/dbus-protocol.h>
 #include <dbus/dbus-types.h>
 #include <dbus/dbus-arch-deps.h>
 #define DBUS_COMPILER_BYTE_ORDER DBUS_LITTLE_ENDIAN
 #endif
 
+#ifdef HAVE_BYTESWAP_H
+#define DBUS_UINT16_SWAP_LE_BE_CONSTANT(val) bswap_16(val)
+#define DBUS_UINT32_SWAP_LE_BE_CONSTANT(val) bswap_32(val)
+#else /* HAVE_BYTESWAP_H */
+
 #define DBUS_UINT16_SWAP_LE_BE_CONSTANT(val)   ((dbus_uint16_t) (      \
     (dbus_uint16_t) ((dbus_uint16_t) (val) >> 8) |                      \
     (dbus_uint16_t) ((dbus_uint16_t) (val) << 8)))
     (((dbus_uint32_t) (val) & (dbus_uint32_t) 0x00ff0000U) >>  8) |     \
     (((dbus_uint32_t) (val) & (dbus_uint32_t) 0xff000000U) >> 24)))
 
+#endif /* HAVE_BYTESWAP_H */
+
 #ifdef DBUS_HAVE_INT64
 
+#ifdef HAVE_BYTESWAP_H
+#define DBUS_UINT64_SWAP_LE_BE_CONSTANT(val) bswap_64(val)
+#else /* HAVE_BYTESWAP_H */
+
 #define DBUS_UINT64_SWAP_LE_BE_CONSTANT(val)   ((dbus_uint64_t) (              \
       (((dbus_uint64_t) (val) &                                                 \
        (dbus_uint64_t) DBUS_UINT64_CONSTANT (0x00000000000000ff)) << 56) |    \
@@ -68,6 +84,8 @@
        (dbus_uint64_t) DBUS_UINT64_CONSTANT (0xff00000000000000)) >> 56)))
 #endif /* DBUS_HAVE_INT64 */
 
+#endif /* HAVE_BYTESWAP_H */
+
 #define DBUS_UINT16_SWAP_LE_BE(val) (DBUS_UINT16_SWAP_LE_BE_CONSTANT (val))
 #define DBUS_INT16_SWAP_LE_BE(val)  ((dbus_int16_t)DBUS_UINT16_SWAP_LE_BE_CONSTANT (val))