x64 浮点混合
x64 floating point blends
说明:
来自第二个源操作数(第三个操作数)的双精度浮点值有条件地与来自第一个源操作数(第二个操作数)的值合并并写入目标操作数(第一个操作数)。立即数 [3:0] 确定目标中相应的双精度浮点值是从第二个源还是从第一个源复制的。如果掩码中对应于一个字的位为“1”,则复制第二个源操作数中的双精度浮点值,否则复制第一个源操作数中的值。
8 位立即数中的哪一位是重要的?其他位重要吗?
正如你的引文所说,相关位是[3:0]
,即低4位。这些控制操作中的每一个都针对相应的字。由于 SSE 寄存器中有 4 个字(浮点数),因此有 4 个控制位。忽略前 4 位。请注意,operation
部分的伪代码清楚地描述了操作:
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 位。逻辑同上
说明: 来自第二个源操作数(第三个操作数)的双精度浮点值有条件地与来自第一个源操作数(第二个操作数)的值合并并写入目标操作数(第一个操作数)。立即数 [3:0] 确定目标中相应的双精度浮点值是从第二个源还是从第一个源复制的。如果掩码中对应于一个字的位为“1”,则复制第二个源操作数中的双精度浮点值,否则复制第一个源操作数中的值。
8 位立即数中的哪一位是重要的?其他位重要吗?
正如你的引文所说,相关位是[3:0]
,即低4位。这些控制操作中的每一个都针对相应的字。由于 SSE 寄存器中有 4 个字(浮点数),因此有 4 个控制位。忽略前 4 位。请注意,operation
部分的伪代码清楚地描述了操作:
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 位。逻辑同上