00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #if defined(_MSC_VER)
00018 # define inline __inline
00019 #elif defined(__GNUC__)
00020 # define inline __inline__
00021 #else
00022 # define inline
00023 #endif
00024
00025 #if defined(WANT_ASM) && defined(_MSC_VER) && defined(_M_IX86)
00026
00027 # pragma warning( disable : 4035 )
00028 static inline int ilog2(int val) { __asm
00029 {
00030 xor eax, eax
00031 dec eax
00032 bsr eax, val
00033 }}
00034 # pragma warning( default : 4035 )
00035 #elif defined(WANT_ASM) && defined(__GNUC__) && (defined(__i386__) || defined(i386))
00036
00037 static inline int ilog2(int val)
00038 {
00039 int a;
00040 __asm__
00041 ("\
00042 xorl %0, %0 ;\
00043 decl %0 ;\
00044 bsrl %1, %0 ;\
00045 "
00046 : "=&r" (a)
00047 : "mr" (val)
00048 : "cc"
00049 );
00050 return a;
00051 }
00052 #elif defined(WANT_ASM) && defined(__GNUC__) && defined(__powerpc__)
00053 static inline int ilog2(int val)
00054 {
00055 int a;
00056 __asm__ ("cntlzw %0,%1"
00057 : "=r" (a)
00058 : "r" (val)
00059 );
00060 return 31-a;
00061 }
00062 #else
00063
00064
00065
00066
00067 static inline int ilog2(int val)
00068 {
00069 int i;
00070 for (i = -1; val; ++i, val >>= 1)
00071 ;
00072 return (i);
00073 }
00074 #endif