This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Unify and simplify bits/byteswap.h, bits/byteswap-16.h headers (bug 14508, bug 15512, bug 17082, bug 20530)



On 01/02/2018 18:35, Joseph Myers wrote:
> We have a general principle of preferring optimizations for library
> facilities to use compiler built-in functions rather than being
> located in library headers, where the compiler can reasonably optimize
> code without needing to know glibc implementation details.
> 
> This patch applies this principle to bits/byteswap.h, eliminating all
> the architecture-specific variants and bits/byteswap-16.h.  The
> __bswap_16, __bswap_32 and __bswap_64 interfaces all become inline
> functions, never macros, using the GCC built-in functions where
> available and otherwise a single architecture-independent definition
> using shifts and masking (which compilers may well be able to detect
> and optimize; GCC has detection of various byte-swapping idioms).
> 
> The __bswap_constant_32 macro needs to stay around because of uses in
> static initializers within glibc and its tests, and so for consistency
> all __bswap_constant_* are kept rather than just being inlined into
> the old-GCC-or-non-GCC parts of the __bswap_* inline function
> definitions.

Wouldn't be better to use static inline for these as well?

> 
> Various open bugs are addressed by this cleanup, with caveats about
> exactly what is covered by those bugs and when the bugs applied at
> all.
> 
> Bug 14508 reports -Wformat warnings building glibc because __bswap_*
> sometimes returned the wrong types.  Obviously we already don't have
> such warnings any more or the build would be failing, given -Werror,
> and I suspect that bug was originally for wrong types for x86_64, as
> fixed by commit d394eb742a3565d7fe7a4b02710a60b5f219ee64 (glibc 2.17).
> The only case I saw removed by this patch where the types would still
> have been wrong was the non-__GNUC__ case of __bswap_64 in the s390
> header (using unsigned long long int, but uint64_t would be unsigned
> long int for 64-bit).  In any case, the single header consistently
> uses __uintN_t types after this patch, thereby eliminating all such
> bugs.  The existing string/test-endian-types.c test already suffices
> to verify that the types are correct with the compiler used to build
> glibc and its tests.
> 
> Bug 15512 reports an error from __bswap_constant_16 with -Werror
> -Wsign-conversion.  I am unable to reproduce this with any GCC version
> supporting -Wsign-conversion - all seem to be able to avoid warning
> for ((x) >> 8) & 0xffu, where x is uint16_t, which while it formally
> does involve an implicit conversion from int to unsigned int, is also
> a case where it should be easy for the compiler to see that the value
> converted is never negative.  But in this patch __bswap_constant_16 is
> changed to use signed 0xff so that no such implicit conversion occurs
> at all, and a test with -Werror -Wsign-conversion is added.
> 
> Bug 17082 objects to the use of ({}) statement expressions in these
> macros preventing use at file scope (in C, that's in sizeof etc.; in
> C++, more generally in static initializers).  The particular case of
> these interfaces is fixed by this patch as it changes them to inline
> functions, eliminating all uses of ({}) in bits/byteswap.h, and a
> corresponding testcase is added.  The bug tries to raise a more
> general policy question about use of ({}) in macros in installed
> headers, referring to "many other libc functions" (unspecified which
> functions are being considered).
> 
> Since such policy questions belong on libc-alpha, and since there
> *are* macros in installed headers which can't really avoid using ({})
> (where they are type-generic, so can't use an inline function, but
> need a temporary variable, and a few where the interface involves
> returning memory from alloca so can't use an inline function either),
> I propose to consider that bug fixed with this change.  That is
> without prejudice to any other new bugs anyone wishes to file *for
> precisely defined sets of macros* requesting moving away from ({})
> *where it is clearly possible for those interfaces*.  Where ({}) can
> be avoided, typically by use of an inline function, I think that's a
> good idea - that inline functions are typically to be preferred to
> ({}) for header interfaces where such optimizations are useful but the
> interface is suited to being defined using an inline function.

Agreed and I think we can extend this policy for internal implementation
as well.

> 
> Bug 20530 requests use of __builtin_bswap16 when available (GCC 4.8
> and later), which this patch implements.
> 
> Tested for x86_64, and with build-many-glibcs.py.  Also did an x86_64
> test with the __GNUC_PREREQ conditionals changed to "#if 0" to verify
> the old-GCC/non-GCC case in the headers.  (There are already existing
> tests for correctness of results of these interfaces.)
> 
> 2018-02-01  Joseph Myers  <joseph@codesourcery.com>
> 
> 	[BZ #14508]
> 	[BZ #15512]
> 	[BZ #17082]
> 	[BZ #20530]
> 	* bits/byteswap.h: Update file comment.  Do not include
> 	<bits/byteswap-16.h>.
> 	(__bswap_constant_16): Cast result to __uint16_t.  Use signed 0xff
> 	constant.
> 	(__bswap_16): Define as inline function.
> 	(__bswap_constant_32): Reformat definition.
> 	(__bswap_32): Always define as inline function, not macro, using
> 	__uint32_t.  Use __builtin_bswap32 if [__GNUC_PREREQ (4, 3)],
> 	otherwise __bswap_constant_32.
> 	(__bswap_constant_64): Reformat definition.  Do not use
> 	__extension__ here.
> 	(__bswap_64): Always define as inline function, not macro.  Use
> 	__extension__ on function definition.  Use __builtin_bswap64 if
> 	[__GNUC_PREREQ (4, 3)], otherwise __bswap_constant_64.
> 	* string/test-endian-file-scope.c: New file.
> 	* string/test-endian-sign-conversion.c: Likewise.
> 	* string/Makefile (headers): Remove bits/byteswap-16.h.
> 	(tests): Add test-endian-file-scope and
> 	test-endian-sign-conversion.
> 	(CFLAGS-test-endian-sign-conversion.c): New variable.
> 	* bits/byteswap-16.h: Remove file.
> 	* sysdeps/ia64/bits/byteswap-16.h: Likewise.
> 	* sysdeps/ia64/bits/byteswap.h: Likewise.
> 	* sysdeps/m68k/bits/byteswap.h: Likewise.
> 	* sysdeps/s390/bits/byteswap-16.h: Likewise.
> 	* sysdeps/s390/bits/byteswap.h: Likewise.
> 	* sysdeps/tile/bits/byteswap.h: Likewise.
> 	* sysdeps/x86/bits/byteswap-16.h: Likewise.
> 	* sysdeps/x86/bits/byteswap.h: Likewise.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>

> 
> diff --git a/bits/byteswap-16.h b/bits/byteswap-16.h
> deleted file mode 100644
> index 0fbd8d6..0000000
> --- a/bits/byteswap-16.h
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -/* Macros to swap the order of bytes in 16-bit integer values.
> -   Copyright (C) 2012-2018 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#ifndef _BITS_BYTESWAP_H
> -# error "Never use <bits/byteswap-16.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#ifdef __GNUC__
> -# define __bswap_16(x) \
> -    (__extension__							      \
> -     ({ unsigned short int __bsx = (unsigned short int) (x);		      \
> -       __bswap_constant_16 (__bsx); }))
> -#else
> -static __inline unsigned short int
> -__bswap_16 (unsigned short int __bsx)
> -{
> -  return __bswap_constant_16 (__bsx);
> -}
> -#endif

Ok.

> diff --git a/bits/byteswap.h b/bits/byteswap.h
> index f99a6a4..23974e9 100644
> --- a/bits/byteswap.h
> +++ b/bits/byteswap.h
> @@ -1,4 +1,4 @@
> -/* Macros to swap the order of bytes in integer values.
> +/* Macros and inline functions to swap the order of bytes in integer values.
>     Copyright (C) 1997-2018 Free Software Foundation, Inc.
>     This file is part of the GNU C Library.
>  
> @@ -26,87 +26,54 @@
>  #include <features.h>
>  #include <bits/types.h>
>  
> -/* Swap bytes in 16 bit value.  */
> -#define __bswap_constant_16(x) \
> -	((unsigned short int)((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8)))
> +/* Swap bytes in 16-bit value.  */
> +#define __bswap_constant_16(x)					\
> +  ((__uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
>  
> -/* Get __bswap_16.  */
> -#include <bits/byteswap-16.h>
> +static __inline __uint16_t
> +__bswap_16 (__uint16_t __bsx)
> +{
> +#if __GNUC_PREREQ (4, 8)
> +  return __builtin_bswap16 (__bsx);
> +#else
> +  return __bswap_constant_16 (__bsx);
> +#endif
> +}
>  
> -/* Swap bytes in 32 bit value.  */
> -#define __bswap_constant_32(x) \
> -     ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >>  8) |	      \
> -      (((x) & 0x0000ff00u) <<  8) | (((x) & 0x000000ffu) << 24))
> +/* Swap bytes in 32-bit value.  */
> +#define __bswap_constant_32(x)					\
> +  ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8)	\
> +   | (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24))
>  
> -#ifdef __GNUC__
> -# if __GNUC_PREREQ (4, 3)
> -static __inline unsigned int
> -__bswap_32 (unsigned int __bsx)
> +static __inline __uint32_t
> +__bswap_32 (__uint32_t __bsx)
>  {
> +#if __GNUC_PREREQ (4, 3)
>    return __builtin_bswap32 (__bsx);
> -}
> -# else
> -#  define __bswap_32(x) \
> -  (__extension__							      \
> -   ({ unsigned int __bsx = (x); __bswap_constant_32 (__bsx); }))
> -# endif
>  #else
> -static __inline unsigned int
> -__bswap_32 (unsigned int __bsx)
> -{
>    return __bswap_constant_32 (__bsx);
> -}
>  #endif
> +}
>  
> -/* Swap bytes in 64 bit value.  */
> -#if __GNUC_PREREQ (2, 0)
> -# define __bswap_constant_64(x) \
> -     (__extension__ ((((x) & 0xff00000000000000ull) >> 56)		      \
> -		     | (((x) & 0x00ff000000000000ull) >> 40)		      \
> -		     | (((x) & 0x0000ff0000000000ull) >> 24)		      \
> -		     | (((x) & 0x000000ff00000000ull) >> 8)		      \
> -		     | (((x) & 0x00000000ff000000ull) << 8)		      \
> -		     | (((x) & 0x0000000000ff0000ull) << 24)		      \
> -		     | (((x) & 0x000000000000ff00ull) << 40)		      \
> -		     | (((x) & 0x00000000000000ffull) << 56)))
> +/* Swap bytes in 64-bit value.  */
> +#define __bswap_constant_64(x)			\
> +  ((((x) & 0xff00000000000000ull) >> 56)	\
> +   | (((x) & 0x00ff000000000000ull) >> 40)	\
> +   | (((x) & 0x0000ff0000000000ull) >> 24)	\
> +   | (((x) & 0x000000ff00000000ull) >> 8)	\
> +   | (((x) & 0x00000000ff000000ull) << 8)	\
> +   | (((x) & 0x0000000000ff0000ull) << 24)	\
> +   | (((x) & 0x000000000000ff00ull) << 40)	\
> +   | (((x) & 0x00000000000000ffull) << 56))
>  
> -# if __GNUC_PREREQ (4, 3)
> -static __inline __uint64_t
> +__extension__ static __inline __uint64_t
>  __bswap_64 (__uint64_t __bsx)
>  {
> +#if __GNUC_PREREQ (4, 3)
>    return __builtin_bswap64 (__bsx);
> -}
> -# else
> -#  define __bswap_64(x) \
> -     (__extension__							      \
> -      ({ union { __extension__ __uint64_t __ll;				      \
> -		 unsigned int __l[2]; } __w, __r;			      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __r.__ll = __bswap_constant_64 (x);				      \
> -	 else								      \
> -	   {								      \
> -	     __w.__ll = (x);						      \
> -	     __r.__l[0] = __bswap_32 (__w.__l[1]);			      \
> -	     __r.__l[1] = __bswap_32 (__w.__l[0]);			      \
> -	   }								      \
> -	 __r.__ll; }))
> -# endif
>  #else
> -# define __bswap_constant_64(x) \
> -     ((((x) & 0xff00000000000000ull) >> 56)				      \
> -      | (((x) & 0x00ff000000000000ull) >> 40)				      \
> -      | (((x) & 0x0000ff0000000000ull) >> 24)				      \
> -      | (((x) & 0x000000ff00000000ull) >> 8)				      \
> -      | (((x) & 0x00000000ff000000ull) << 8)				      \
> -      | (((x) & 0x0000000000ff0000ull) << 24)				      \
> -      | (((x) & 0x000000000000ff00ull) << 40)				      \
> -      | (((x) & 0x00000000000000ffull) << 56))
> -
> -static __inline __uint64_t
> -__bswap_64 (__uint64_t __bsx)
> -{
>    return __bswap_constant_64 (__bsx);
> -}
>  #endif
> +}
>  
>  #endif /* _BITS_BYTESWAP_H */

Ok.

> diff --git a/string/Makefile b/string/Makefile
> index 1bcc9bb..680431f 100644
> --- a/string/Makefile
> +++ b/string/Makefile
> @@ -24,7 +24,7 @@ include ../Makeconfig
>  
>  headers		:= string.h bits/string_fortified.h			\
>  		   strings.h bits/strings_fortified.h			\
> -		   byteswap.h bits/byteswap.h bits/byteswap-16.h	\
> +		   byteswap.h bits/byteswap.h				\
>  		   endian.h bits/endian.h bits/uintn-identity.h		\
>  		   memory.h argz.h envz.h
>  
> @@ -58,7 +58,8 @@ tests		:= tester inl-tester noinl-tester testcopy test-ffs	\
>  		   bug-strtok1 $(addprefix test-,$(strop-tests))	\
>  		   bug-envz1 tst-strxfrm2 tst-endian tst-svc2		\
>  		   tst-strtok_r bug-strcoll2 tst-cmp tst-xbzero-opt	\
> -		   test-endian-types
> +		   test-endian-types test-endian-file-scope		\
> +		   test-endian-sign-conversion
>  
>  # This test allocates a lot of memory and can run for a long time.
>  xtests = tst-strcoll-overflow
> @@ -76,6 +77,7 @@ CFLAGS-stratcliff.c += -fno-builtin
>  CFLAGS-test-ffs.c += -fno-builtin
>  CFLAGS-tst-inlcall.c += -fno-builtin
>  CFLAGS-tst-xbzero-opt.c += -O3
> +CFLAGS-test-endian-sign-conversion.c += -Werror -Wsign-conversion
>  # BZ 21006: Resolve all functions but at least explicit_bzero at startup.
>  # Otherwise the test fails on s390x as the memcpy in prepare_test_buffer is
>  # done by loading r4 / r5 with the test_pattern and using store multiple

Ok.

> diff --git a/string/test-endian-file-scope.c b/string/test-endian-file-scope.c
> new file mode 100644
> index 0000000..e03063c
> --- /dev/null
> +++ b/string/test-endian-file-scope.c
> @@ -0,0 +1,44 @@
> +/* Test endian.h endian-conversion macros accepted at file scope.
> +   Copyright (C) 2018 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <endian.h>
> +#include <stddef.h>
> +
> +int i;
> +
> +size_t s0 = sizeof (htobe16 (i));
> +size_t s1 = sizeof (htole16 (i));
> +size_t s2 = sizeof (be16toh (i));
> +size_t s3 = sizeof (le16toh (i));
> +size_t s4 = sizeof (htobe32 (i));
> +size_t s5 = sizeof (htole32 (i));
> +size_t s6 = sizeof (be32toh (i));
> +size_t s7 = sizeof (le32toh (i));
> +size_t s8 = sizeof (htobe64 (i));
> +size_t s9 = sizeof (htole64 (i));
> +size_t s10 = sizeof (be64toh (i));
> +size_t s11 = sizeof (le64toh (i));
> +
> +static int
> +do_test (void)
> +{
> +  /* This is a compilation test.  */
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>

Ok.

> diff --git a/string/test-endian-sign-conversion.c b/string/test-endian-sign-conversion.c
> new file mode 100644
> index 0000000..e0b13b2
> --- /dev/null
> +++ b/string/test-endian-sign-conversion.c
> @@ -0,0 +1,48 @@
> +/* Test endian.h endian-conversion macros work with -Wsign-conversion.
> +   Copyright (C) 2018 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <endian.h>
> +#include <stdint.h>
> +
> +uint16_t u16;
> +uint32_t u32;
> +uint64_t u64;
> +
> +static int
> +do_test (void)
> +{
> +  /* This is a compilation test.  */
> +  u16 = (htobe16 (u16));
> +  u16 = (htole16 (u16));
> +  u16 = (be16toh (u16));
> +  u16 = (le16toh (u16));
> +  u32 = (htobe32 (u32));
> +  u32 = (htole32 (u32));
> +  u32 = (be32toh (u32));
> +  u32 = (le32toh (u32));
> +  u64 = (htobe64 (u64));
> +  u64 = (htole64 (u64));
> +  u64 = (be64toh (u64));
> +  u64 = (le64toh (u64));
> +  (void) u16;
> +  (void) u32;
> +  (void) u64;
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>

Ok.

> diff --git a/sysdeps/ia64/bits/byteswap-16.h b/sysdeps/ia64/bits/byteswap-16.h
> deleted file mode 100644
> index 3c382c8..0000000
> --- a/sysdeps/ia64/bits/byteswap-16.h
> +++ /dev/null
> @@ -1,42 +0,0 @@
> -/* Macros to swap the order of bytes in 16-bit integer values.
> -   Copyright (C) 1997-2018 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#ifndef _BITS_BYTESWAP_H
> -# error "Never use <bits/byteswap-16.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#if defined __GNUC__ && __GNUC__ >= 2
> -# define __bswap_16(x) \
> -     (__extension__							      \
> -      ({ unsigned short int __v, __x = (unsigned short int) (x);	      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __v = __bswap_constant_16 (__x);				      \
> -	 else								      \
> -	   __asm__ __volatile__ ("shl %0 = %1, 48 ;;"			      \
> -				 "mux1 %0 = %0, @rev ;;"		      \
> -				 : "=r" (__v)				      \
> -				 : "r" ((unsigned short int) (__x)));	      \
> -	 __v; }))
> -#else
> -/* This is better than nothing.  */
> -static __inline unsigned short int
> -__bswap_16 (unsigned short int __bsx)
> -{
> -  return __bswap_constant_16 (__bsx);
> -}
> -#endif

Ok.

> diff --git a/sysdeps/ia64/bits/byteswap.h b/sysdeps/ia64/bits/byteswap.h
> deleted file mode 100644
> index 553c72f..0000000
> --- a/sysdeps/ia64/bits/byteswap.h
> +++ /dev/null
> @@ -1,100 +0,0 @@
> -/* Macros to swap the order of bytes in integer values.
> -   Copyright (C) 1997-2018 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
> -# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#ifndef _BITS_BYTESWAP_H
> -#define _BITS_BYTESWAP_H 1
> -
> -/* Swap bytes in 16 bit value.  */
> -#define __bswap_constant_16(x) \
> -     ((unsigned short int)((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
> -
> -/* Get __bswap_16.  */
> -#include <bits/byteswap-16.h>
> -
> -/* Swap bytes in 32 bit value.  */
> -#define __bswap_constant_32(x) \
> -     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |		      \
> -      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
> -
> -#if defined __GNUC__ && __GNUC__ >= 2
> -# define __bswap_32(x) \
> -     (__extension__							      \
> -      ({ unsigned int __v, __x = (x);					      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __v = __bswap_constant_32 (__x);				      \
> -	 else								      \
> -	   __asm__ __volatile__ ("shl %0 = %1, 32 ;;"			      \
> -				 "mux1 %0 = %0, @rev ;;"		      \
> -				 : "=r" (__v)				      \
> -				 : "r" ((unsigned int) (__x)));		      \
> -	 __v; }))
> -#else
> -static __inline unsigned int
> -__bswap_32 (unsigned int __bsx)
> -{
> -  return __bswap_constant_32 (__bsx);
> -}
> -#endif
> -
> -
> -/* Swap bytes in 64 bit value.  */
> -#if defined __GNUC__ && __GNUC__ >= 2
> -# define __bswap_constant_64(x) \
> -     (__extension__ ((((x) & 0xff00000000000000ul) >> 56)		      \
> -		     | (((x) & 0x00ff000000000000ul) >>  40)		      \
> -		     | (((x) & 0x0000ff0000000000ul) >> 24)		      \
> -		     | (((x) & 0x000000ff00000000ul) >> 8)		      \
> -		     | (((x) & 0x00000000ff000000ul) << 8)		      \
> -		     | (((x) & 0x0000000000ff0000ul) << 24)		      \
> -		     | (((x) & 0x000000000000ff00ul) << 40)		      \
> -		     | (((x) & 0x00000000000000fful) << 56)))
> -
> -# define __bswap_64(x) \
> -     (__extension__							      \
> -      ({ unsigned long int __v, __x = (x);				      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __v = __bswap_constant_64 (__x);				      \
> -	 else								      \
> -	   __asm__ __volatile__ ("mux1 %0 = %1, @rev ;;"		      \
> -				 : "=r" (__v)				      \
> -				 : "r" ((unsigned long int) (__x)));	      \
> -	 __v; }))
> -
> -#else
> -# define __bswap_constant_64(x) \
> -     ((((x) & 0xff00000000000000ul) >> 56)				      \
> -      | (((x) & 0x00ff000000000000ul) >>  40)				      \
> -      | (((x) & 0x0000ff0000000000ul) >> 24)				      \
> -      | (((x) & 0x000000ff00000000ul) >> 8)				      \
> -      | (((x) & 0x00000000ff000000ul) << 8)				      \
> -      | (((x) & 0x0000000000ff0000ul) << 24)				      \
> -      | (((x) & 0x000000000000ff00ul) << 40)				      \
> -      | (((x) & 0x00000000000000fful) << 56))
> -
> -static __inline unsigned long int
> -__bswap_64 (unsigned long int __bsx)
> -{
> -  return __bswap_constant_64 (__bsx);
> -}
> -#endif
> -
> -#endif /* _BITS_BYTESWAP_H */

Ok.

> diff --git a/sysdeps/m68k/bits/byteswap.h b/sysdeps/m68k/bits/byteswap.h
> deleted file mode 100644
> index 3055230..0000000
> --- a/sysdeps/m68k/bits/byteswap.h
> +++ /dev/null
> @@ -1,88 +0,0 @@
> -/* Macros to swap the order of bytes in integer values.  m68k version.
> -   Copyright (C) 1997-2018 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library.  If not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
> -# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#ifndef _BITS_BYTESWAP_H
> -#define _BITS_BYTESWAP_H 1
> -
> -/* Swap bytes in 16 bit value.  We don't provide an assembler version
> -   because GCC is smart enough to generate optimal assembler output, and
> -   this allows for better cse.  */
> -#define __bswap_constant_16(x) \
> -  ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8))
> -
> -static __always_inline unsigned short int
> -__bswap_16 (unsigned short int __bsx)
> -{
> -  return __bswap_constant_16 (__bsx);
> -}
> -
> -/* Swap bytes in 32 bit value.  */
> -#define __bswap_constant_32(x) \
> -  ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >>  8) |		      \
> -   (((x) & 0x0000ff00u) <<  8) | (((x) & 0x000000ffu) << 24))
> -
> -#if !defined(__mcoldfire__)
> -static __always_inline unsigned int
> -__bswap_32 (unsigned int __bsx)
> -{
> -  if (__builtin_constant_p (__bsx))
> -    return __bswap_constant_32 (__bsx);
> -  __asm__ __volatile__ ("ror%.w %#8, %0;"
> -			"swap %0;"
> -			"ror%.w %#8, %0"
> -			: "+d" (__bsx));
> -  return __bsx;
> -}
> -#else
> -static __always_inline unsigned int
> -__bswap_32 (unsigned int __bsx)
> -{
> -  return __bswap_constant_32 (__bsx);
> -}
> -#endif
> -
> -#if defined __GNUC__ && __GNUC__ >= 2
> -/* Swap bytes in 64 bit value.  */
> -# define __bswap_constant_64(x) \
> -  __extension__								      \
> -  ((((x) & 0xff00000000000000ull) >> 56)				      \
> -   | (((x) & 0x00ff000000000000ull) >> 40)				      \
> -   | (((x) & 0x0000ff0000000000ull) >> 24)				      \
> -   | (((x) & 0x000000ff00000000ull) >> 8)				      \
> -   | (((x) & 0x00000000ff000000ull) << 8)				      \
> -   | (((x) & 0x0000000000ff0000ull) << 24)				      \
> -   | (((x) & 0x000000000000ff00ull) << 40)				      \
> -   | (((x) & 0x00000000000000ffull) << 56))
> -
> -/* Swap bytes in 64 bit value.  */
> -__extension__
> -static __always_inline unsigned long long
> -__bswap_64 (unsigned long long __bsx)
> -{
> -  if (__builtin_constant_p (__bsx))
> -    return __bswap_constant_64 (__bsx);
> -  return (__bswap_32 (__bsx >> 32)
> -	  | ((unsigned long long) __bswap_32 (__bsx) << 32));
> -}
> -#endif
> -
> -#endif /* _BITS_BYTESWAP_H */

Ok.

> diff --git a/sysdeps/s390/bits/byteswap-16.h b/sysdeps/s390/bits/byteswap-16.h
> deleted file mode 100644
> index d1e67d3..0000000
> --- a/sysdeps/s390/bits/byteswap-16.h
> +++ /dev/null
> @@ -1,65 +0,0 @@
> -/* Macros to swap the order of bytes in 16-bit integer values.  s390 version
> -   Copyright (C) 2012-2018 Free Software Foundation, Inc.
> -   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#ifndef _BITS_BYTESWAP_H
> -# error "Never use <bits/byteswap-16.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#include <bits/wordsize.h>
> -
> -/* Swap bytes in 16 bit value. */
> -#if defined __GNUC__ && __GNUC__ >= 2
> -# if __WORDSIZE == 64
> -#  define __bswap_16(x) \
> -     (__extension__							      \
> -      ({ unsigned short int __v, __x = (unsigned short int) (x);	      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __v = __bswap_constant_16 (__x);				      \
> -	 else {								      \
> -	   unsigned short int __tmp = (unsigned short int) (__x);             \
> -	   __asm__ __volatile__ (                                             \
> -	      "lrvh %0,%1"                                                    \
> -	      : "=&d" (__v) : "m" (__tmp) );                                  \
> -	 }                                                                    \
> -	 __v; }))
> -# else
> -#  define __bswap_16(x) \
> -     (__extension__							      \
> -      ({ unsigned short int __v, __x = (unsigned short int) (x);	      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __v = __bswap_constant_16 (__x);				      \
> -	 else {								      \
> -	   unsigned short int __tmp = (unsigned short int) (__x);             \
> -	   __asm__ __volatile__ (                                             \
> -	      "sr   %0,%0\n"                                                  \
> -	      "la   1,%1\n"                                                   \
> -	      "icm  %0,2,1(1)\n"                                              \
> -	      "ic   %0,0(1)"                                                  \
> -	      : "=&d" (__v) : "m" (__tmp) : "1");                             \
> -	 }                                                                    \
> -	 __v; }))
> -# endif
> -#else
> -/* This is better than nothing.  */
> -static __inline unsigned short int
> -__bswap_16 (unsigned short int __bsx)
> -{
> -  return __bswap_constant_16 (__bsx);
> -}
> -#endif

