* This avoids conditional branch when it's known at build time that TZCNT instructions are always supported
option(WITH_DFLTCC_INFLATE "Build with DFLTCC intrinsics for decompression on IBM Z" OFF)
option(WITH_CRC32_VX "Build with vectorized CRC32 on IBM Z" ON)
elseif(BASEARCH_X86_FOUND)
+ option(FORCE_TZCNT "Always assume CPU is TZCNT capable" OFF)
option(WITH_AVX2 "Build with AVX2" ON)
option(WITH_AVX512 "Build with AVX512" ON)
option(WITH_AVX512VNNI "Build with AVX512 VNNI extensions" ON)
set(WITH_SSE4 OFF)
endif()
endif()
+ if(FORCE_TZCNT)
+ add_definitions(-DX86_NOCHECK_TZCNT)
+ endif()
+ add_feature_info(FORCE_TZCNT FORCE_TZCNT "Assume CPU is TZCNT capable")
if(WITH_SSE2)
check_sse2_intrinsics()
if(HAVE_SSE2_INTRIN)
| ZLIB_DUAL_LINK | | Dual link tests with system zlib | OFF |
| UNALIGNED_OK | | Allow unaligned reads | ON (x86, arm) |
| | --force-sse2 | Skip runtime check for SSE2 instructions (Always on for x86_64) | OFF (x86) |
+| FORCE_TZCNT | --force-tzcnt | Skip runtime check for TZCNT instructions | OFF |
| WITH_AVX2 | | Build with AVX2 intrinsics | ON |
| WITH_AVX512 | | Build with AVX512 intrinsics | ON |
| WITH_AVX512VNNI | | Build with AVX512VNNI intrinsics | ON |
floatabi=
native=0
forcesse2=0
+forcetzcnt=0
# For CPUs that can benefit from AVX512, it seems GCC generates suboptimal
# instruction scheduling unless you specify a reasonable -mtune= target
avx512flag="-mavx512f -mavx512dq -mavx512bw -mavx512vl -mtune=cascadelake"
echo ' [--without-crc32-vx] Build without vectorized CRC32 on IBM Z' | tee -a configure.log
echo ' [--with-reduced-mem] Reduced memory usage for special cases (reduces performance)' | tee -a configure.log
echo ' [--force-sse2] Assume SSE2 instructions are always available (disabled by default on x86, enabled on x86_64)' | tee -a configure.log
+ echo ' [--force-tzcnt] Assume TZCNT instructions are always available (disabled by default)' | tee -a configure.log
echo ' [--with-sanitizer] Build with sanitizer (memory, address, undefined)' | tee -a configure.log
echo ' [--with-fuzzers] Build test/fuzz (disabled by default)' | tee -a configure.log
echo ' [--native] Compiles with full instruction set supported on this host' | tee -a configure.log
--without-crc32-vx) buildcrc32vx=0; shift ;;
--with-reduced-mem) reducedmem=1; shift ;;
--force-sse2) forcesse2=1; shift ;;
+ --force-tzcnt) forcetzcnt=1; shift ;;
-n | --native) native=1; shift ;;
-a*=* | --archs=*) ARCHS=$(echo $1 | sed 's/.*=//'); shift ;;
--sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;;
fi
fi
fi
+
+ if test $forcetzcnt -eq 1; then
+ CFLAGS="${CFLAGS} -DX86_NOCHECK_TZCNT"
+ SFLAGS="${SFLAGS} -DX86_NOCHECK_TZCNT"
+ fi
fi
;;
*/
static __forceinline unsigned long __builtin_ctz(uint32_t value) {
#ifdef X86_FEATURES
+# ifndef X86_NOCHECK_TZCNT
if (x86_cpu_has_tzcnt)
+# endif
return _tzcnt_u32(value);
#endif
unsigned long trailing_zero;
*/
static __forceinline unsigned long long __builtin_ctzll(uint64_t value) {
#ifdef X86_FEATURES
+# ifndef X86_NOCHECK_TZCNT
if (x86_cpu_has_tzcnt)
+# endif
return _tzcnt_u64(value);
#endif
unsigned long trailing_zero;