X86 什么';_uuPopcnt()和mm_popcnt_u32()之间的区别是什么? MS Visual C++支持SoS4.2: 2种CPUPT指令

X86 什么';_uuPopcnt()和mm_popcnt_u32()之间的区别是什么? MS Visual C++支持SoS4.2: 2种CPUPT指令,x86,sse,intrinsics,sse4,X86,Sse,Intrinsics,Sse4,我发现的唯一区别是\uu popcnt()的文档标记为“Microsoft特定”,而\u mm\u popcnt\u u32()(非MS特定) 这是唯一的区别吗,MS只调用HW\uuuPopCnt()\uMM\uPopCnt\uU32()?感谢Intel和AMD,这是同一机器指令的两个不同的固有名称。所有支持它的CPU上的指令都是相同的,不同的本质在C和C++中也没有区别。 _uupopcnt*()内置程序用于AMD的高级位操作(ABM)指令。看 _-mm_-popcnt_*()内部函数用于英

我发现的唯一区别是
\uu popcnt()
的文档标记为“Microsoft特定”,而
\u mm\u popcnt\u u32()
(非MS特定)


这是唯一的区别吗,MS只调用HW
\uuuPopCnt()
\uMM\uPopCnt\uU32()?

感谢Intel和AMD,这是同一机器指令的两个不同的固有名称。所有支持它的CPU上的指令都是相同的,不同的本质在C和C++中也没有区别。
_uupopcnt*()内置程序用于AMD的高级位操作(ABM)指令。看

_-mm_-popcnt_*()内部函数用于英特尔的实现,它本身不是SSE4.2的一部分,但几乎是在同一时间实现的。看

根据,这两种实现都是二进制兼容的,尽管它们的固有名称不同

英特尔声明:

在应用程序尝试使用POPCNT指令之前,必须检查 处理器支持SSE4.2(如果CPUID.01H:ECX.SSE4_2[位20]=1)和POPCNT(如果 CPUID.01H:ECX.POPCNT[位23]=1)

AMD说

CPUID返回的ECX位23(POPCNT)表示支持POPCNT指令 函数0000_0001h。软件必须在每个程序或库初始化时检查CPUID位一次 在使用POPCNT指令之前,或可能导致不一致的行为

我看不出popcnt需要存在SSE4.2的任何原因,因此我认为检查ECX的第23位就足以确定popcnt的存在


AMD的巴塞罗那是第一个拥有popcnt的AMD CPU,它没有完全实现SSE4,因此英特尔的体系结构手册可能建议了一种确定存在的方法,该方法将在英特尔CPU上工作,甚至在合格的AMD CPU上也会失败


英特尔目前在其第二卷指令集参考手册中仅说明了
#UD If CPUID.01H:ECX.POPCNT[位23]=0
因此,可能导致软件在某些没有SSE4.2的AMD CPU上不利用
popcnt
的反竞争建议消失了。

那么,在软件中使用每种的时间是否存在差异?是否应检查不同的cpuid位?如果我想编写仍然使用该命令的Intel/AMD不可知论cwhat,我应该怎么做?它们似乎没有区别或不兼容。请参阅上面我编辑的答案。英特尔的insn ref条目目前只在CPUID.01H:ECX.POPCNT[Bit 23]=0时显示
#UD
,因此不存在检查SSE4.2的无用/反竞争建议。