diff options
-rw-r--r-- | ChangeLog | 34 | ||||
-rw-r--r-- | bits/byteswap.h | 101 | ||||
-rw-r--r-- | string/Makefile | 6 | ||||
-rw-r--r-- | string/test-endian-file-scope.c | 44 | ||||
-rw-r--r-- | string/test-endian-sign-conversion.c (renamed from bits/byteswap-16.h) | 44 | ||||
-rw-r--r-- | sysdeps/ia64/bits/byteswap-16.h | 42 | ||||
-rw-r--r-- | sysdeps/ia64/bits/byteswap.h | 100 | ||||
-rw-r--r-- | sysdeps/m68k/bits/byteswap.h | 88 | ||||
-rw-r--r-- | sysdeps/s390/bits/byteswap-16.h | 65 | ||||
-rw-r--r-- | sysdeps/s390/bits/byteswap.h | 134 | ||||
-rw-r--r-- | sysdeps/tile/bits/byteswap.h | 37 | ||||
-rw-r--r-- | sysdeps/x86/bits/byteswap-16.h | 49 | ||||
-rw-r--r-- | sysdeps/x86/bits/byteswap.h | 155 |
13 files changed, 145 insertions, 754 deletions
@@ -1,5 +1,39 @@ 2018-02-06 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. + [BZ #17721] * misc/sys/cdefs.h [!__GNUC__ && (__cplusplus || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L))] (__inline): Define to inline. 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/bits/byteswap-16.h b/string/test-endian-sign-conversion.c index 0fbd8d6..cc6b516 100644 --- a/bits/byteswap-16.h +++ b/string/test-endian-sign-conversion.c @@ -1,5 +1,5 @@ -/* Macros to swap the order of bytes in 16-bit integer values. - Copyright (C) 2012-2018 Free Software Foundation, Inc. +/* 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 @@ -16,19 +16,33 @@ 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 <endian.h> +#include <stdint.h> -#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) +uint16_t u16; +uint32_t u32; +uint64_t u64; + +static int +do_test (void) { - return __bswap_constant_16 (__bsx); + /* 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; } -#endif + +#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 */ |