有人可以向我解释为什么融合的乘加指令有3种变体:vfmadd132pd
,vfmadd231pd
和vfmadd213pd
,而只有一个C内在函数_mm256_fmadd_pd
?
为了简单起见,(在AT&T语法中)有什么区别?>>
vfmadd132pd %ymm0, %ymm1, %ymm2 vfmadd231pd %ymm0, %ymm1, %ymm2 vfmadd213pd %ymm0, %ymm1, %ymm2
我没有从Intel's intrinsics guide那里得到任何想法。我之所以问是因为我在编写的C代码的汇编输出中看到了所有这些代码。谢谢。
一个干净的答案(在下面重新格式化答案)
对于变量ijk
,vfmaddijkpd
的含义:
op(i) * op(j) + op(k) -> op(1)
op(4-i) * op(4-j) + op(4-k) -> op(3)
其中op(n)
表示指令后的第n个操作数。因此,两者之间有一个reverse
n <- 4 - n
有人可以向我解释为什么融合的乘加指令有3个变体:vfmadd132pd,vfmadd231pd和vfmadd213pd,而只有一个C内在函数_mm256_fmadd_pd?到...
融合的乘加指令将两个(压缩的)值相乘,添加第三个值,然后用结果覆盖其中一个值。这三个值中只有一个可以是内存操作数,而不是寄存器。
这在程序集instruction set reference中,并且也在其HTML提取物中,例如VFMADD*PD的条目: