From f447b9665a74862a7a213315835b286e6ff19241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 15 Feb 2016 00:05:33 +0100 Subject: [PATCH 1/2] Use GCC's __builtin_ffs for bitscanforward impl --- src/util/util.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/util/util.c b/src/util/util.c index d41ab40cd4..d90091d000 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -158,6 +158,9 @@ int bitscanforward(int source) #if _MSC_VER >= 1400 // Visual Studio 2005 uint8 success = _BitScanForward(&i, source); return success != 0 ? i : -1; + #elif __GNUC__ + int success = __builtin_ffs(source); + return success - 1; #else for (i = 0; i < 32; i++) if (source & (1u << i)) From 016d26976eb99ddbaafa0279a8229b7b2c72f588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 15 Feb 2016 00:17:15 +0100 Subject: [PATCH 2/2] Add a note about low-hanging optimisation fruit --- src/util/util.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/util/util.c b/src/util/util.c index d90091d000..595c430467 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -162,6 +162,10 @@ int bitscanforward(int source) int success = __builtin_ffs(source); return success - 1; #else + #pragma message "Falling back to iterative bitscan forward, consider using intrinsics" + // This is a low-hanging optimisation boost, check if your compiler offers + // any intrinsic. + // cf. https://github.com/OpenRCT2/OpenRCT2/pull/2093 for (i = 0; i < 32; i++) if (source & (1u << i)) return i;