| 
									
										
										
										
											2017-12-22 09:23:22 -05:00
										 |  |  | /*! \file
 | 
					
						
							| 
									
										
										
										
											2005-10-26 23:11:36 +00:00
										 |  |  |  * \brief log2comp.h - various base 2 log computation versions | 
					
						
							| 
									
										
										
										
											2017-12-22 09:23:22 -05:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2012-10-18 14:17:40 +00:00
										 |  |  |  * Asterisk -- An open source telephony toolkit. | 
					
						
							| 
									
										
										
										
											2004-11-15 04:32:12 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-10-26 13:03:17 +00:00
										 |  |  |  * \author Alex Volkov <codepro@usa.net> | 
					
						
							| 
									
										
										
										
											2004-11-15 04:32:12 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-10-26 13:03:17 +00:00
										 |  |  |  * Copyright (c) 2004 - 2005, Digium Inc. | 
					
						
							| 
									
										
										
										
											2004-11-15 04:32:12 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is free software, distributed under the terms of | 
					
						
							|  |  |  |  * the GNU General Public License | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Define WANT_ASM before including this file to use assembly | 
					
						
							|  |  |  |  *   whenever possible | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(_MSC_VER)
 | 
					
						
							|  |  |  | #	define inline __inline
 | 
					
						
							|  |  |  | #elif defined(__GNUC__)
 | 
					
						
							|  |  |  | #	define inline __inline__
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #	define inline
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(WANT_ASM) && defined(_MSC_VER) && defined(_M_IX86)
 | 
					
						
							|  |  |  | /* MS C Inline Asm */ | 
					
						
							|  |  |  | #	pragma warning( disable : 4035 )
 | 
					
						
							| 
									
										
										
										
											2005-05-15 03:18:16 +00:00
										 |  |  | static inline int ilog2(int val) { __asm | 
					
						
							| 
									
										
										
										
											2004-11-15 04:32:12 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	xor		eax, eax | 
					
						
							|  |  |  | 	dec		eax | 
					
						
							|  |  |  | 	bsr		eax, val | 
					
						
							|  |  |  | }} | 
					
						
							|  |  |  | #	pragma warning( default : 4035 )
 | 
					
						
							|  |  |  | #elif defined(WANT_ASM) && defined(__GNUC__) && (defined(__i386__) || defined(i386))
 | 
					
						
							|  |  |  | /* GNU Inline Asm */ | 
					
						
							| 
									
										
										
										
											2005-05-15 03:18:16 +00:00
										 |  |  | static inline int ilog2(int val) | 
					
						
							| 
									
										
										
										
											2004-11-15 04:32:12 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int a; | 
					
						
							|  |  |  | 	__asm__ | 
					
						
							|  |  |  | 	("\
 | 
					
						
							|  |  |  | 		xorl	%0, %0		;\ | 
					
						
							|  |  |  | 		decl	%0			;\ | 
					
						
							|  |  |  | 		bsrl	%1, %0		;\ | 
					
						
							|  |  |  | 		" | 
					
						
							| 
									
										
										
										
											2008-03-18 19:24:15 +00:00
										 |  |  | 		: "=&r" (a) | 
					
						
							| 
									
										
										
										
											2004-11-15 04:32:12 +00:00
										 |  |  | 		: "mr" (val) | 
					
						
							|  |  |  | 		: "cc" | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 	return a; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2005-05-15 03:18:16 +00:00
										 |  |  | #elif defined(WANT_ASM) && defined(__GNUC__) && defined(__powerpc__)
 | 
					
						
							|  |  |  | static inline int ilog2(int val) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int a; | 
					
						
							| 
									
										
										
										
											2017-12-22 09:23:22 -05:00
										 |  |  | 	__asm__ ("cntlzw %0,%1" | 
					
						
							|  |  |  | 		 : "=r" (a) | 
					
						
							| 
									
										
										
										
											2005-05-15 03:18:16 +00:00
										 |  |  | 		 : "r" (val) | 
					
						
							|  |  |  | 		 ); | 
					
						
							|  |  |  | 	return 31-a; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2004-11-15 04:32:12 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | /* no ASM for this compiler and/or platform */ | 
					
						
							|  |  |  | /* rather slow base 2 log computation
 | 
					
						
							|  |  |  |  * Using looped shift. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2005-05-15 03:18:16 +00:00
										 |  |  | static inline int ilog2(int val) | 
					
						
							| 
									
										
										
										
											2004-11-15 04:32:12 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	for (i = -1; val; ++i, val >>= 1) | 
					
						
							|  |  |  | 		; | 
					
						
							|  |  |  | 	return (i); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 |