3

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

vsqrtsd xmm1, xmm2, xmm3

这是否意味着类似的东西xmm1=xmm2=sqrt(xmm3)

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

xmm1.low  = sqrt(xmm3.low);
xmm1.high = xmm2.high;
4

1 回答 1

10

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

VSQRTSD xmm1、xmm2、xmm3/m64

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

手术

DEST[63:0] ← SQRT(SRC2[63:0])
DEST[127:64] ← SRC1[127:64]
DEST[VLMAX-1:128] ← 0

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

DEST[63:0] ← SRC1[63:0] - SRC2[63:0]
DEST[127:64] ← SRC1[127:64]
DEST[VLMAX-1:128] ← 0

和 like VRCPSS xmm1, xmm2, xmm3/32,它执行

DEST[31:0] ← APPROXIMATE(1/SRC2[31:0])
DEST[127:32] ← SRC1[127:32]
DEST[VLMAX-1:128] ← 0

一般形式就像

xmm1.low = f(xmm2.low, xmm3.low);
xmm1.high = xmm2.high,

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


*:注意:英特尔手册在这里写“xmm2”,这是一个错误。

于 2012-05-24T10:42:51.490 回答