diff options
author | Johannes Schickel | 2011-07-24 19:54:49 +0200 |
---|---|---|
committer | Johannes Schickel | 2011-07-24 19:54:49 +0200 |
commit | a1bfbe65ba3f9e3d6cf690c6f48a4719a98ae45c (patch) | |
tree | f4d293ac1ef0c05c70df37e3afcea35842591383 | |
parent | b609100a563ffd7d393edf089fb2e8cb5f41a5cf (diff) | |
download | scummvm-rg350-a1bfbe65ba3f9e3d6cf690c6f48a4719a98ae45c.tar.gz scummvm-rg350-a1bfbe65ba3f9e3d6cf690c6f48a4719a98ae45c.tar.bz2 scummvm-rg350-a1bfbe65ba3f9e3d6cf690c6f48a4719a98ae45c.zip |
COMMON: Add an optimized intLog2 implementation for gcc using __builtin_clz.
This is done as discussed here:
https://github.com/scummvm/scummvm/commit/54f25aa84373715001c56155673fb59cfe44b573
-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; |