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) | expand |
Ping. This patch <https://sourceware.org/ml/libc-alpha/2018-02/msg00031.html> is pending review.
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.
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.
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 */