annotate bswap.h @ 1352:e8ff4783f188 libavcodec

1) remove TBL support in PPC performance. It's much more useful to use the PMCs, and with Apple's CHUD it's fairly easy too. No reason to keep useless code around 2) make the PPC perf stuff a configure option 3) make put_pixels16_altivec a bit faster by unrolling the loop by 4 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
author michaelni
date Wed, 09 Jul 2003 20:18:13 +0000
parents e8c3884f2c7e
children 1831d86117a3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1106
1e39f273ecd6 per file doxy
michaelni
parents: 433
diff changeset
1 /**
1e39f273ecd6 per file doxy
michaelni
parents: 433
diff changeset
2 * @file bswap.h
1e39f273ecd6 per file doxy
michaelni
parents: 433
diff changeset
3 * byte swap.
1e39f273ecd6 per file doxy
michaelni
parents: 433
diff changeset
4 */
1e39f273ecd6 per file doxy
michaelni
parents: 433
diff changeset
5
424
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
6 #ifndef __BSWAP_H__
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
7 #define __BSWAP_H__
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
8
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
9 #ifdef HAVE_BYTESWAP_H
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
10 #include <byteswap.h>
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
11 #else
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
12
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
13 #ifdef ARCH_X86
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
14 inline static unsigned short ByteSwap16(unsigned short x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
15 {
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
16 __asm("xchgb %b0,%h0" :
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
17 "=q" (x) :
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
18 "0" (x));
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
19 return x;
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
20 }
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
21 #define bswap_16(x) ByteSwap16(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
22
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
23 inline static unsigned int ByteSwap32(unsigned int x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
24 {
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
25 #if __CPU__ > 386
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
26 __asm("bswap %0":
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
27 "=r" (x) :
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
28 #else
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
29 __asm("xchgb %b0,%h0\n"
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
30 " rorl $16,%0\n"
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
31 " xchgb %b0,%h0":
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
32 "=q" (x) :
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
33 #endif
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
34 "0" (x));
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
35 return x;
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
36 }
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
37 #define bswap_32(x) ByteSwap32(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
38
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
39 inline static unsigned long long int ByteSwap64(unsigned long long int x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
40 {
433
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
41 register union { __extension__ uint64_t __ll;
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
42 uint32_t __l[2]; } __x;
424
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
43 asm("xchgl %0,%1":
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
44 "=r"(__x.__l[0]),"=r"(__x.__l[1]):
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
45 "0"(bswap_32((unsigned long)x)),"1"(bswap_32((unsigned long)(x>>32))));
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
46 return __x.__ll;
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
47 }
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
48 #define bswap_64(x) ByteSwap64(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
49
1259
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
50 #elif defined(ARCH_SH4)
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
51
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
52 static inline uint16_t ByteSwap16(uint16_t x) {
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
53 __asm__("swap.b %0,%0":"=r"(x):"0"(x));
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
54 return x;
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
55 }
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
56
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
57 static inline uint32_t ByteSwap32(uint32_t x) {
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
58 __asm__(
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
59 "swap.b %0,%0\n"
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
60 "swap.w %0,%0\n"
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
61 "swap.b %0,%0\n"
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
62 :"=r"(x):"0"(x));
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
63 return x;
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
64 }
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
65
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
66 #define bswap_16(x) ByteSwap16(x)
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
67 #define bswap_32(x) ByteSwap32(x)
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
68
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
69 inline static uint64_t ByteSwap64(uint64_t x)
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
70 {
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
71 union {
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
72 uint64_t ll;
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
73 struct {
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
74 uint32_t l,h;
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
75 } l;
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
76 } r;
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
77 r.l.l = bswap_32 (x);
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
78 r.l.h = bswap_32 (x>>32);
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
79 return r.ll;
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
80 }
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
81 #define bswap_64(x) ByteSwap64(x)
e8c3884f2c7e sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1106
diff changeset
82
424
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
83 #else
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
84
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
85 #define bswap_16(x) (((x) & 0x00ff) << 8 | ((x) & 0xff00) >> 8)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
86
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
87
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
88 // code from bits/byteswap.h (C) 1997, 1998 Free Software Foundation, Inc.
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
89 #define bswap_32(x) \
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
90 ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
91 (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
92
433
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
93 inline static uint64_t ByteSwap64(uint64_t x)
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
94 {
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
95 union {
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
96 uint64_t ll;
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
97 uint32_t l[2];
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
98 } w, r;
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
99 w.ll = x;
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
100 r.l[0] = bswap_32 (w.l[1]);
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
101 r.l[1] = bswap_32 (w.l[0]);
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
102 return r.ll;
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
103 }
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
104 #define bswap_64(x) ByteSwap64(x)
133d2867d4b2 don't use inttypes.h - use inline function for bswap_64()
bellard
parents: 430
diff changeset
105
424
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
106 #endif /* !ARCH_X86 */
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
107
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
108 #endif /* !HAVE_BYTESWAP_H */
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
109
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
110 // be2me ... BigEndian to MachineEndian
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
111 // le2me ... LittleEndian to MachineEndian
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
112
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
113 #ifdef WORDS_BIGENDIAN
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
114 #define be2me_16(x) (x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
115 #define be2me_32(x) (x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
116 #define be2me_64(x) (x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
117 #define le2me_16(x) bswap_16(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
118 #define le2me_32(x) bswap_32(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
119 #define le2me_64(x) bswap_64(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
120 #else
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
121 #define be2me_16(x) bswap_16(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
122 #define be2me_32(x) bswap_32(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
123 #define be2me_64(x) bswap_64(x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
124 #define le2me_16(x) (x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
125 #define le2me_32(x) (x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
126 #define le2me_64(x) (x)
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
127 #endif
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
128
92b8e1affb66 moved in libavcodec
glantau
parents:
diff changeset
129 #endif /* __BSWAP_H__ */