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