diff --git a/src/bitvector.h b/src/bitvector.h
index 5c0023b9c30a4047850763b9acba40d2c94b37d9..c53fba144953dcf197ef279b24d49ef3b28fbca6 100644
--- a/src/bitvector.h
+++ b/src/bitvector.h
@@ -75,7 +75,7 @@ static INLINE unsigned INT32 ATTRIBUTE((unused)) ctz32(unsigned INT32 i) {
 #define ctz16(i) (i ? ctz32(i) : 16)
 #define ctz8(i) (i ? ctz32(i) : 8)
 
-
+#if !defined(HAVE___BSWAP32) && !defined(HAVE_BSWAP32)
 static INLINE unsigned INT32 ATTRIBUTE((unused)) bswap32(unsigned INT32 x) {
 #ifdef HAS___BUILTIN_BSWAP32
     return __builtin_bswap32(x);
@@ -88,6 +88,7 @@ static INLINE unsigned INT32 ATTRIBUTE((unused)) bswap32(unsigned INT32 x) {
             | ((x & 0x00ff0000) >> 8) | ((x & 0x0000ff00) << 8));
 #endif
 }
+#endif /* !HAVE___BSWAP32 && !HAVE_BSWAP32 */
 
 #ifdef INT64
 
@@ -150,6 +151,7 @@ static INLINE unsigned INT32 ATTRIBUTE((unused)) ctz64(unsigned INT64 i) {
 # endif
 }
 
+#if !defined(HAVE___BSWAP64) && !defined(HAVE_BSWAP64)
 static INLINE unsigned INT64 ATTRIBUTE((unused)) bswap64(unsigned INT64 x) {
 #ifdef HAS___BUILTIN_BSWAP64
     return __builtin_bswap64(x);
@@ -161,6 +163,7 @@ static INLINE unsigned INT64 ATTRIBUTE((unused)) bswap64(unsigned INT64 x) {
     return bswap32(x >> 32) | (unsigned INT64)bswap32(x & 0xffffffff) << 32;
 #endif
 }
+#endif /* !HAVE___BSWAP64 && !HAVE_BSWAP64 */
 
 static INLINE unsigned INT64 PIKE_UNUSED_ATTRIBUTE round_up64(unsigned INT64 v) {
     unsigned INT32 i;
@@ -213,7 +216,9 @@ static INLINE unsigned INT32 ATTRIBUTE((unused)) log2_u32(unsigned INT32 v) {
     return fls32(v) - 1;
 }
 
+#if !defined(HAVE___BSWAP16) && !defined(HAVE_BSWAP16)
 #define bswap16(x)     ((unsigned INT16)bswap32((unsigned INT32)x << 16))
+#endif /* !HAVE___BSWAP16 && !HAVE_BSWAP16 */
 
 #if PIKE_BYTEORDER == 1234
 #define get_unaligned_le16 get_unaligned16
diff --git a/src/configure.in b/src/configure.in
index 0cab0396b354144673029fbd092a77a2aa8f6e88..4d8794a42d43ed9578c9df1543018606ec2de890 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -3236,7 +3236,8 @@ AC_CHECK_HEADERS(winsock2.h sys/rusage.h time.h sys/time.h sys/types.h \
 		 sys/prctl.h sys/ioctl.h mach/task_info.h mach/task.h \
 		 mach/mach_init.h syscall.h sys/syscall.h devices/timer.h \
 		 direct.h CoreServices/CoreServices.h execinfo.h \
-		 mach/mach.h mach/thread_act.h mach/clock.h urcu.h,,,[
+		 mach/mach.h mach/thread_act.h mach/clock.h urcu.h \
+		 machine/bswap.h sys/endian.h,,,[
 #if (defined(__WINNT__) || defined(__WIN32__)) && !defined(__NT__)
 #define __NT__
 #endif
@@ -4498,6 +4499,12 @@ AC_CHECK_FUNCS( \
  setsid \
  initgroups setgroups \
  socketpair \
+ bswap16 \
+ __bswap16 \
+ bswap32 \ 
+ __bswap32 \
+ bswap64 \
+ __bswap64 \
  fpclass \
  fp_class_d \
  isinf \