WebKit Bugzilla
Attachment 341428 Details for
Bug 186023
: [WTF] Add clz32 / clz64 for MSVC
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-186023-20180528035504.patch (text/plain), 4.79 KB, created by
Yusuke Suzuki
on 2018-05-27 11:55:05 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Yusuke Suzuki
Created:
2018-05-27 11:55:05 PDT
Size:
4.79 KB
patch
obsolete
>Subversion Revision: 232228 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index af3750dbd8078b60b991510cce07a747579a80f1..323bd1d5446b1fc66c46115574882751941cc299 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,16 @@ >+2018-05-27 Yusuke Suzuki <utatane.tea@gmail.com> >+ >+ [WTF] Add clz32 / clz64 for MSVC >+ https://bugs.webkit.org/show_bug.cgi?id=186023 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Move clz32 and clz64 to WTF. >+ >+ * runtime/MathCommon.h: >+ (JSC::clz32): Deleted. >+ (JSC::clz64): Deleted. >+ > 2018-05-26 Yusuke Suzuki <utatane.tea@gmail.com> > > [JSC] Rename Array#flatten to flat >diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog >index 229f30316c5817b1815a85799a77a8a64c0d99b8..b5e4a138d864af54ff2823875e55eff3425e4beb 100644 >--- a/Source/WTF/ChangeLog >+++ b/Source/WTF/ChangeLog >@@ -1,3 +1,18 @@ >+2018-05-27 Yusuke Suzuki <utatane.tea@gmail.com> >+ >+ [WTF] Add clz32 / clz64 for MSVC >+ https://bugs.webkit.org/show_bug.cgi?id=186023 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This patch adds efficient implementations of clz32 and clz64 for MSVC. >+ While MSVC has _lzcnt intrinsic, it is only valid if the CPU has lzcnt instruction. >+ Instead of checking cpuid here, we just use _BitScanReverse and _BitScanReverse64. >+ >+ * wtf/MathExtras.h: >+ (WTF::clz32): >+ (WTF::clz64): >+ > 2018-05-26 Filip Pizlo <fpizlo@apple.com> > > testair sometimes crashes due to races in initialization of ARC4RandomNumberGenerator >diff --git a/Source/JavaScriptCore/runtime/MathCommon.h b/Source/JavaScriptCore/runtime/MathCommon.h >index 0fdc7c3565ce8ab1ddec51defd4cf3852c399855..e9194612142a537446e66d986c64e806439f2059 100644 >--- a/Source/JavaScriptCore/runtime/MathCommon.h >+++ b/Source/JavaScriptCore/runtime/MathCommon.h >@@ -47,44 +47,6 @@ inline constexpr double minSafeInteger() > return -9007199254740991.0; > } > >-inline int clz32(uint32_t number) >-{ >-#if COMPILER(GCC_OR_CLANG) >- int zeroCount = 32; >- if (number) >- zeroCount = __builtin_clz(number); >- return zeroCount; >-#else >- int zeroCount = 0; >- for (int i = 31; i >= 0; i--) { >- if (!(number >> i)) >- zeroCount++; >- else >- break; >- } >- return zeroCount; >-#endif >-} >- >-inline int clz64(uint64_t number) >-{ >-#if COMPILER(GCC_OR_CLANG) >- int zeroCount = 64; >- if (number) >- zeroCount = __builtin_clzll(number); >- return zeroCount; >-#else >- int zeroCount = 0; >- for (int i = 63; i >= 0; i--) { >- if (!(number >> i)) >- zeroCount++; >- else >- break; >- } >- return zeroCount; >-#endif >-} >- > // This in the ToInt32 operation is defined in section 9.5 of the ECMA-262 spec. > // Note that this operation is identical to ToUInt32 other than to interpretation > // of the resulting bit-pattern (as such this method is also called to implement >diff --git a/Source/WTF/wtf/MathExtras.h b/Source/WTF/wtf/MathExtras.h >index 80d3050cbf17bcb3fff72645cb25885de165790f..1aaf8d6c1936dd3e3423c0c151fa75253c5bdeaa 100644 >--- a/Source/WTF/wtf/MathExtras.h >+++ b/Source/WTF/wtf/MathExtras.h >@@ -524,6 +524,56 @@ void shuffleVector(VectorType& vector, const RandomFunc& randomFunc) > shuffleVector(vector, vector.size(), randomFunc); > } > >+inline unsigned clz32(uint32_t number) >+{ >+#if COMPILER(GCC_OR_CLANG) >+ if (number) >+ return __builtin_clz(number); >+ return 32; >+#elif COMPILER(MSVC) >+ // Visual Studio 2008 or upper have __lzcnt But we can't detect AVX at compile time. >+ // So we use bsr to calculate clz >+ unsigned long ret = 0; >+ if (_BitScanReverse(&ret, number)) >+ return 31 - ret; >+ return 32; >+#else >+ unsigned zeroCount = 0; >+ for (int i = 31; i >= 0; i--) { >+ if (!(number >> i)) >+ zeroCount++; >+ else >+ break; >+ } >+ return zeroCount; >+#endif >+} >+ >+inline unsigned clz64(uint64_t number) >+{ >+#if COMPILER(GCC_OR_CLANG) >+ if (number) >+ return __builtin_clzll(number); >+ return 64; >+#elif COMPILER(MSVC) >+ // Visual Studio 2008 or upper have __lzcnt But we can't detect AVX at compile time. >+ // So we use bsr to calculate clz >+ unsigned long ret = 0; >+ if (_BitScanReverse64(&ret, number)) >+ return 63 - ret; >+ return 64; >+#else >+ unsigned zeroCount = 0; >+ for (int i = 63; i >= 0; i--) { >+ if (!(number >> i)) >+ zeroCount++; >+ else >+ break; >+ } >+ return zeroCount; >+#endif >+} >+ > } // namespace WTF > > using WTF::opaque; >@@ -531,5 +581,7 @@ using WTF::preciseIndexMaskPtr; > using WTF::preciseIndexMaskShift; > using WTF::preciseIndexMaskShiftForSize; > using WTF::shuffleVector; >+using WTF::clz32; >+using WTF::clz64; > > #endif // #ifndef WTF_MathExtras_h
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
dbates
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 186023
: 341428