This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Unify and simplify bits/byteswap.h, bits/byteswap-16.h headers (bug 14508, bug 15512, bug 17082, bug 20530)
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Tue, 6 Feb 2018 18:10:27 -0200
- Subject: Re: Unify and simplify bits/byteswap.h, bits/byteswap-16.h headers (bug 14508, bug 15512, bug 17082, bug 20530)
- Authentication-results: sourceware.org; auth=none
- References: <alpine.DEB.2.20.1802012035390.13065@digraph.polyomino.org.uk>
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.