有人可以向我解释为什么融合乘法累加指令有 3 种变体:vfmadd132pd,vfmadd231pd和vfmadd213pd, 而只有一个 C 内在函数_mm256_fmadd_pd?
为简单起见,(在 AT&T 语法中)有什么区别
vfmadd132pd %ymm0, %ymm1, %ymm2
vfmadd231pd %ymm0, %ymm1, %ymm2
vfmadd213pd %ymm0, %ymm1, %ymm2
我没有从英特尔的内在指南中得到任何想法。我问是因为我在我编写的一段 C 代码的汇编器输出中看到了所有这些。谢谢。
一个干净的答案(在下面重新格式化答案)
对于变体ijk,的含义vfmaddijkpd:
- 英特尔语法:
op(i) * op(j) + op(k) -> op(1) - AT&T 语法:
op(4-i) * op(4-j) + op(4-k) -> op(3)
其中op(n)表示指令后的第 n 个操作数。所以两者之间有一个逆变换:
n <- 4 - n