On Tue, Jun 18, 2019 at 06:39:25PM +0200, Rémi Bernon wrote:
Signed-off-by: Rémi Bernon rbernon@codeweavers.com
dlls/kernel32/tests/virtual.c | 72 ++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 34 deletions(-)
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index 0b718606d0e..e72192477c8 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -73,6 +73,30 @@ static HANDLE create_target_process(const char *arg) return pi.hProcess; }
+static inline UINT_PTR get_zero_bits(UINT_PTR p) +{
- UINT_PTR z;
- if (p == 0)
return 32;
+#ifdef __x86_64__
- if (p > 0xffffffff)
return (~(UINT_PTR)0) >> get_zero_bits(p >> 32);
+#endif
+#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))
- z = __builtin_clz((UINT32)p);
+#else
- z = 31;
- if (p >> 16) { z -= 16; p >>= 16; }
- if (p >> 8) { z -= 8; p >>= 8; }
- if (p >> 4) { z -= 4; p >>= 4; }
- if (p >> 2) { z -= 2; p >>= 2; }
- if (p >> 1) z -= 1;
+#endif
- return z;
+}
Since this is just a test, let's go for simplicity over speed. Just loop starting from the high bit until you get a 1.
Huw.