Line data    Source code 
       1              : /* Macros and inline functions to swap the order of bytes in integer values.
       2              :    Copyright (C) 1997-2025 Free Software Foundation, Inc.
       3              :    This file is part of the GNU C Library.
       4              : 
       5              :    The GNU C Library is free software; you can redistribute it and/or
       6              :    modify it under the terms of the GNU Lesser General Public
       7              :    License as published by the Free Software Foundation; either
       8              :    version 2.1 of the License, or (at your option) any later version.
       9              : 
      10              :    The GNU C Library is distributed in the hope that it will be useful,
      11              :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13              :    Lesser General Public License for more details.
      14              : 
      15              :    You should have received a copy of the GNU Lesser General Public
      16              :    License along with the GNU C Library; if not, see
      17              :    <https://www.gnu.org/licenses/>.  */
      18              : 
      19              : #if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
      20              : # error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
      21              : #endif
      22              : 
      23              : #ifndef _BITS_BYTESWAP_H
      24              : #define _BITS_BYTESWAP_H 1
      25              : 
      26              : #include <features.h>
      27              : #include <bits/types.h>
      28              : 
      29              : /* Swap bytes in 16-bit value.  */
      30              : #define __bswap_constant_16(x)                                  \
      31              :   ((__uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
      32              : 
      33              : static __inline __uint16_t
      34              : __bswap_16 (__uint16_t __bsx)
      35              : {
      36              : #if __GNUC_PREREQ (4, 8)
      37              :   return __builtin_bswap16 (__bsx);
      38              : #else
      39              :   return __bswap_constant_16 (__bsx);
      40              : #endif
      41              : }
      42              : 
      43              : /* Swap bytes in 32-bit value.  */
      44              : #define __bswap_constant_32(x)                                  \
      45              :   ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) \
      46              :    | (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24))
      47              : 
      48              : static __inline __uint32_t
      49              : __bswap_32 (__uint32_t __bsx)
      50              : {
      51              : #if __GNUC_PREREQ (4, 3)
      52              :   return __builtin_bswap32 (__bsx);
      53              : #else
      54              :   return __bswap_constant_32 (__bsx);
      55              : #endif
      56              : }
      57              : 
      58              : /* Swap bytes in 64-bit value.  */
      59              : #define __bswap_constant_64(x)                  \
      60              :   ((((x) & 0xff00000000000000ull) >> 56)      \
      61              :    | (((x) & 0x00ff000000000000ull) >> 40)    \
      62              :    | (((x) & 0x0000ff0000000000ull) >> 24)    \
      63              :    | (((x) & 0x000000ff00000000ull) >> 8)     \
      64              :    | (((x) & 0x00000000ff000000ull) << 8)     \
      65              :    | (((x) & 0x0000000000ff0000ull) << 24)    \
      66              :    | (((x) & 0x000000000000ff00ull) << 40)    \
      67              :    | (((x) & 0x00000000000000ffull) << 56))
      68              : 
      69              : __extension__ static __inline __uint64_t
      70          150 : __bswap_64 (__uint64_t __bsx)
      71              : {
      72              : #if __GNUC_PREREQ (4, 3)
      73          150 :   return __builtin_bswap64 (__bsx);
      74              : #else
      75              :   return __bswap_constant_64 (__bsx);
      76              : #endif
      77              : }
      78              : 
      79              : #endif /* _BITS_BYTESWAP_H */
        
               |