英特尔AVX2中XOR指令“ VPXORD”,“ VXORPS”和“ VXORPD”之间有什么区别

Har*_*per 8 x86 cpu-architecture avx avx2 avx512

我在AVX2指令集中看到,英特尔用不同的指令来区分整数,双精度和浮点的XOR操作。对于整数,为“ VPXORD”,对于双精度为“ VXORPD”,为浮点数“ VXORPS”

但是,根据我的理解,它们都应该对二进制数据进行相同的XOR操作。例如,两个256位寄存器的XOR,与实际数据类型无关。为什么我们需要对不同的数据类型使用不同的指令?

fuz*_*fuz 1

以下是所有 SIMD 异或指令:

\n
ENCODING                 MNEMONIC  ENCODING  EXTENSION  DOMAIN   TYPE\n               0F EE /r  pxor      legacy    MMX        MMX      quad\n               0F 57 /r  xorps     legacy    SSE        FP       packed single\n            66 0F EE /r  pxor      legacy    SSE2       integer  double-quad\n            66 0F 57 /r  xorpd     legacy    SSE2       FP       packed double\n   VEX.256.0F.WIG 57 /r  vxorps    VEX       AVX        FP       packed single\nVEX.256.66.0F.WIG 57 /r  vxorpd    VEX       AVX        FP       packed double\nVEX.256.66.0F.WIG EE /r  vpxor     VEX       AVX2       integer  double-quad\nEVEX.512.66.0F.W0 EE /r  vpxord    EVEX      AVX512F    integer  double word\nEVEX.512.66.0F.W1 EE /r  vpxorq    EVEX      AVX512F    integer  quad word\n   EVEX.512.0F.W0 57 /r  vxorps    EVEX      AVX512DQ   FP       packed single\nEVEX.512.66.0F.W1 57 /r  vxorpd    EVEX      AVX512DQ   FP       packed double\n
Run Code Online (Sandbox Code Playgroud)\n

(仅计算支持的最大向量大小的)

\n

这些指令都归结为两个操作码:0F EFforpxor0F 57forxorpsxorpd。这些操作码之间的主要区别在于域。 \xe2\x80\xa0pxor是整数域指令,/是 FP 域指令。xorpsxorpd

\n

在内部,每个 SIMD 寄存器都与这两个域之一相关联(您可以说 \xe2\x80\x9 位于 \xe2\x80\x9d 中),具体取决于写入它的最后一条指令。如果您从当前未关联的域访问寄存器,则会在寄存器移动/复制到其他域时产生额外的延迟周期*。这就是为什么对于一些对整数和 FP 运算都有用的指令,存在两个版本。一种适用于浮点,另一种适用于整数。这解释了为什么存在两个操作码。

\n

xorps现在为什么和具有不同的元素类型xorpd?两者是相同的指令,唯一的区别是xorpd需要额外的66前缀来指示双操作数大小。这是一个系统的事情;对于 FP 域指令,无前缀表示打包单精度、66表示打包双精度、F3表示标量单精度和F2表示标量双精度。虽然此操作码不支持标量操作,但 CPU 设计者认为没有必要明确禁止单精度操作和双精度操作之间的无用区别,并且您可以同时使用xorpsxorpd。SSE 和 AVX 这两者之间没有区别。

\n

pxor另一方面,该指令是源自 MMX 的整数域指令。这里,没有前缀表示MMX操作,有66前缀表示SSE操作。数据大小在操作码中指示,而不是使用前缀。对于pxor,标称数据大小是四倍或双四倍,这意味着完整的寄存器/通道。

\n

通过 AVX,所有这些指令都可以选择进行 VEX 编码,以支持非破坏性操作(目标与源分开)并允许 256 位向量大小。VEX 编码的使用在助记符中用前导 V 表示,导致vpxorvxorps、 和vxorpd。其他一切都保持不变。

\n

有了 AVX-512,情况发生了一些变化。这个新的指令集扩展支持几乎所有指令的屏蔽。每个元素都可以根据掩码寄存器掩码为 \xe2\x80\x9ckeep 旧值\xe2\x80\x9d 或 \xe2\x80\x9czero out\xe2\x80\x9d。这需要修改没有用元素大小指定的元素大小的 SSE 和 AVX 指令,因为元素大小决定了如何应用掩码。这是通过使用之前未使用的 REX/VEX/EVEX 前缀的 W 位来区分vpxorvpxord双字)和vpxorq(四字)来实现的。xorps请注意与和中使用的 FP 数据类型相比,整数数据类型的使用xorpd。为了使解码更简单,现在需要根据vxorps和 的元素大小设置 W 位vxorpd元素大小设置 W 位。

\n

不幸的是,没有添加字节或字异或运算的变体(这些变体需要新的操作码),因此如果需要这种掩码,则必须使用单独的移动/混合步骤。

\n

我希望这能够消除分歧。它实际上并不像看起来那么复杂。

\n
\n

* 精确的惩罚因微架构而异,并且可能根本不存在。如有疑问,请进行测量。

\n

\xe2\x80\xa0 MMX 是一个独立的域,并且在所有意图和目的上都已过时。

\n