00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00026 #ifndef FFMPEG_BSWAP_H
00027 #define FFMPEG_BSWAP_H
00028
00029 #include <stdint.h>
00030 #include "common.h"
00031
00032 #ifdef HAVE_BYTESWAP_H
00033 #include <byteswap.h>
00034 #else
00035
00036 #ifdef ARCH_X86_64
00037 # define LEGACY_REGS "=Q"
00038 #else
00039 # define LEGACY_REGS "=q"
00040 #endif
00041
00042 static av_always_inline uint16_t bswap_16(uint16_t x)
00043 {
00044 #if defined(ARCH_X86)
00045 __asm("rorw $8, %0" :
00046 LEGACY_REGS (x) :
00047 "0" (x));
00048 #elif defined(ARCH_SH4)
00049 __asm__("swap.b %0,%0":"=r"(x):"0"(x));
00050 #else
00051 x= (x>>8) | (x<<8);
00052 #endif
00053 return x;
00054 }
00055
00056 static av_always_inline uint32_t bswap_32(uint32_t x)
00057 {
00058 #if defined(ARCH_X86)
00059 #if __CPU__ != 386
00060 __asm("bswap %0":
00061 "=r" (x) :
00062 #else
00063 __asm("xchgb %b0,%h0\n"
00064 " rorl $16,%0\n"
00065 " xchgb %b0,%h0":
00066 LEGACY_REGS (x) :
00067 #endif
00068 "0" (x));
00069 #elif defined(ARCH_SH4)
00070 __asm__(
00071 "swap.b %0,%0\n"
00072 "swap.w %0,%0\n"
00073 "swap.b %0,%0\n"
00074 :"=r"(x):"0"(x));
00075 #elif defined(ARCH_ARM)
00076 uint32_t t;
00077 __asm__ (
00078 "eor %1, %0, %0, ror #16 \n\t"
00079 "bic %1, %1, #0xFF0000 \n\t"
00080 "mov %0, %0, ror #8 \n\t"
00081 "eor %0, %0, %1, lsr #8 \n\t"
00082 : "+r"(x), "+r"(t));
00083 #elif defined(ARCH_BFIN)
00084 unsigned tmp;
00085 asm("%1 = %0 >> 8 (V);\n\t"
00086 "%0 = %0 << 8 (V);\n\t"
00087 "%0 = %0 | %1;\n\t"
00088 "%0 = PACK(%0.L, %0.H);\n\t"
00089 : "+d"(x), "=&d"(tmp));
00090 #else
00091 x= ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
00092 x= (x>>16) | (x<<16);
00093 #endif
00094 return x;
00095 }
00096
00097 static inline uint64_t bswap_64(uint64_t x)
00098 {
00099 #if 0
00100 x= ((x<< 8)&0xFF00FF00FF00FF00ULL) | ((x>> 8)&0x00FF00FF00FF00FFULL);
00101 x= ((x<<16)&0xFFFF0000FFFF0000ULL) | ((x>>16)&0x0000FFFF0000FFFFULL);
00102 return (x>>32) | (x<<32);
00103 #elif defined(ARCH_X86_64)
00104 __asm("bswap %0":
00105 "=r" (x) :
00106 "0" (x));
00107 return x;
00108 #else
00109 union {
00110 uint64_t ll;
00111 uint32_t l[2];
00112 } w, r;
00113 w.ll = x;
00114 r.l[0] = bswap_32 (w.l[1]);
00115 r.l[1] = bswap_32 (w.l[0]);
00116 return r.ll;
00117 #endif
00118 }
00119
00120 #endif
00121
00122
00123
00124
00125 #ifdef WORDS_BIGENDIAN
00126 #define be2me_16(x) (x)
00127 #define be2me_32(x) (x)
00128 #define be2me_64(x) (x)
00129 #define le2me_16(x) bswap_16(x)
00130 #define le2me_32(x) bswap_32(x)
00131 #define le2me_64(x) bswap_64(x)
00132 #else
00133 #define be2me_16(x) bswap_16(x)
00134 #define be2me_32(x) bswap_32(x)
00135 #define be2me_64(x) bswap_64(x)
00136 #define le2me_16(x) (x)
00137 #define le2me_32(x) (x)
00138 #define le2me_64(x) (x)
00139 #endif
00140
00141 #endif