Optimize ceil_log2 function
authorMatthew Daiter <mdaiter8121@gmail.com>
Mon, 6 May 2019 23:33:56 +0000 (18:33 -0500)
committerMatthew Daiter <mdaiter8121@gmail.com>
Tue, 7 May 2019 17:17:56 +0000 (12:17 -0500)
kernel/yosys.cc
kernel/yosys.h

index 20d972150a978239ae96731ef5622b47929a488a..377572fc2984243a2ede59d2e35af34a7fa27b8d 100644 (file)
@@ -151,14 +151,16 @@ void yosys_banner()
 
 int ceil_log2(int x)
 {
+#if defined(__GNUC__)
+        return x > 1 ? (8*sizeof(int)) - __builtin_clz(x-1) : 0;
+#else
        if (x <= 0)
                return 0;
-
        for (int i = 0; i < 32; i++)
                if (((x-1) >> i) == 0)
                        return i;
-
        log_abort();
+#endif
 }
 
 std::string stringf(const char *fmt, ...)
index 82eb069abb2b2880da86b615cc672f7c906530c4..c7b67172429b155e82e30b68046b397e23d0fa4d 100644 (file)
@@ -244,7 +244,7 @@ extern bool memhasher_active;
 inline void memhasher() { if (memhasher_active) memhasher_do(); }
 
 void yosys_banner();
-int ceil_log2(int x);
+int ceil_log2(int x) YS_ATTRIBUTE(const);
 std::string stringf(const char *fmt, ...) YS_ATTRIBUTE(format(printf, 1, 2));
 std::string vstringf(const char *fmt, va_list ap);
 int readsome(std::istream &f, char *s, int n);