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

Message ID alpine.DEB.2.20.1802012035390.13065@digraph.polyomino.org.uk
State New
Headers show
Series
  • Unify and simplify bits/byteswap.h, bits/byteswap-16.h headers (bug 14508, bug 15512, bug 17082, bug 20530)
Related show

Commit Message

Joseph Myers Feb. 1, 2018, 8:35 p.m.
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.

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.

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.


-- 
Joseph S. Myers
joseph@codesourcery.com

Comments

Joseph Myers Feb. 6, 2018, 6:01 p.m. | #1
Ping.  This patch 
<https://sourceware.org/ml/libc-alpha/2018-02/msg00031.html> is pending 
review.

-- 
Joseph S. Myers
joseph@codesourcery.com
Adhemerval Zanella Feb. 6, 2018, 8:10 p.m. | #2
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.
Joseph Myers Feb. 6, 2018, 9:52 p.m. | #3
On Tue, 6 Feb 2018, Adhemerval Zanella wrote:

> > 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?


You can't use a call to a static inline function in a static initializer; 
it needs to be a macro for those uses so it expands to a C constant 
expression.

-- 
Joseph S. Myers
joseph@codesourcery.com

Patch

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
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 */
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
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>
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>
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
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 */
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 */
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
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 */
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 */
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
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 */