x64 浮点混合

Posted

技术标签:

【中文标题】x64 浮点混合【英文标题】:x64 floating point blends 【发布时间】:2015-01-03 23:38:17 【问题描述】:

说明: 来自第二个源操作数(第三个操作数)的双精度浮点值有条件地与来自第一个源操作数(第二个操作数)的值合并并写入目标操作数(第一个操作数)。立即位 [3:0] 确定目标中相应的双精度浮点值是从第二个源还是从第一个源复制的。如果掩码中对应一个字的位为“1”,则复制第二个源操作数中的双精度浮点值,否则复制第一个源操作数中的值。

8 位立即数中的哪一位是重要的?其他位重要吗?

【问题讨论】:

【参考方案1】:

正如你的报价所说,相关位是[3:0],即低 4 位。那些控制操作中的每一个都对应着相应的字。由于 SSE 寄存器中有 4 个字(浮点数),因此您有 4 个控制位。前 4 位被忽略。请注意,operation 部分的伪代码清楚地描述了 erm 操作:

BLENDPS (128-bit Legacy SSE version)
IF (IMM8[0] = 0) THEN DEST[31:0] <- DEST[31:0]
        ELSE DEST [31:0] <- SRC[31:0] FI
IF (IMM8[1] = 0) THEN DEST[63:32] <- DEST[63:32]
        ELSE DEST [63:32] <- SRC[63:32] FI
IF (IMM8[2] = 0) THEN DEST[95:64] <- DEST[95:64]
        ELSE DEST [95:64] <- SRC[95:64] FI
IF (IMM8[3] = 0) THEN DEST[127:96] <- DEST[127:96]
        ELSE DEST [127:96] <- SRC[127:96] FI

嗯,这是单精度BLENDPS。您提到了 4 位的双精度,所以这一定意味着BLENDPD。使用 SSE 寄存器,它只使用 2 位,因为您只能将 2 个双精度数放入 128 位。 AVX 版本确实使用 4 位。逻辑同上。

【讨论】:

以上是关于x64 浮点混合的主要内容,如果未能解决你的问题,请参考以下文章

java运算疑惑 整型和浮点型混合运算

在 ARM 平台上正确检测混合端浮点格式

加载 128 位混合浮点 + 整数数据?

如何保持浮点/双精度算术确定性?

在混合 C/Fortran 代码中捕获浮点异常

Python 混合模式操作符