summaryrefslogtreecommitdiff
path: root/sql/sql_bitmap.h
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2019-06-17 15:50:59 +0100
committerVladislav Vaintroub <wlad@mariadb.com>2019-06-19 11:10:49 +0200
commit16ac8404ac4a0b7a7bc260200204e3373476a020 (patch)
treef5c21e2e7f6c9580758f119d980f2ad77525b316 /sql/sql_bitmap.h
parent4594d68d10b77538312701f9eea316a27d6def8a (diff)
downloadmariadb-git-16ac8404ac4a0b7a7bc260200204e3373476a020.tar.gz
MDEV-19787 Speedup Table_map_iterator, via compiler intrinsics
Use __builtin_ctzll on GCC/Clang and _BitScanForward/_BitScanForward64 on MSVC to speed up Table_map_iterator::next_bit(), up to 3 times in benchmarks
Diffstat (limited to 'sql/sql_bitmap.h')
-rw-r--r--sql/sql_bitmap.h27
1 files changed, 9 insertions, 18 deletions
diff --git a/sql/sql_bitmap.h b/sql/sql_bitmap.h
index 765e4ee2725..02dc8198c7c 100644
--- a/sql/sql_bitmap.h
+++ b/sql/sql_bitmap.h
@@ -27,29 +27,20 @@
#include <my_bitmap.h>
#include <my_bit.h>
-/* An iterator to quickly walk over bits in unlonglong bitmap. */
+
+/* An iterator to quickly walk over bits in ulonglong bitmap. */
class Table_map_iterator
{
ulonglong bmp;
- uint no;
public:
- Table_map_iterator(ulonglong t) : bmp(t), no(0) {}
- int next_bit()
+ Table_map_iterator(ulonglong t): bmp(t){}
+ uint next_bit()
{
- static const char last_bit[16] = { 32, 0, 1, 0,
- 2, 0, 1, 0,
- 3, 0, 1, 0,
- 2, 0, 1, 0 };
- uint bit;
- while ((bit= last_bit[bmp & 0xF]) == 32)
- {
- no += 4;
- bmp= bmp >> 4;
- if (!bmp)
- return BITMAP_END;
- }
- bmp &= ~(1LL << bit);
- return no + bit;
+ if (!bmp)
+ return BITMAP_END;
+ uint bit= my_find_first_bit(bmp);
+ bmp &= ~(1ULL << bit);
+ return bit;
}
int operator++(int) { return next_bit(); }
enum { BITMAP_END= 64 };