aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2018-01-27 11:19:59 -0800
committerChris Robinson <[email protected]>2018-01-27 14:34:05 -0800
commitf76ab02bd4fc13d6648d839374da966ef12201fd (patch)
treeb049aca85a332f798806443b635438ff8b9febf3
parent4d392a8b870818662572ff2784e8ebab07714218 (diff)
Add a ctz64 fallback using _BitScanForward when available
-rw-r--r--CMakeLists.txt7
-rw-r--r--OpenAL32/Include/alMain.h16
-rw-r--r--config.h.in3
3 files changed, 25 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8e3ee808..b5c65c55 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -494,6 +494,13 @@ IF(HAVE_INTRIN_H)
_BitScanForward64(&idx, 1);
return idx;
}" HAVE_BITSCANFORWARD64_INTRINSIC)
+ CHECK_C_SOURCE_COMPILES("#include <intrin.h>
+ int main()
+ {
+ unsigned long idx = 0;
+ _BitScanForward(&idx, 1);
+ return idx;
+ }" HAVE_BITSCANFORWARD_INTRINSIC)
ENDIF()
CHECK_SYMBOL_EXISTS(sysconf unistd.h HAVE_SYSCONF)
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index afa3eee3..c4223ac9 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -99,12 +99,26 @@ typedef ALuint64SOFT ALuint64;
#elif defined(HAVE_BITSCANFORWARD64_INTRINSIC)
-static inline int msvc_ctz64(ALuint64 v)
+static inline int msvc64_ctz64(ALuint64 v)
{
unsigned long idx = 64;
_BitScanForward64(&idx, v);
return (int)idx;
}
+#define CTZ64(x) msvc64_ctz64(x)
+
+#elif defined(HAVE_BITSCANFORWARD_INTRINSIC)
+
+static inline int msvc_ctz64(ALuint64 v)
+{
+ unsigned long idx = 64;
+ if(!_BitScanForward(&idx, v&0xffffffff))
+ {
+ if(_BitScanForward(&idx, v>>32))
+ idx += 32;
+ }
+ return (int)idx;
+}
#define CTZ64(x) msvc_ctz64(x)
#else
diff --git a/config.h.in b/config.h.in
index 99be6a0b..8ef9057a 100644
--- a/config.h.in
+++ b/config.h.in
@@ -182,6 +182,9 @@
/* Define if we have the _BitScanForward64() intrinsic */
#cmakedefine HAVE_BITSCANFORWARD64_INTRINSIC
+/* Define if we have the _BitScanForward() intrinsic */
+#cmakedefine HAVE_BITSCANFORWARD_INTRINSIC
+
/* Define if we have _controlfp() */
#cmakedefine HAVE__CONTROLFP