ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/trunk/xvidcore/src/portab.h
Revision: 854
Committed: Sun Feb 16 01:41:24 2003 UTC (21 years, 7 months ago) by edgomez
Content type: text/plain
File size: 15973 byte(s)
Error occurred while calculating annotation data.
Log Message:
Last changes from pete

File Contents

# Content
1 /*****************************************************************************
2 *
3 * XVID MPEG-4 VIDEO CODEC
4 * - Portable macros, types and inlined assembly -
5 *
6 * Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7 * 2002 Peter Ross <pross@xvid.org>
8 * 2002 Edouard Gomez <ed.gomez@free.fr>
9 *
10 * This file is part of XviD, a free MPEG-4 video encoder/decoder
11 *
12 * XviD is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 *
26 * $Id: portab.h,v 1.44 2003-02-16 01:41:24 edgomez Exp $
27 *
28 ****************************************************************************/
29
30 #ifndef _PORTAB_H_
31 #define _PORTAB_H_
32
33 /*****************************************************************************
34 * Common things
35 ****************************************************************************/
36
37 /* Debug level masks */
38 #define DPRINTF_ERROR 0x00000001
39 #define DPRINTF_STARTCODE 0x00000002
40 #define DPRINTF_HEADER 0x00000004
41 #define DPRINTF_TIMECODE 0x00000008
42 #define DPRINTF_MB 0x00000010
43 #define DPRINTF_COEFF 0x00000020
44 #define DPRINTF_MV 0x00000040
45 #define DPRINTF_RC 0x00000080
46 #define DPRINTF_DEBUG 0x80000000
47
48 /* debug level for this library */
49 #ifdef _DEBUG
50 #define DPRINTF_LEVEL 0x000000ff
51 #else
52 #define DPRINTF_LEVEL 0
53 #endif
54
55 /* Buffer size for msvc implementation because it outputs to DebugOutput */
56 #define DPRINTF_BUF_SZ 1024
57
58 /*****************************************************************************
59 * Types used in XviD sources
60 ****************************************************************************/
61
62 /*----------------------------------------------------------------------------
63 | For MSVC
64 *---------------------------------------------------------------------------*/
65
66 #if defined(_MSC_VER) || defined (__WATCOMC__)
67 # define int8_t char
68 # define uint8_t unsigned char
69 # define int16_t short
70 # define uint16_t unsigned short
71 # define int32_t int
72 # define uint32_t unsigned int
73 # define int64_t __int64
74 # define uint64_t unsigned __int64
75
76 /*----------------------------------------------------------------------------
77 | For all other compilers, use the standard header file
78 | (compiler should be ISO C99 compatible, perhaps ISO C89 is enough)
79 *---------------------------------------------------------------------------*/
80
81 #else
82
83 # include <inttypes.h>
84
85 #endif
86
87 /*****************************************************************************
88 * Some things that are only architecture dependant
89 ****************************************************************************/
90
91 #if defined(ARCH_IS_32BIT)
92 # define CACHE_LINE 16
93 # define ptr_t uint32_t
94 #elif defined(ARCH_IS_64BIT)
95 # define CACHE_LINE 32
96 # define ptr_t uint64_t
97 #else
98 # error You are trying to compile XviD without defining address bus size.
99 #endif
100
101 /*****************************************************************************
102 * Things that must be sorted by compiler and then by architecture
103 ****************************************************************************/
104
105 /*****************************************************************************
106 * MSVC compiler specific macros, functions
107 ****************************************************************************/
108
109 #if defined(_MSC_VER)
110
111 /*----------------------------------------------------------------------------
112 | Common msvc stuff
113 *---------------------------------------------------------------------------*/
114
115 # include <windows.h>
116 # include <stdio.h>
117
118 /* Non ANSI mapping */
119 # define snprintf _snprintf
120 # define vsnprintf _vsnprintf
121
122 /*
123 * This function must be declared/defined all the time because MSVC does
124 * not support C99 variable arguments macros.
125 *
126 * Btw, if the MS compiler does its job well, it should remove the nop
127 * DPRINTF function when not compiling in _DEBUG mode
128 */
129 # ifdef _DEBUG
130 static __inline void DPRINTF(int level, char *fmt, ...)
131 {
132 if (DPRINTF_LEVEL & level) {
133 va_list args;
134 char buf[DPRINTF_BUF_SZ];
135 va_start(args, fmt);
136 vsprintf(buf, fmt, args);
137 OutputDebugString(buf);
138 fprintf(stderr, "%s\n", buf);
139 }
140 }
141 # else
142 static __inline void DPRINTF(int level, char *fmt, ...)
143 {
144 }
145 # endif
146
147 # if _MSC_VER <= 1200
148 # define DECLARE_ALIGNED_MATRIX(name,sizex,sizey,type,alignment) \
149 type name##_storage[(sizex)*(sizey)+(alignment)-1]; \
150 type * name = (type *) (((int32_t) name##_storage+(alignment - 1)) & ~((int32_t)(alignment)-1))
151 # else
152 # define DECLARE_ALIGNED_MATRIX(name,sizex,sizey,type,alignment) \
153 __declspec(align(alignment)) type name[(sizex)*(sizey)]
154 # endif
155
156
157 /*----------------------------------------------------------------------------
158 | msvc x86 specific macros/functions
159 *---------------------------------------------------------------------------*/
160 # if defined(ARCH_IS_IA32)
161 # define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax
162
163 # ifdef _PROFILING_
164 static __inline int64_t read_counter(void)
165 {
166 int64_t ts;
167 uint32_t ts1, ts2;
168 __asm {
169 rdtsc
170 mov ts1, eax
171 mov ts2, edx
172 }
173 ts = ((uint64_t) ts2 << 32) | ((uint64_t) ts1);
174 return ts;
175 }
176 # endif
177
178 /*----------------------------------------------------------------------------
179 | msvc GENERIC (plain C only) - Probably alpha or some embedded device
180 *---------------------------------------------------------------------------*/
181 # elif defined(ARCH_IS_GENERIC)
182 # define BSWAP(a) \
183 ((a) = (((a) & 0xff) << 24) | (((a) & 0xff00) << 8) | \
184 (((a) >> 8) & 0xff00) | (((a) >> 24) & 0xff))
185
186 # ifdef _PROFILING_
187 # include <time.h>
188 static __inline int64_t read_counter(void)
189 {
190 return (int64_t)clock();
191 }
192 # endif
193
194 /*----------------------------------------------------------------------------
195 | msvc Not given architecture - This is probably an user who tries to build
196 | XviD the wrong way.
197 *---------------------------------------------------------------------------*/
198 # else
199 # error You are trying to compile XviD without defining the architecture type.
200 # endif
201
202
203
204
205 /*****************************************************************************
206 * GNU CC compiler stuff
207 ****************************************************************************/
208
209 #elif defined(__GNUC__) || defined(__ICC) /* Compiler test */
210
211 /*----------------------------------------------------------------------------
212 | Common gcc stuff
213 *---------------------------------------------------------------------------*/
214
215 /*
216 * As gcc is (mostly) C99 compliant, we define DPRINTF only if it's realy needed
217 * and it's a macro calling fprintf directly
218 */
219 # ifdef _DEBUG
220
221 /* Needed for all debuf fprintf calls */
222 # include <stdio.h>
223 # include <stdarg.h>
224
225 static __inline void DPRINTF(int level, char *format, ...)
226 {
227 va_list args;
228 va_start(args, format);
229 if(DPRINTF_LEVEL & level) {
230 vfprintf(stderr, format, args);
231 fprintf(stderr, "\n");
232 }
233 }
234
235 # else /* _DEBUG */
236 static __inline void DPRINTF(int level, char *format, ...) {}
237 # endif /* _DEBUG */
238
239
240 # define DECLARE_ALIGNED_MATRIX(name,sizex,sizey,type,alignment) \
241 type name##_storage[(sizex)*(sizey)+(alignment)-1]; \
242 type * name = (type *) (((ptr_t) name##_storage+(alignment - 1)) & ~((ptr_t)(alignment)-1))
243
244 /*----------------------------------------------------------------------------
245 | gcc IA32 specific macros/functions
246 *---------------------------------------------------------------------------*/
247 # if defined(ARCH_IS_IA32)
248 # define BSWAP(a) __asm__ ( "bswapl %0\n" : "=r" (a) : "0" (a) );
249
250 # ifdef _PROFILING_
251 static __inline int64_t read_counter(void)
252 {
253 int64_t ts;
254 uint32_t ts1, ts2;
255 __asm__ __volatile__("rdtsc\n\t":"=a"(ts1), "=d"(ts2));
256 ts = ((uint64_t) ts2 << 32) | ((uint64_t) ts1);
257 return ts;
258 }
259 # endif
260
261 /*----------------------------------------------------------------------------
262 | gcc PPC and PPC Altivec specific macros/functions
263 *---------------------------------------------------------------------------*/
264 # elif defined(ARCH_IS_PPC)
265 # define BSWAP(a) __asm__ __volatile__ \
266 ( "lwbrx %0,0,%1; eieio" : "=r" (a) : "r" (&(a)), "m" (a));
267
268 # ifdef _PROFILING_
269 static __inline unsigned long get_tbl(void)
270 {
271 unsigned long tbl;
272 asm volatile ("mftb %0":"=r" (tbl));
273 return tbl;
274 }
275
276 static __inline unsigned long get_tbu(void)
277 {
278 unsigned long tbl;
279 asm volatile ("mftbu %0":"=r" (tbl));
280 return tbl;
281 }
282
283 static __inline int64_t read_counter(void)
284 {
285 unsigned long tb, tu;
286 do {
287 tu = get_tbu();
288 tb = get_tbl();
289 }while (tb != get_tbl());
290 return (((int64_t) tu) << 32) | (int64_t) tb;
291 }
292 # endif
293
294 /*----------------------------------------------------------------------------
295 | gcc IA64 specific macros/functions
296 *---------------------------------------------------------------------------*/
297 # elif defined(ARCH_IS_IA64)
298 # define BSWAP(a) __asm__ __volatile__ \
299 ("mux1 %1 = %0, @rev" ";;" \
300 "shr.u %1 = %1, 32" : "=r" (a) : "r" (a));
301
302 # ifdef _PROFILING_
303 static __inline int64_t read_counter(void)
304 {
305 unsigned long result;
306 __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory");
307 return result;
308 }
309 # endif
310
311 /*----------------------------------------------------------------------------
312 | gcc GENERIC (plain C only) specific macros/functions
313 *---------------------------------------------------------------------------*/
314 # elif defined(ARCH_IS_GENERIC)
315 # define BSWAP(a) \
316 ((a) = (((a) & 0xff) << 24) | (((a) & 0xff00) << 8) | \
317 (((a) >> 8) & 0xff00) | (((a) >> 24) & 0xff))
318
319 # ifdef _PROFILING_
320 # include <time.h>
321 static __inline int64_t read_counter(void)
322 {
323 return (int64_t)clock();
324 }
325 # endif
326
327 /*----------------------------------------------------------------------------
328 | gcc Not given architecture - This is probably an user who tries to build
329 | XviD the wrong way.
330 *---------------------------------------------------------------------------*/
331 # else
332 # error You are trying to compile XviD without defining the architecture type.
333 # endif
334
335
336
337
338 /*****************************************************************************
339 * Open WATCOM C/C++ compiler
340 ****************************************************************************/
341
342 #elif defined(__WATCOMC__)
343
344 # include <stdio.h>
345 # include <stdarg.h>
346
347 # ifdef _DEBUG
348 static __inline void DPRINTF(int level, char *fmt, ...)
349 {
350 if (DPRINTF_LEVEL & level) {
351 va_list args;
352 char buf[DPRINTF_BUF_SZ];
353 va_start(args, fmt);
354 vsprintf(buf, fmt, args);
355 fprintf(stderr, "%s\n", buf);
356 }
357 }
358 # else /* _DEBUG */
359 static __inline void DPRINTF(int level, char *format, ...) {}
360 # endif /* _DEBUG */
361
362 # define DECLARE_ALIGNED_MATRIX(name,sizex,sizey,type,alignment) \
363 type name##_storage[(sizex)*(sizey)+(alignment)-1]; \
364 type * name = (type *) (((int32_t) name##_storage+(alignment - 1)) & ~((int32_t)(alignment)-1))
365
366 /*----------------------------------------------------------------------------
367 | watcom ia32 specific macros/functions
368 *---------------------------------------------------------------------------*/
369 # if defined(ARCH_IS_IA32)
370
371 # define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax
372
373 # ifdef _PROFILING_
374 static __inline int64_t read_counter(void)
375 {
376 uint64_t ts;
377 uint32_t ts1, ts2;
378 __asm {
379 rdtsc
380 mov ts1, eax
381 mov ts2, edx
382 }
383 ts = ((uint64_t) ts2 << 32) | ((uint64_t) ts1);
384 return ts;
385 }
386 # endif
387
388 /*----------------------------------------------------------------------------
389 | watcom GENERIC (plain C only) specific macros/functions.
390 *---------------------------------------------------------------------------*/
391 # elif defined(ARCH_IS_GENERIC)
392
393 # define BSWAP(x) \
394 x = ((((x) & 0xff000000) >> 24) | \
395 (((x) & 0x00ff0000) >> 8) | \
396 (((x) & 0x0000ff00) << 8) | \
397 (((x) & 0x000000ff) << 24))
398
399 # ifdef _PROFILING_
400 static int64_t read_counter() { return 0; }
401 # endif
402
403 /*----------------------------------------------------------------------------
404 | watcom Not given architecture - This is probably an user who tries to build
405 | XviD the wrong way.
406 *---------------------------------------------------------------------------*/
407 # else
408 # error You are trying to compile XviD without defining the architecture type.
409 # endif
410
411
412 /*****************************************************************************
413 * Unknown compiler
414 ****************************************************************************/
415 #else /* Compiler test */
416
417 /*
418 * Ok we know nothing about the compiler, so we fallback to ANSI C
419 * features, so every compiler should be happy and compile the code.
420 *
421 * This is (mostly) equivalent to ARCH_IS_GENERIC.
422 */
423
424 # ifdef _DEBUG
425
426 /* Needed for all debuf fprintf calls */
427 # include <stdio.h>
428 # include <stdarg.h>
429
430 static __inline void DPRINTF(int level, char *format, ...)
431 {
432 va_list args;
433 va_start(args, format);
434 if(DPRINTF_LEVEL & level) {
435 vfprintf(stderr, format, args);
436 fprintf(stderr, "\n");
437 }
438 }
439
440 # else /* _DEBUG */
441 static __inline void DPRINTF(int level, char *format, ...) {}
442 # endif /* _DEBUG */
443
444 # define BSWAP(a) \
445 ((a) = (((a) & 0xff) << 24) | (((a) & 0xff00) << 8) | \
446 (((a) >> 8) & 0xff00) | (((a) >> 24) & 0xff))
447
448 # ifdef _PROFILING_
449 # include <time.h>
450 static __inline int64_t read_counter(void)
451 {
452 return (int64_t)clock();
453 }
454 # endif
455
456 # define DECLARE_ALIGNED_MATRIX(name,sizex,sizey,type,alignment) \
457 type name[(sizex)*(sizey)]
458
459 #endif /* Compiler test */
460
461
462 #endif /* PORTAB_H */