为什么FMA _mm256_fmadd_pd()内部函数具有3种asm助记符,即“ vfmadd132pd”,“ 231”和“ 213”?

问题描述 投票:13回答:2

有人可以向我解释为什么融合的乘加指令有3种变体:vfmadd132pdvfmadd231pdvfmadd213pd,而只有一个C内在函数_mm256_fmadd_pd

为了简单起见,(在AT&T语法中)有什么区别?>>

vfmadd132pd  %ymm0, %ymm1, %ymm2
vfmadd231pd  %ymm0, %ymm1, %ymm2
vfmadd213pd  %ymm0, %ymm1, %ymm2

我没有从Intel's intrinsics guide那里得到任何想法。我之所以问是因为我在编写的C代码的汇编输出中看到了所有这些代码。谢谢。


一个干净的答案(在下面重新格式化答案)

对于变量ijkvfmaddijkpd的含义:

  • intel语法:op(i) * op(j) + op(k) -> op(1)
  • AT&T语法: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?到...

assembly x86 simd instruction-set fma
2个回答
13
投票

融合的乘加指令将两个(压缩的)值相乘,添加第三个值,然后用结果覆盖其中一个值。这三个值中只有一个可以是内存操作数,而不是寄存器。


4
投票

这在程序集instruction set reference中,并且也在其HTML提取物中,例如VFMADD*PD的条目:

© www.soinside.com 2019 - 2024. All rights reserved.