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)
英特尔 ®64 和IA-32架构软件开发人员手册,卷2B,第4-407页,"标量双精度浮点值的SQRTSD-计算平方根":
VSQRTSD xmm1,xmm2,xmm3/m64
计算xmm3/m64中低双精度浮点值的平方根,并将结果存储在xmm1*中.此外,来自xmm2的上双精度浮点值(位[127:64])被复制到xmm1 [127:64].
手术
Run Code Online (Sandbox Code Playgroud)DEST[63:0] ? SQRT(SRC2[63:0]) DEST[127:64] ? SRC1[127:64] DEST[VLMAX-1:128] ? 0
该指令只是遵循其他二进制 V___SD和V___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",这是一个错误.
| 归档时间: |
|
| 查看次数: |
1031 次 |
| 最近记录: |