home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / SLAX 6.0.8 / slax-6.0.8.iso / slax / base / 006-devel.lzm / usr / include / bits / byteswap.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-11-14  |  4.7 KB  |  137 lines

  1. /* Macros to swap the order of bytes in integer values.
  2.    Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007
  3.    Free Software Foundation, Inc.
  4.    This file is part of the GNU C Library.
  5.  
  6.    The GNU C Library is free software; you can redistribute it and/or
  7.    modify it under the terms of the GNU Lesser General Public
  8.    License as published by the Free Software Foundation; either
  9.    version 2.1 of the License, or (at your option) any later version.
  10.  
  11.    The GNU C Library is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.    Lesser General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU Lesser General Public
  17.    License along with the GNU C Library; if not, write to the Free
  18.    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  19.    02111-1307 USA.  */
  20.  
  21. #if !defined _BYTESWAP_H && !defined _NETINET_IN_H
  22. # error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
  23. #endif
  24.  
  25. #ifndef _BITS_BYTESWAP_H
  26. #define _BITS_BYTESWAP_H 1
  27.  
  28. /* Swap bytes in 16 bit value.  */
  29. #define __bswap_constant_16(x) \
  30.      ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
  31.  
  32. #ifdef __GNUC__
  33. # if __GNUC__ >= 2
  34. #  define __bswap_16(x) \
  35.      (__extension__                                  \
  36.       ({ register unsigned short int __v, __x = (x);                  \
  37.      if (__builtin_constant_p (__x))                      \
  38.        __v = __bswap_constant_16 (__x);                      \
  39.      else                                      \
  40.        __asm__ ("rorw $8, %w0"                          \
  41.             : "=r" (__v)                          \
  42.              : "0" (__x)                              \
  43.              : "cc");                              \
  44.      __v; }))
  45. # else
  46. /* This is better than nothing.  */
  47. #  define __bswap_16(x) \
  48.      (__extension__                                  \
  49.       ({ register unsigned short int __x = (x); __bswap_constant_16 (__x); }))
  50. # endif
  51. #else
  52. static __inline unsigned short int
  53. __bswap_16 (unsigned short int __bsx)
  54. {
  55.   return __bswap_constant_16 (__bsx);
  56. }
  57. #endif
  58.  
  59. /* Swap bytes in 32 bit value.  */
  60. #define __bswap_constant_32(x) \
  61.      ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |              \
  62.       (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
  63.  
  64. #ifdef __GNUC__
  65. # if __GNUC__ >= 2
  66. /* To swap the bytes in a word the i486 processors and up provide the
  67.    `bswap' opcode.  On i386 we have to use three instructions.  */
  68. #  if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__ \
  69.       && !defined __pentium4__ && !defined __k8__ && !defined __athlon__ \
  70.       && !defined __k6__ && !defined __nocona__ && !defined __core2__ \
  71.       && !defined __geode__ && !defined __amdfam10__
  72. #   define __bswap_32(x)                              \
  73.      (__extension__                                  \
  74.       ({ register unsigned int __v, __x = (x);                      \
  75.      if (__builtin_constant_p (__x))                      \
  76.        __v = __bswap_constant_32 (__x);                      \
  77.      else                                      \
  78.        __asm__ ("rorw $8, %w0;"                          \
  79.             "rorl $16, %0;"                          \
  80.             "rorw $8, %w0"                          \
  81.             : "=r" (__v)                          \
  82.             : "0" (__x)                              \
  83.             : "cc");                              \
  84.      __v; }))
  85. #  else
  86. #   define __bswap_32(x) \
  87.      (__extension__                                  \
  88.       ({ register unsigned int __v, __x = (x);                      \
  89.      if (__builtin_constant_p (__x))                      \
  90.        __v = __bswap_constant_32 (__x);                      \
  91.      else                                      \
  92.        __asm__ ("bswap %0" : "=r" (__v) : "0" (__x));              \
  93.      __v; }))
  94. #  endif
  95. # else
  96. #  define __bswap_32(x) \
  97.      (__extension__                                  \
  98.       ({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
  99. # endif
  100. #else
  101. static __inline unsigned int
  102. __bswap_32 (unsigned int __bsx)
  103. {
  104.   return __bswap_constant_32 (__bsx);
  105. }
  106. #endif
  107.  
  108.  
  109. #if defined __GNUC__ && __GNUC__ >= 2
  110. /* Swap bytes in 64 bit value.  */
  111. #define __bswap_constant_64(x) \
  112.      ((((x) & 0xff00000000000000ull) >> 56)                      \
  113.       | (((x) & 0x00ff000000000000ull) >> 40)                      \
  114.       | (((x) & 0x0000ff0000000000ull) >> 24)                      \
  115.       | (((x) & 0x000000ff00000000ull) >> 8)                      \
  116.       | (((x) & 0x00000000ff000000ull) << 8)                      \
  117.       | (((x) & 0x0000000000ff0000ull) << 24)                      \
  118.       | (((x) & 0x000000000000ff00ull) << 40)                      \
  119.       | (((x) & 0x00000000000000ffull) << 56))
  120.  
  121. # define __bswap_64(x) \
  122.      (__extension__                                  \
  123.       ({ union { __extension__ unsigned long long int __ll;              \
  124.          unsigned long int __l[2]; } __w, __r;                  \
  125.          if (__builtin_constant_p (x))                          \
  126.        __r.__ll = __bswap_constant_64 (x);                      \
  127.      else                                      \
  128.        {                                      \
  129.          __w.__ll = (x);                              \
  130.          __r.__l[0] = __bswap_32 (__w.__l[1]);                  \
  131.          __r.__l[1] = __bswap_32 (__w.__l[0]);                  \
  132.        }                                      \
  133.      __r.__ll; }))
  134. #endif
  135.  
  136. #endif /* _BITS_BYTESWAP_H */
  137.