bswap.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:4k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*
  2.  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg 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.  * FFmpeg 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 FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20. /**
  21.  * @file bswap.h
  22.  * byte swap.
  23.  */
  24. #ifndef __BSWAP_H__
  25. #define __BSWAP_H__
  26. #ifdef HAVE_BYTESWAP_H
  27. #include <byteswap.h>
  28. #else
  29. #undef ROCKBOX
  30. #ifdef ROCKBOX
  31. /* rockbox' optimised inline functions */
  32. #define bswap_16(x) swap16(x)
  33. #define bswap_32(x) swap32(x)
  34. static inline uint64_t ByteSwap64(uint64_t x)
  35. {
  36.     union { 
  37.         uint64_t ll;
  38.         struct {
  39.            uint32_t l,h;
  40.         } l;
  41.     } r;
  42.     r.l.l = bswap_32 (x);
  43.     r.l.h = bswap_32 (x>>32);
  44.     return r.ll;
  45. }
  46. #define bswap_64(x) ByteSwap64(x)
  47. #elif defined(ARCH_X86)
  48. static inline unsigned short ByteSwap16(unsigned short x)
  49. {
  50.   __asm("xchgb %b0,%h0" :
  51.         "=q" (x) :
  52.         "0" (x));
  53.     return x;
  54. }
  55. #define bswap_16(x) ByteSwap16(x)
  56. static inline unsigned int ByteSwap32(unsigned int x)
  57. {
  58. #if __CPU__ > 386
  59.  __asm("bswap %0":
  60.       "=r" (x)     :
  61. #else
  62.  __asm("xchgb %b0,%h0n"
  63.       " rorl $16,%0n"
  64.       " xchgb %b0,%h0":
  65.       "=q" (x) :
  66. #endif
  67.       "0" (x));
  68.   return x;
  69. }
  70. #define bswap_32(x) ByteSwap32(x)
  71. static inline unsigned long long int ByteSwap64(unsigned long long int x)
  72. {
  73.   register union { __extension__ uint64_t __ll;
  74.           uint32_t __l[2]; } __x;
  75.   asm("xchgl %0,%1":
  76.       "=r"(__x.__l[0]),"=r"(__x.__l[1]):
  77.       "0"(bswap_32((unsigned long)x)),"1"(bswap_32((unsigned long)(x>>32))));
  78.   return __x.__ll;
  79. }
  80. #define bswap_64(x) ByteSwap64(x)
  81. #elif defined(ARCH_SH4)
  82. static inline uint16_t ByteSwap16(uint16_t x) {
  83. __asm__("swap.b %0,%0":"=r"(x):"0"(x));
  84. return x;
  85. }
  86. static inline uint32_t ByteSwap32(uint32_t x) {
  87. __asm__(
  88. "swap.b %0,%0n"
  89. "swap.w %0,%0n"
  90. "swap.b %0,%0n"
  91. :"=r"(x):"0"(x));
  92. return x;
  93. }
  94. #define bswap_16(x) ByteSwap16(x)
  95. #define bswap_32(x) ByteSwap32(x)
  96. static inline uint64_t ByteSwap64(uint64_t x)
  97. {
  98.     union { 
  99.         uint64_t ll;
  100.         struct {
  101.            uint32_t l,h;
  102.         } l;
  103.     } r;
  104.     r.l.l = bswap_32 (x);
  105.     r.l.h = bswap_32 (x>>32);
  106.     return r.ll;
  107. }
  108. #define bswap_64(x) ByteSwap64(x)
  109. #else
  110. #define bswap_16(x) (((x) & 0x00ff) << 8 | ((x) & 0xff00) >> 8)
  111. // code from bits/byteswap.h (C) 1997, 1998 Free Software Foundation, Inc.
  112. #define bswap_32(x) 
  113.      ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | 
  114.       (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
  115. static inline uint64_t ByteSwap64(uint64_t x)
  116. {
  117.     union { 
  118.         uint64_t ll;
  119.         uint32_t l[2]; 
  120.     } w, r;
  121.     w.ll = x;
  122.     r.l[0] = bswap_32 (w.l[1]);
  123.     r.l[1] = bswap_32 (w.l[0]);
  124.     return r.ll;
  125. }
  126. #define bswap_64(x) ByteSwap64(x)
  127. #endif /* !ARCH_X86 */
  128. #endif /* !HAVE_BYTESWAP_H */
  129. // be2me ... BigEndian to MachineEndian
  130. // le2me ... LittleEndian to MachineEndian
  131. #ifdef WORDS_BIGENDIAN
  132. #define be2me_16(x) (x)
  133. #define be2me_32(x) (x)
  134. #define be2me_64(x) (x)
  135. #define le2me_16(x) bswap_16(x)
  136. #define le2me_32(x) bswap_32(x)
  137. #define le2me_64(x) bswap_64(x)
  138. #else
  139. #define be2me_16(x) bswap_16(x)
  140. #define be2me_32(x) bswap_32(x)
  141. #define be2me_64(x) bswap_64(x)
  142. #define le2me_16(x) (x)
  143. #define le2me_32(x) (x)
  144. #define le2me_64(x) (x)
  145. #endif
  146. #endif /* __BSWAP_H__ */