[cvs] / xvidcore / src / portab.h Repository:
ViewVC logotype

Annotation of /xvidcore/src/portab.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.60 - (view) (download)

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

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4