From 21728ab46d071b8fe89f2f44fd2dea2eef2daff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Tue, 7 Jan 2025 21:55:26 +0100 Subject: [PATCH] Fix missing _BitScanForward64 on Windows x86 Fixes #220. --- include/lexy/_detail/swar.hpp | 10 +++++++--- tests/lexy/detail/swar.cpp | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/lexy/_detail/swar.hpp b/include/lexy/_detail/swar.hpp index 7c93dc91..511c93dc 100644 --- a/include/lexy/_detail/swar.hpp +++ b/include/lexy/_detail/swar.hpp @@ -139,10 +139,14 @@ constexpr std::size_t swar_find_difference(swar_int lhs, swar_int rhs) #if defined(__GNUC__) auto bit_idx = __builtin_ctzll(mask); -#elif defined(_MSC_VER) +#elif defined(_MSC_VER) && defined(_WIN64) unsigned long bit_idx; - if (!_BitScanForward64(&bit_idx, mask)) - bit_idx = 64; + _BitScanForward64(&bit_idx, mask); +#elif defined(_MSC_VER) + unsigned long bit_idx = 0; + if (!_BitScanForward(&bit_idx, static_cast(mask)) + && _BitScanForward(&bit_idx, mask >> 32)) + bit_idx += 32; #else # error "unsupported compiler; please file an issue" #endif diff --git a/tests/lexy/detail/swar.cpp b/tests/lexy/detail/swar.cpp index a34b464d..cc3d32cb 100644 --- a/tests/lexy/detail/swar.cpp +++ b/tests/lexy/detail/swar.cpp @@ -74,6 +74,7 @@ TEST_CASE("swar_find_difference") CHECK(swar_find_difference(a, a) == 8); CHECK(swar_find_difference(a, A) == 0); CHECK(swar_find_difference(abc, aBc) == 1); + CHECK(swar_find_difference(0x1'FFFF'FFFF, 0x2'FFFF'FFFF) == 4); } TEST_CASE("swar_has_zero")