Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -792,10 +792,32 @@ ]) AS_IF([test x"$enable_sockets" != x"no" -a x"$enable_threads" != x"no"], [ AC_SUBST(OFHTTPCLIENTTESTS_M, "OFHTTPClientTests.m") ]) + +AC_DEFUN([CHECK_BUILTIN_BSWAP], [ + AC_MSG_CHECKING(for __builtin_bswap$1) + AC_TRY_LINK([ + #include + #include + #include + #include + ], [ + uint$1_t i = errno; + printf("%" PRIu$1, __builtin_bswap$1(i)); + ], [ + AC_MSG_RESULT(yes) + AC_DEFINE(OF_HAVE_BUILTIN_BSWAP$1, 1, + [Whether we have __builtin_bswap$1]) + ], [ + AC_MSG_RESULT(no) + ]) +]) +CHECK_BUILTIN_BSWAP(16) +CHECK_BUILTIN_BSWAP(32) +CHECK_BUILTIN_BSWAP(64) case "$host" in arm-apple-darwin*) have_processes="no" ;; Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -197,11 +197,13 @@ } static OF_INLINE uint16_t OF_CONST_FUNC OF_BSWAP16_NONCONST(uint16_t i) { -#if defined(OF_X86_64_ASM) || defined(OF_X86_ASM) +#if defined(OF_HAVE_BUILTIN_BSWAP16) + return __builtin_bswap16(i); +#elif defined(OF_X86_64_ASM) || defined(OF_X86_ASM) __asm__ ( "xchgb %h0, %b0" : "=Q"(i) : "0"(i) ); @@ -225,11 +227,13 @@ } static OF_INLINE uint32_t OF_CONST_FUNC OF_BSWAP32_NONCONST(uint32_t i) { -#if defined(OF_X86_64_ASM) || defined(OF_X86_ASM) +#if defined(OF_HAVE_BUILTIN_BSWAP32) + return __builtin_bswap32(i); +#elif defined(OF_X86_64_ASM) || defined(OF_X86_ASM) __asm__ ( "bswap %0" : "=q"(i) : "0"(i) ); @@ -255,11 +259,13 @@ } static OF_INLINE uint64_t OF_CONST_FUNC OF_BSWAP64_NONCONST(uint64_t i) { -#if defined(OF_X86_64_ASM) +#if defined(OF_HAVE_BUILTIN_BSWAP64) + return __builtin_bswap64(i); +#elif defined(OF_X86_64_ASM) __asm__ ( "bswap %0" : "=r"(i) : "0"(i) ); Index: src/objfw-defs.h.in ================================================================== --- src/objfw-defs.h.in +++ src/objfw-defs.h.in @@ -1,10 +1,13 @@ #undef OF_APPLE_RUNTIME #undef OF_BIG_ENDIAN #undef OF_FLOAT_BIG_ENDIAN #undef OF_HAVE_ASPRINTF #undef OF_HAVE_ATOMIC_OPS +#undef OF_HAVE_BUILTIN_BSWAP16 +#undef OF_HAVE_BUILTIN_BSWAP32 +#undef OF_HAVE_BUILTIN_BSWAP64 #undef OF_HAVE_CHMOD #undef OF_HAVE_CHOWN #undef OF_HAVE_COMPILER_TLS #undef OF_HAVE_FILES #undef OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR