Use easyer-to-read unoptimized ceil_log2()
authorClifford Wolf <clifford@clifford.at>
Mon, 15 Feb 2016 22:06:18 +0000 (23:06 +0100)
committerClifford Wolf <clifford@clifford.at>
Mon, 15 Feb 2016 22:06:18 +0000 (23:06 +0100)
see here for details on the optimized version:
http://svn.clifford.at/handicraft/2016/esbmc/ceilog2.c

kernel/yosys.cc

index 8590242dcdec79354aff9647eb06db4518912dd7..eba1aef11ff5bc2fdb668547cad813c2f19171d8 100644 (file)
@@ -129,24 +129,11 @@ int ceil_log2(int x)
        if (x <= 0)
                return 0;
 
-       int y = (x & (x - 1));
-       y = (y | -y) >> 31;
-
-       x |= (x >> 1);
-       x |= (x >> 2);
-       x |= (x >> 4);
-       x |= (x >> 8);
-       x |= (x >> 16);
-
-       x >>= 1;
-       x -= ((x >> 1) & 0x55555555);
-       x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
-       x = (((x >> 4) + x) & 0x0f0f0f0f);
-       x += (x >> 8);
-       x += (x >> 16);
-       x = x & 0x0000003f;
-
-       return x - y;
+       for (int i = 0; i < 32; i++)
+               if (((x-1) >> i) == 0)
+                       return i;
+
+       log_abort();
 }
 
 std::string stringf(const char *fmt, ...)