don't define a local function with the same name as a library function (bug #4239)
[asterisk/asterisk.git] / codecs / log2comp.h
1 /* log2comp.h - various base 2 log computation versions
2  * 
3  * Asterisk -- A telephony toolkit for Linux.
4  *
5  * Implementation by Alex Volkov <codepro@usa.net>
6  *
7  * Copyright (c) 2004 - 2005, Digium
8  *
9  * This program is free software, distributed under the terms of
10  * the GNU General Public License
11  *
12  * Define WANT_ASM before including this file to use assembly
13  *   whenever possible
14  */
15
16 #if defined(_MSC_VER)
17 #       define inline __inline
18 #elif defined(__GNUC__)
19 #       define inline __inline__
20 #else
21 #       define inline
22 #endif
23
24 #if defined(WANT_ASM) && defined(_MSC_VER) && defined(_M_IX86)
25 /* MS C Inline Asm */
26 #       pragma warning( disable : 4035 )
27 static inline int ilog2(int val) { __asm
28 {
29         xor             eax, eax
30         dec             eax
31         bsr             eax, val
32 }}
33 #       pragma warning( default : 4035 )
34 #elif defined(WANT_ASM) && defined(__GNUC__) && (defined(__i386__) || defined(i386))
35 /* GNU Inline Asm */
36 static inline int ilog2(int val)
37 {
38         int a;
39         __asm__
40         ("\
41                 xorl    %0, %0          ;\
42                 decl    %0                      ;\
43                 bsrl    %1, %0          ;\
44                 "
45                 : "=r" (a)
46                 : "mr" (val)
47                 : "cc"
48         );
49         return a;
50 }
51 #elif defined(WANT_ASM) && defined(__GNUC__) && defined(__powerpc__)
52 static inline int ilog2(int val)
53 {
54         int a;
55         __asm__ ("cntlzw %0,%1" 
56                  : "=r" (a) 
57                  : "r" (val)
58                  );
59         return 31-a;
60 }
61 #else
62 /* no ASM for this compiler and/or platform */
63 /* rather slow base 2 log computation
64  * Using looped shift.
65  */
66 static inline int ilog2(int val)
67 {
68         int i;
69         for (i = -1; val; ++i, val >>= 1)
70                 ;
71         return (i);
72 }
73 #endif