build: Use __builtin_popcount() if available.

This commit is contained in:
Józef Kucia 2017-09-08 15:04:30 +02:00
parent d9bc635d1a
commit 09658e3b9b
3 changed files with 15 additions and 0 deletions

View File

@ -88,6 +88,7 @@ AS_IF([test "x$with_spirv_tools" = "xyes"],
PKG_CHECK_MODULES([XCB], [xcb xcb-keysyms])
dnl Check for functions
VKD3D_CHECK_BUILTIN_POPCOUNT
VKD3D_CHECK_SYNC_ADD_AND_FETCH_FUNC
VKD3D_CHECK_SYNC_SUB_AND_FETCH_FUNC

View File

@ -39,9 +39,13 @@ static inline size_t align(size_t addr, size_t alignment)
static inline unsigned int vkd3d_popcount(unsigned int v)
{
#ifdef HAVE_BUILTIN_POPCOUNT
return __builtin_popcount(v);
#else
v -= (v >> 1) & 0x55555555;
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
return (((v + (v >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24;
#endif
}
#ifndef _WIN32

View File

@ -17,3 +17,13 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void) { return __sync_sub_and_fetch((in
[1],
[Define to 1 if you have __sync_sub_and_fetch.])],
[AC_MSG_RESULT([no])])])
dnl VKD3D_CHECK_BUILTIN_POPCOUNT
AC_DEFUN([VKD3D_CHECK_BUILTIN_POPCOUNT],
[AC_MSG_CHECKING([for __builtin_popcount])
AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void) { return __builtin_popcount(0); }])],
[AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_BUILTIN_POPCOUNT],
[1],
[Define to 1 if you have __builtin_popcount.])],
[AC_MSG_RESULT([no])])])