Ok.

> diff --git a/sysdeps/s390/bits/byteswap.h b/sysdeps/s390/bits/byteswap.h
> deleted file mode 100644
> index 79a6e5f..0000000
> --- a/sysdeps/s390/bits/byteswap.h
> +++ /dev/null
> @@ -1,134 +0,0 @@
> -/* Macros to swap the order of bytes in integer values.  s390 version.
> -   Copyright (C) 2000-2018 Free Software Foundation, Inc.
> -   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
> -# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#include <bits/wordsize.h>
> -
> -#ifndef _BITS_BYTESWAP_H
> -#define _BITS_BYTESWAP_H 1
> -
> -#define __bswap_constant_16(x) \
> -	((unsigned short int) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
> -
> -/* Get __bswap_16.  */
> -#include <bits/byteswap-16.h>
> -
> -/* Swap bytes in 32 bit value.  */
> -#define __bswap_constant_32(x) \
> -     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |		      \
> -      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
> -
> -#if defined __GNUC__ && __GNUC__ >= 2
> -# if __WORDSIZE == 64
> -#  define __bswap_32(x) \
> -     (__extension__							      \
> -      ({ unsigned int __v, __x = (x);					      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __v = __bswap_constant_32 (__x);				      \
> -	 else {								      \
> -	   unsigned int __tmp = (unsigned int) (__x);                         \
> -	   __asm__ __volatile__ (                                             \
> -	      "lrv   %0,%1"                                                   \
> -	      : "=&d" (__v) : "m" (__tmp));                                   \
> -	 }                                                                    \
> -	 __v; }))
> -# else
> -#  define __bswap_32(x) \
> -     (__extension__							      \
> -      ({ unsigned int __v, __x = (x);					      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __v = __bswap_constant_32 (__x);				      \
> -	 else {								      \
> -	   unsigned int __tmp = (unsigned int) (__x);                         \
> -	   __asm__ __volatile__ (                                             \
> -	      "la    1,%1\n"                                                  \
> -	      "icm   %0,8,3(1)\n"                                             \
> -	      "icm   %0,4,2(1)\n"                                             \
> -	      "icm   %0,2,1(1)\n"                                             \
> -	      "ic    %0,0(1)"                                                 \
> -	      : "=&d" (__v) : "m" (__tmp) : "1");                             \
> -	 }                                                                    \
> -	 __v; }))
> -# endif
> -#else
> -static __inline unsigned int
> -__bswap_32 (unsigned int __bsx)
> -{
> -  return __bswap_constant_32 (__bsx);
> -}
> -#endif
> -
> -/* Swap bytes in 64 bit value.  */
> -#if defined __GNUC__ && __GNUC__ >= 2
> -# define __bswap_constant_64(x) \
> -     (__extension__ ((((x) & 0xff00000000000000ul) >> 56)		      \
> -		     | (((x) & 0x00ff000000000000ul) >>  40)		      \
> -		     | (((x) & 0x0000ff0000000000ul) >> 24)		      \
> -		     | (((x) & 0x000000ff00000000ul) >> 8)		      \
> -		     | (((x) & 0x00000000ff000000ul) << 8)		      \
> -		     | (((x) & 0x0000000000ff0000ul) << 24)		      \
> -		     | (((x) & 0x000000000000ff00ul) << 40)		      \
> -		     | (((x) & 0x00000000000000fful) << 56)))
> -
> -# if __WORDSIZE == 64
> -#  define __bswap_64(x) \
> -     (__extension__							      \
> -      ({ unsigned long __w, __x = (x);					      \
> -	 if (__builtin_constant_p (x))					      \
> -	   __w = __bswap_constant_64 (__x);				      \
> -	 else {								      \
> -	   unsigned long __tmp = (unsigned long) (__x);                       \
> -	   __asm__ __volatile__ (                                             \
> -	      "lrvg  %0,%1"                                                   \
> -	      : "=&d" (__w) : "m" (__tmp));                                   \
> -	 }                                                                    \
> -	 __w; }))
> -# else
> -#  define __bswap_64(x) \
> -     __extension__					\
> -       ({ union { unsigned long long int __ll;		\
> -		  unsigned long int __l[2]; } __w, __r;	\
> -	  __w.__ll = (x);				\
> -	  __r.__l[0] = __bswap_32 (__w.__l[1]);		\
> -	  __r.__l[1] = __bswap_32 (__w.__l[0]);		\
> -	  __r.__ll; })
> -# endif
> -#else
> -# define __bswap_constant_64(x) \
> -     ((((x) & 0xff00000000000000ull) >> 56)				      \
> -      | (((x) & 0x00ff000000000000ull) >> 40)				      \
> -      | (((x) & 0x0000ff0000000000ull) >> 24)				      \
> -      | (((x) & 0x000000ff00000000ull) >> 8)				      \
> -      | (((x) & 0x00000000ff000000ull) << 8)				      \
> -      | (((x) & 0x0000000000ff0000ull) << 24)				      \
> -      | (((x) & 0x000000000000ff00ull) << 40)				      \
> -      | (((x) & 0x00000000000000ffull) << 56))
> -
> -__extension__
> -static __inline unsigned long long int
> -__bswap_64 (unsigned long long int __bsx)
> -{
> -  return __bswap_constant_64 (__bsx);
> -}
> -#endif
> -
> -#endif /* _BITS_BYTESWAP_H */

