【发布时间】:2020-08-08 21:07:06
【问题描述】:
假设 x64 构建可以使用 TZCNT 而不通过 cpu 标志检查其支持是否安全?
【问题讨论】:
-
我很好奇你为什么还要问。当然,用谷歌搜索 BMI1 并看到它在 Haswell 中对英特尔来说是新的很容易。我猜你遇到
tzcnt没有在以前的 CPU 上出现故障,或者看到编译器在没有-mbmi1或-march=haswell的情况下使用它并且怀疑其他来源,所以我在回答中详细介绍了这一点。但从表面上看,这个关于 BMI1 的问题通常会因为缺乏研究努力而被否决。 (我考虑过但没有。) -
我看到 zlib-ng 在运行时有条件地使用 tzcount。我想建议他们始终将
bsf用于 x86(他们无论如何都会检查 0)并将 tzcnt 用于 x64 构建。但是无法找到所有 x64 CPU 是否支持的明确信息。 -
如果他们已经排除了 input=0,那么他们应该使用
rep bsf=tzcnt无条件(包括 32 位模式),所以它在 AMD 上更快,在 Intel 上也是如此,代价是 1 个指令字节。 -
哦,它是 C 而不是 asm,所以他们不能只使用
_tzcnt_u32。 Err 等等,它在 ifdef _MSC_VER 中,所以它永远不会与需要为_tzcnt_u32启用-mbmi1的编译器一起使用。所以是的,他们应该使用_tzcnt_u32。当x86_cpu_has_tzcnt不是编译时常量时,我很好奇这对 MSVC 来说有多可怕。 -
这很糟糕,因为
x86_cpu_has_tzcnt不是编译时间常数(如果是,编译器显然会删除它)。如果 CPU 支持 BMI1,则在运行时设置
标签: assembly x86-64 instruction-set bmi