File indexing completed on 2024-05-12 04:51:14
0001 /* From the mplayer project (www.mplayerhq.hu) */ 0002 0003 #ifndef __BSWAP_H__ 0004 #define __BSWAP_H__ 0005 0006 #include "config-k3b.h" 0007 0008 #ifdef HAVE_BYTESWAP_H 0009 #include <byteswap.h> 0010 #else 0011 0012 #ifdef ARCH_X86 0013 inline static unsigned short ByteSwap16(unsigned short x) 0014 { 0015 __asm("xchgb %b0,%h0" : 0016 "=q" (x) : 0017 "0" (x)); 0018 return x; 0019 } 0020 #define bswap_16(x) ByteSwap16(x) 0021 0022 inline static unsigned int ByteSwap32(unsigned int x) 0023 { 0024 #if defined(__CPU__) && (__CPU__ > 386) 0025 __asm("bswap %0": 0026 "=r" (x) : 0027 #else 0028 __asm("xchgb %b0,%h0\n" 0029 " rorl $16,%0\n" 0030 " xchgb %b0,%h0": 0031 "=q" (x) : 0032 #endif 0033 "0" (x)); 0034 return x; 0035 } 0036 #define bswap_32(x) ByteSwap32(x) 0037 0038 inline static unsigned long long int ByteSwap64(unsigned long long int x) 0039 { 0040 register union { __extension__ unsigned long long int __ll; 0041 unsigned int __l[2]; } __x; 0042 asm("xchgl %0,%1": 0043 "=r"(__x.__l[0]),"=r"(__x.__l[1]): 0044 "0"(bswap_32((unsigned long)x)),"1"(bswap_32((unsigned long)(x>>32)))); 0045 return __x.__ll; 0046 } 0047 #define bswap_64(x) ByteSwap64(x) 0048 0049 #else 0050 0051 #define bswap_16(x) (((x) & 0x00ff) << 8 | ((x) & 0xff00) >> 8) 0052 0053 0054 /* code from bits/byteswap.h (C) 1997, 1998 Free Software Foundation, Inc. */ 0055 #define bswap_32(x) \ 0056 ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \ 0057 (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)) 0058 0059 #define bswap_64(x) \ 0060 (__extension__ \ 0061 ({ union { __extension__ unsigned long long int __ll; \ 0062 unsigned int __l[2]; } __w, __r; \ 0063 __w.__ll = (x); \ 0064 __r.__l[0] = bswap_32 (__w.__l[1]); \ 0065 __r.__l[1] = bswap_32 (__w.__l[0]); \ 0066 __r.__ll; })) 0067 #endif /* !ARCH_X86 */ 0068 0069 #endif /* !HAVE_BYTESWAP_H */ 0070 0071 /* 0072 be2me ... BigEndian to MachineEndian 0073 le2me ... LittleEndian to MachineEndian 0074 */ 0075 0076 #ifdef WORDS_BIGENDIAN 0077 #define be2me_16(x) (x) 0078 #define be2me_32(x) (x) 0079 #define be2me_64(x) (x) 0080 #define le2me_16(x) bswap_16(x) 0081 #define le2me_32(x) bswap_32(x) 0082 #define le2me_64(x) bswap_64(x) 0083 #else 0084 #define be2me_16(x) bswap_16(x) 0085 #define be2me_32(x) bswap_32(x) 0086 #define be2me_64(x) bswap_64(x) 0087 #define le2me_16(x) (x) 0088 #define le2me_32(x) (x) 0089 #define le2me_64(x) (x) 0090 #endif 0091 0092 #endif