com php-src: make use of intrinsics available with VS for bitset lookups: Zend/zend_alloc.c
| From: | Anatol Belski | Date: | Fri, 19 Sep 2014 23:43:06 +0000 |
| Subject: | com php-src: make use of intrinsics available with VS for bitset lookups: Zend/zend_alloc.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-81792@lists.php.net to get a copy of this message | ||
Commit: 7b4e8c64e059108a612ba04feddf0e395633d081
Author: Anatol Belski <ab@php.net> Sat, 20 Sep 2014 01:36:51 +0200
Parents: 2700e248b88db997d5504b7387d0f0bb3e35291c
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=7b4e8c64e059108a612ba04feddf0e395633d081
Log:
make use of intrinsics available with VS for bitset lookups
Changed paths:
M Zend/zend_alloc.c
Diff:
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 7514979..77a8251 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -477,6 +477,19 @@ static zend_always_inline int zend_mm_bitset_nts(zend_mm_bitset bitset)
{
#if defined(__GNUC__)
return __builtin_ctzl(~bitset);
+#elif defined(_WIN32)
+ unsigned long index;
+
+#if defined(_WIN64)
+ if (!BitScanForward64(&index, ~bitset)) {
+#else
+ if (!BitScanForward(&index, ~bitset)) {
+#endif
+ /* undefined behavior */
+ return 32;
+ }
+
+ return (int)index;
#else
int n;
@@ -501,6 +514,19 @@ static zend_always_inline int zend_mm_bitset_ntz(zend_mm_bitset bitset)
{
#if defined(__GNUC__)
return __builtin_ctzl(bitset);
+#elif defined(_WIN32)
+ unsigned long index;
+
+#if defined(_WIN64)
+ if (!BitScanForward64(&index, bitset)) {
+#else
+ if (!BitScanForward(&index, bitset)) {
+#endif
+ /* undefined behavior */
+ return 32;
+ }
+
+ return (int)index;
#else
int n;
@@ -1023,6 +1049,15 @@ static zend_always_inline int zend_mm_small_size_to_bit(int size)
{
#if defined(__GNUC__)
return (__builtin_clz(size) ^ 0x1f) + 1;
+#elif defined(_WIN32)
+ unsigned long index;
+
+ if (!BitScanReverse(&index, (unsigned long)size)) {
+ /* undefined behavior */
+ return 32;
+ }
+
+ return (((31 - (int)index) ^ 0x1f) + 1);
#else
int n = 16;
if (size <= 0x00ff) {n -= 8; size = size << 8;}