diff options
| -rw-r--r-- | common/math.h | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/common/math.h b/common/math.h index e1af433f7c..9542cb601a 100644 --- a/common/math.h +++ b/common/math.h @@ -50,6 +50,20 @@ struct Complex {  	float re, im;  }; +#ifdef __GNUC__ +inline int intLog2(uint32 v) { +	// This is a slightly optimized implementation of log2 for natural numbers +	// targeting gcc. It also saves some binary size over our fallback +	// implementation, since it does not need any table. +	if (v == 0) +		return -1; +	else +		// This is really "sizeof(unsigned int) * CHAR_BIT - 1" but using 8 +		// instead of CHAR_BIT is sane enough and it saves us from including +		// limits.h +		return (sizeof(unsigned int) * 8 - 1) - __builtin_clz(v); +} +#else  // See http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup  static const char LogTable256[256] = {  #define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n @@ -66,6 +80,7 @@ inline int intLog2(uint32 v) {  	else  		return (t =  v >> 8) ?  8 + LogTable256[t] : LogTable256[v];  } +#endif  inline float rad2deg(float rad) {  	return rad * 180.0 / M_PI; | 
