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