Implement __builtin_clzl for MSVC
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Aug 2017 15:56:20 +0000 (15:56 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Aug 2017 15:56:20 +0000 (15:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174232

Patch by Daewoong Jang <daewoong.jang@navercorp.com> on 2017-08-01
Reviewed by Geoffrey Garen.

* bmalloc/Algorithm.h:
(bmalloc::clzl):
(bmalloc::clzl<1>):
(bmalloc::__builtin_clzl):
* bmalloc/BPlatform.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@220097 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/Algorithm.h
Source/bmalloc/bmalloc/BPlatform.h

index 98bc3e0..3fda7ba 100644 (file)
@@ -1,3 +1,16 @@
+2017-08-01  Daewoong Jang  <daewoong.jang@navercorp.com>
+
+        Implement __builtin_clzl for MSVC
+        https://bugs.webkit.org/show_bug.cgi?id=174232
+
+        Reviewed by Geoffrey Garen.
+
+        * bmalloc/Algorithm.h:
+        (bmalloc::clzl):
+        (bmalloc::clzl<1>):
+        (bmalloc::__builtin_clzl):
+        * bmalloc/BPlatform.h:
+
 2017-07-31  Mark Lam  <mark.lam@apple.com>
 
         Fixed some comment typos.
index e3b3250..a8be204 100644 (file)
@@ -26,7 +26,6 @@
 #ifndef Algorithm_h
 #define Algorithm_h
 
-#include "Algorithm.h"
 #include "BAssert.h"
 #include <algorithm>
 #include <cstdint>
@@ -137,6 +136,23 @@ template<typename T> inline constexpr size_t bitCount()
     return sizeof(T) * 8;
 }
 
+#if BOS(WINDOWS)
+template<int depth> __forceinline constexpr unsigned long clzl(unsigned long value)
+{
+    return value & (1UL << (bitCount<unsigned long>() - 1)) ? 0 : 1 + clzl<depth - 1>(value << 1);
+}
+
+template<> __forceinline constexpr unsigned long clzl<1>(unsigned long value)
+{
+    return 0;
+}
+
+__forceinline constexpr unsigned long __builtin_clzl(unsigned long value)
+{
+    return value == 0 ? 32 : clzl<bitCount<unsigned long>()>(value);
+}
+#endif
+
 inline constexpr unsigned long log2(unsigned long value)
 {
     return bitCount<unsigned long>() - 1 - __builtin_clzl(value);
index 597f781..5fa9ef4 100644 (file)
 #define BOS_UNIX 1
 #endif
 
+#if defined(WIN32) || defined(_WIN32)
+#define BOS_WINDOWS 1
+#endif
+
 #if BOS(DARWIN) && ((defined(TARGET_OS_EMBEDDED) && TARGET_OS_EMBEDDED) \
     || (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) \
     || (defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR))