在AVX中,有两条指令可以执行按位或VORPD和VORPS。文档说:
VORPD (VEX.256 encoded version)
DEST[63:0] <- SRC1[63:0] BITWISE OR SRC2[63:0]
DEST[127:64] <- SRC1[127:64] BITWISE OR SRC2[127:64]
DEST[191:128] <- SRC1[191:128] BITWISE OR SRC2[191:128]
DEST[255:192] <- SRC1[255:192] BITWISE OR SRC2[255:192]
和
VORPS (VEX.256 encoded version)
DEST[31:0] <- SRC1[31:0] BITWISE OR SRC2[31:0]
DEST[63:32] <- SRC1[63:32] BITWISE OR SRC2[63:32]
DEST[95:64] <- SRC1[95:64] BITWISE OR SRC2[95:64]
DEST[127:96] <- SRC1[127:96] BITWISE OR SRC2[127:96]
DEST[159:128] <- SRC1[159:128] BITWISE OR SRC2[159:128]
DEST[191:160] <- SRC1[191:160] BITWISE OR SRC2[191:160]
DEST[223:192] <- SRC1[223:192] BITWISE OR SRC2[223:192]
DEST[255:224] <- SRC1[255:224] BITWISE OR SRC2[255:224]
这两个处理器操作之间是否有任何实际差异?如果没有:为什么有两条指令?如果不是:使用它们按位进行整数还是安全吗?
答案 0 :(得分:3)
所有(或几乎所有)SEE / AVX指令的PS和PD品种的存在具有历史背景:曾几何时,当英特尔最初设计第一个SSE指令集时,他们认为未来的芯片架构会有三个域: 整数,单精度浮点(32位),双精度浮点(64位)
注意: 域是CPU内的隔离逻辑单元,它们很重要,因为它们之间传输SSE / AVX寄存器内容的延迟很小。因此,如果整数域中的指令的结果被用作浮点域中的指令的输入,则可能发生1或2个周期的延迟。
出于这个原因,英特尔三次镜像大多数逻辑按位和随机指令:一个用于整数,一个用于SP-FP,一个用于DP-FP。这些镜像指令执行的操作是相同的 - 包括整数和浮点变体。
目前大多数x86架构都有两个域:整数和浮点。 FP域处理单精度和双精度(32/64位)。某些体系结构只有一个域用于所有SSE / AVX指令。可能会在未来的某些架构中添加第三个双精度域。
答案 1 :(得分:2)
操作结果没有差异。逻辑一致性有两种类型,因为有两种数据类型是单打包(float32)和双打包(float64)。
对于整数,使用什么操作与数据类型一致并不重要。如果你打包int最大32位宽度使用单打包如果更大使用双打包。想象一下,它是一个强制转换,你可以将32bit int提升到64bit int而不会丢失,但如果是一条通往灾难的路径则反过来。