/* fast int primitives. min,max,abs,samesign * * WARNING: Assumes 2's complement arithmetic. * */ #define fabsshift ((8*sizeof(unsigned int))-1) #ifdef P6_CPU static __inline__ int intmax( int x, int y ) { asm( "cmpl %1, %0\n" "cmovl %1, %0\n" : "+r" (x) : "r" (y) ); return x; } static __inline__ int intmin( int x, int y ) { asm( "cmpl %1, %0\n" "cmovg %1, %0\n" : "+r" (x) : "rm" (y) ); return x; } static __inline__ int intabs( int x ) { int neg = -x; asm( "cmpl %1, %0\n" "cmovl %1, %0\n" : "+r" (x) : "r" (neg) ); return x; } #else static __inline__ int intabs(int x) { return ((x)-(((unsigned int)(x))>>fabsshift)) ^ ((x)>>fabsshift); } static __inline__ int intmax(int x, int y) { return (((x-y)>>fabsshift) & y) | ((~((x-y)>>fabsshift)) & x); } static __inline__ int intmin(int x,int y) { return (((y-x)>>fabsshift) & y) | ((~((y-x)>>fabsshift)) & x); } #endif #define signmask(x) (((int)x)>>fabsshift) static __inline__ int intsamesign(int x, int y) { return (y+(signmask(x) & -(y<<1))); } #undef signmask #undef fabsshift