avx的三个操作数?

tom*_*tom 2 x86 assembly simd instructions avx

为什么avx sqrt(非压缩)指令有三个操作数?

vsqrtsd xmm1, xmm2, xmm3
Run Code Online (Sandbox Code Playgroud)

这是否意味着什么xmm1=xmm2=sqrt(xmm3)

编辑:下面详细解答,但简而言之,装配线意味着:

xmm1.low  = sqrt(xmm3.low);
xmm1.high = xmm2.high;
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 7

英特尔 ®64 和IA-32架构软件开发人员手册,卷2B,第4-407页,"标量双精度浮点值的SQRTSD-计算平方根":

VSQRTSD xmm1,xmm2,xmm3/m64

计算xmm3/m64中低双精度浮点值的平方根,并将结果存储在xmm1*中.此外,来自xmm2的上双精度浮点值(位[127:64])被复制到xmm1 [127:64].

手术

DEST[63:0] ? SQRT(SRC2[63:0])
DEST[127:64] ? SRC1[127:64]
DEST[VLMAX-1:128] ? 0
Run Code Online (Sandbox Code Playgroud)

该指令只是遵循其他二进制 V___SDV___SS操作的模式,如VSUBSD执行

DEST[63:0] ? SRC1[63:0] - SRC2[63:0]
DEST[127:64] ? SRC1[127:64]
DEST[VLMAX-1:128] ? 0
Run Code Online (Sandbox Code Playgroud)

并且喜欢VRCPSS xmm1, xmm2, xmm3/32,执行

DEST[31:0] ? APPROXIMATE(1/SRC2[31:0])
DEST[127:32] ? SRC1[127:32]
DEST[VLMAX-1:128] ? 0
Run Code Online (Sandbox Code Playgroud)

一般形式就像

xmm1.low = f(xmm2.low, xmm3.low);
xmm1.high = xmm2.high,
Run Code Online (Sandbox Code Playgroud)

英特尔 ®64 和IA-32架构软件开发人员手册第1卷第11.4.1节"打包和标量双精度浮点指令"中所述.对于VSQRTSD,我们只定义f(x,y)=√y,忽略第一个操作数.


*:注意:英特尔手册在此处写入"xmm2",这是一个错误.