Ok.

> diff --git a/sysdeps/tile/bits/byteswap.h b/sysdeps/tile/bits/byteswap.h
> deleted file mode 100644
> index ab36055..0000000
> --- a/sysdeps/tile/bits/byteswap.h
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -/* Copyright (C) 2011-2018 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library.  If not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
> -# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#ifndef _BITS_BYTESWAP_H
> -#define _BITS_BYTESWAP_H 1
> -
> -#include <bits/types.h>
> -
> -/* gcc __builtin_bswap64() can constant-fold, etc, so always use it. */
> -#define __bswap_16(x) ((unsigned short)(__builtin_bswap32(x) >> 16))
> -#define __bswap_32(x) ((unsigned int)__builtin_bswap32(x))
> -#define __bswap_64(x) ((__uint64_t)__builtin_bswap64(x))
> -
> -#define __bswap_constant_16(x) __bswap_16(x)
> -#define __bswap_constant_32(x) __bswap_32(x)
> -#define __bswap_constant_64(x) __bswap_64(x)
> -
> -#endif /* _BITS_BYTESWAP_H */

Ok.

> diff --git a/sysdeps/x86/bits/byteswap-16.h b/sysdeps/x86/bits/byteswap-16.h
> deleted file mode 100644
> index 34af790..0000000
> --- a/sysdeps/x86/bits/byteswap-16.h
> +++ /dev/null
> @@ -1,49 +0,0 @@
> -/* Macros to swap the order of bytes in 16-bit integer values.
> -   Copyright (C) 2012-2018 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#ifndef _BITS_BYTESWAP_H
> -# error "Never use <bits/byteswap-16.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#ifdef __GNUC__
> -# if __GNUC__ >= 2
> -#  define __bswap_16(x) \
> -     (__extension__							      \
> -      ({ unsigned short int __v, __x = (unsigned short int) (x);	      \
> -	 if (__builtin_constant_p (__x))				      \
> -	   __v = __bswap_constant_16 (__x);				      \
> -	 else								      \
> -	   __asm__ ("rorw $8, %w0"					      \
> -		    : "=r" (__v)					      \
> -		    : "0" (__x)						      \
> -		    : "cc");						      \
> -	 __v; }))
> -# else
> -/* This is better than nothing.  */
> -#  define __bswap_16(x) \
> -     (__extension__							      \
> -      ({ unsigned short int __x = (unsigned short int) (x);		      \
> -	 __bswap_constant_16 (__x); }))
> -# endif
> -#else
> -static __inline unsigned short int
> -__bswap_16 (unsigned short int __bsx)
> -{
> -  return __bswap_constant_16 (__bsx);
> -}
> -#endif

