r1019: Fix crash in Ogg file handling.
[cinelerra/simeon] / mpeg2enc / fastintfns.h
1 /* fast int primitives. min,max,abs,samesign
2  *
3  * WARNING: Assumes 2's complement arithmetic.
4  *
5  */
6
7 #define fabsshift ((8*sizeof(unsigned int))-1)
8 #ifdef P6_CPU
9 static __inline__ int intmax( register int x, register int y )
10 {
11         asm( "cmpl %1, %0\n"
12              "cmovl %1, %0\n"
13          : "+r" (x) :  "r" (y)
14        );
15         return x;
16 }
17
18 static __inline__ int intmin( register int x, register int y )
19 {
20         asm( "cmpl %1, %0\n"
21              "cmovg %1, %0\n"
22          : "+r" (x) :  "rm" (y)
23        );
24         return x;
25 }
26
27 static __inline__ int intabs( register int x )
28 {
29         register int neg = -x;
30         asm( "cmpl %1, %0\n"
31              "cmovl %1, %0\n"
32          : "+r" (x) :  "r" (neg)
33        );
34         return x;
35 }
36 #else
37
38 static __inline__ int intabs(int x)
39 {
40         return ((x)-(((unsigned int)(x))>>fabsshift)) ^ ((x)>>fabsshift);
41 }
42
43 static __inline__ int intmax(int x, int y)
44 {
45         return (((x-y)>>fabsshift) & y) |  ((~((x-y)>>fabsshift)) & x);
46 }
47
48 static __inline__ int intmin(int x,int y)
49 {
50         return (((y-x)>>fabsshift) & y) |  ((~((y-x)>>fabsshift)) & x);
51 }
52
53 #endif
54
55 #define signmask(x) (((int)x)>>fabsshift)
56 static __inline__ int intsamesign(int x, int y)
57 {
58         return (y+(signmask(x) & -(y<<1)));
59 }
60 #undef signmask
61 #undef fabsshift
62