avx的三个操作数?

时间:2012-05-24 10:27:47

标签: assembly x86 simd instructions avx

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

vsqrtsd xmm1, xmm2, xmm3

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

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

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

1 个答案:

答案 0 :(得分:7)

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

  

VSQRTSD xmm1,xmm2,xmm3 / m64

     

计算xmm3 / m64中低双精度浮点值的平方根,并将结果存储在xmm1 *中。此外,上部双精度浮点值(位[127:64])   从xmm2复制到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

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,

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


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