ffmpeg / libavcodec / bswap.h @ b17c92d1
History  View  Annotate  Download (2.05 KB)
1 
#ifndef __BSWAP_H__


2 
#define __BSWAP_H__

3  
4 
#ifdef HAVE_BYTESWAP_H

5 
#include <byteswap.h> 
6 
#else

7  
8 
#ifdef ARCH_X86

9 
inline static unsigned short ByteSwap16(unsigned short x) 
10 
{ 
11 
__asm("xchgb %b0,%h0" :

12 
"=q" (x) :

13 
"0" (x));

14 
return x;

15 
} 
16 
#define bswap_16(x) ByteSwap16(x)

17  
18 
inline static unsigned int ByteSwap32(unsigned int x) 
19 
{ 
20 
#if __CPU__ > 386 
21 
__asm("bswap %0":

22 
"=r" (x) :

23 
#else

24 
__asm("xchgb %b0,%h0\n"

25 
" rorl $16,%0\n"

26 
" xchgb %b0,%h0":

27 
"=q" (x) :

28 
#endif

29 
"0" (x));

30 
return x;

31 
} 
32 
#define bswap_32(x) ByteSwap32(x)

33  
34 
inline static unsigned long long int ByteSwap64(unsigned long long int x) 
35 
{ 
36 
register union { __extension__ unsigned long long int __ll; 
37 
unsigned long int __l[2]; } __x; 
38 
asm("xchgl %0,%1": 
39 
"=r"(__x.__l[0]),"=r"(__x.__l[1]): 
40 
"0"(bswap_32((unsigned long)x)),"1"(bswap_32((unsigned long)(x>>32)))); 
41 
return __x.__ll;

42 
} 
43 
#define bswap_64(x) ByteSwap64(x)

44  
45 
#else

46  
47 
#define bswap_16(x) (((x) & 0x00ff) << 8  ((x) & 0xff00) >> 8) 
48 

49  
50 
// code from bits/byteswap.h (C) 1997, 1998 Free Software Foundation, Inc.

51 
#define bswap_32(x) \

52 
((((x) & 0xff000000) >> 24)  (((x) & 0x00ff0000) >> 8)  \ 
53 
(((x) & 0x0000ff00) << 8)  (((x) & 0x000000ff) << 24)) 
54  
55 
#define bswap_64(x) \

56 
(__extension__ \ 
57 
({ union { __extension__ unsigned long long int __ll; \ 
58 
unsigned long int __l[2]; } __w, __r; \ 
59 
__w.__ll = (x); \ 
60 
__r.__l[0] = bswap_32 (__w.__l[1]); \ 
61 
__r.__l[1] = bswap_32 (__w.__l[0]); \ 
62 
__r.__ll; })) 
63 
#endif /* !ARCH_X86 */ 
64  
65 
#endif /* !HAVE_BYTESWAP_H */ 
66  
67 
// be2me ... BigEndian to MachineEndian

68 
// le2me ... LittleEndian to MachineEndian

69  
70 
#ifdef WORDS_BIGENDIAN

71 
#define be2me_16(x) (x)

72 
#define be2me_32(x) (x)

73 
#define be2me_64(x) (x)

74 
#define le2me_16(x) bswap_16(x)

75 
#define le2me_32(x) bswap_32(x)

76 
#define le2me_64(x) bswap_64(x)

77 
#else

78 
#define be2me_16(x) bswap_16(x)

79 
#define be2me_32(x) bswap_32(x)

80 
#define be2me_64(x) bswap_64(x)

81 
#define le2me_16(x) (x)

82 
#define le2me_32(x) (x)

83 
#define le2me_64(x) (x)

84 
#endif

85  
86 
#endif /* __BSWAP_H__ */ 