Ok.

> diff --git a/sysdeps/x86/bits/byteswap.h b/sysdeps/x86/bits/byteswap.h
> deleted file mode 100644
> index 23c8f42..0000000
> --- a/sysdeps/x86/bits/byteswap.h
> +++ /dev/null
> @@ -1,155 +0,0 @@
> -/* Macros to swap the order of bytes in integer values.
> -   Copyright (C) 1997-2018 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
> -# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
> -#endif
> -
> -#ifndef _BITS_BYTESWAP_H
> -#define _BITS_BYTESWAP_H 1
> -
> -#include <features.h>
> -#include <bits/types.h>
> -#include <bits/wordsize.h>
> -
> -/* Swap bytes in 16 bit value.  */
> -#define __bswap_constant_16(x) \
> -     ((unsigned short int) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
> -
> -/* Get __bswap_16.  */
> -#include <bits/byteswap-16.h>
> -
> -/* Swap bytes in 32 bit value.  */
> -#define __bswap_constant_32(x) \
> -     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |		      \
> -      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
> -
> -#ifdef __GNUC__
> -# if __GNUC_PREREQ (4, 3)
> -static __inline unsigned int
> -__bswap_32 (unsigned int __bsx)
> -{
> -  return __builtin_bswap32 (__bsx);
> -}
> -# elif __GNUC__ >= 2
> -#  if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__	      \
> -			   || defined __pentiumpro__ || defined __pentium4__  \
> -			   || defined __k8__ || defined __athlon__	      \
> -			   || defined __k6__ || defined __nocona__	      \
> -			   || defined __core2__ || defined __geode__	      \
> -			   || defined __amdfam10__)
> -/* To swap the bytes in a word the i486 processors and up provide the
> -   `bswap' opcode.  On i386 we have to use three instructions.  */
> -#   define __bswap_32(x) \
> -      (__extension__							      \
> -       ({ unsigned int __v, __x = (x);					      \
> -	  if (__builtin_constant_p (__x))				      \
> -	    __v = __bswap_constant_32 (__x);				      \
> -	  else								      \
> -	    __asm__ ("bswap %0" : "=r" (__v) : "0" (__x));		      \
> -	  __v; }))
> -#  else
> -#   define __bswap_32(x)						      \
> -      (__extension__							      \
> -       ({ unsigned int __v, __x = (x);					      \
> -	  if (__builtin_constant_p (__x))				      \
> -	    __v = __bswap_constant_32 (__x);				      \
> -	  else								      \
> -	    __asm__ ("rorw $8, %w0;"					      \
> -		     "rorl $16, %0;"					      \
> -		     "rorw $8, %w0"					      \
> -		     : "=r" (__v)					      \
> -		     : "0" (__x)					      \
> -		     : "cc");						      \
> -	  __v; }))
> -#  endif
> -# else
> -#  define __bswap_32(x) \
> -     (__extension__							      \
> -      ({ unsigned int __x = (x); __bswap_constant_32 (__x); }))
> -# endif
> -#else
> -static __inline unsigned int
> -__bswap_32 (unsigned int __bsx)
> -{
> -  return __bswap_constant_32 (__bsx);
> -}
> -#endif
> -
> -
> -#if __GNUC_PREREQ (2, 0)
> -/* Swap bytes in 64 bit value.  */
> -# define __bswap_constant_64(x) \
> -     (__extension__ ((((x) & 0xff00000000000000ull) >> 56)		      \
> -		     | (((x) & 0x00ff000000000000ull) >> 40)		      \
> -		     | (((x) & 0x0000ff0000000000ull) >> 24)		      \
> -		     | (((x) & 0x000000ff00000000ull) >> 8)		      \
> -		     | (((x) & 0x00000000ff000000ull) << 8)		      \
> -		     | (((x) & 0x0000000000ff0000ull) << 24)		      \
> -		     | (((x) & 0x000000000000ff00ull) << 40)		      \
> -		     | (((x) & 0x00000000000000ffull) << 56)))
> -
> -# if __GNUC_PREREQ (4, 3)
> -static __inline __uint64_t
> -__bswap_64 (__uint64_t __bsx)
> -{
> -  return __builtin_bswap64 (__bsx);
> -}
> -# elif __WORDSIZE == 64
> -#  define __bswap_64(x) \
> -     (__extension__							      \
> -      ({ __uint64_t __v, __x = (x);					      \
> -	 if (__builtin_constant_p (__x))				      \
> -	   __v = __bswap_constant_64 (__x);				      \
> -	 else								      \
> -	   __asm__ ("bswap %q0" : "=r" (__v) : "0" (__x));		      \
> -	 __v; }))
> -# else
> -#  define __bswap_64(x) \
> -     (__extension__                                                           \
> -      ({ union { __extension__ __uint64_t __ll;		                      \
> -		 unsigned int __l[2]; } __w, __r;                             \
> -	 if (__builtin_constant_p (x))                                        \
> -	   __r.__ll = __bswap_constant_64 (x);                                \
> -	 else                                                                 \
> -	   {                                                                  \
> -	     __w.__ll = (x);                                                  \
> -	     __r.__l[0] = __bswap_32 (__w.__l[1]);                            \
> -	     __r.__l[1] = __bswap_32 (__w.__l[0]);                            \
> -	   }                                                                  \
> -	 __r.__ll; }))
> -# endif
> -#else
> -# define __bswap_constant_64(x) \
> -     ((((x) & 0xff00000000000000ull) >> 56)				      \
> -      | (((x) & 0x00ff000000000000ull) >> 40)				      \
> -      | (((x) & 0x0000ff0000000000ull) >> 24)				      \
> -      | (((x) & 0x000000ff00000000ull) >> 8)				      \
> -      | (((x) & 0x00000000ff000000ull) << 8)				      \
> -      | (((x) & 0x0000000000ff0000ull) << 24)				      \
> -      | (((x) & 0x000000000000ff00ull) << 40)				      \
> -      | (((x) & 0x00000000000000ffull) << 56))
> -
> -static __inline __uint64_t
> -__bswap_64 (__uint64_t __bsx)
> -{
> -  return __bswap_constant_64 (__bsx);
> -}
> -#endif
> -
> -#endif /* _BITS_BYTESWAP_H */
> 

Ok.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]