我用64位x86_64汇编语言编写了相当多的代码,我即将开始另一个大型函数库,为s0128
提供所有传统的按位,移位,逻辑,算术,数学运算符和函数。 ,s0256
,s0512
,s1024
有符号整数类型以及f0128
,f0256
,f0512
,f1024
个浮点类型。
我的计算机(ubuntu64和win7-64)中都有AMD FX-8150
(推土机)CPU。在查看了我的代码需要执行的操作之后,我发现大量最近的位操作指令将非常有用。
然而,当我阅读各种文档,包括他们网站上的官方AMD文档时,我发现推土机CPU(FX-8150
)和/或打桩机({{{{{{{{ 1}})。关于各种最近的位操作指令和指令集以及FX-8350
和FMA3
指令集,这种混淆特别常见。
我知道有些AMD文档是错误的,因为我在我的FMA4
上使用FMA3
和FMA4
指令编程并且它们工作得很好,而AMD文档比较推土机和打桩机与此相矛盾。
鉴于我可以找到的所有文档来源在某种程度上都与此问题有关,那么是否有人知道哪些指令和/或指令集在打桩机(FX-8150
)上工作但不是推土机({ {1}})?
由于我的问题是文档的有效性,请不要只指向某个文档,除非您确定它是正确的。最好的答案来自程序员,他们在推土机[和打桩机] CPU上测试了这些指令和指令集。
答案 0 :(得分:2)
正如您已经想到的那样,官方AMD release document(第2页)确实具有误导性。具体来说,此表中的第一行是错误的:
推土机支持FMA4,但不支持FMA3。
为了完整起见,推土机中没有的打桩机指令是BMI
,TBM
,F16C
(以前称为CVT16)和FMA3
(2)。
这些应该提供关于FMA3不存在于Bulldozer中的确认。但此外,您可以信任the GCC Manual。 Bulldozer和Piledriver的体系结构分别命名为bdver1
和bdver2
。
更重要的是,您可以信任cpuid返回值。为方便起见,我在这里为Zambezi和Vishera(桌面部分)重新制作截图:
资料来源:CPUID Dump List
请注意,cpuid
仅使用fma
来指定FMA3和FMA4支持。 GCC遵循相同的语义。从Wikipedia link开始,您可以推断这是因为FMA4
变体实际上是在 FMA3之前实现的(因此之前定义的fma4
标识符不能简单被删除或它会破坏现有的应用程序。)