我正在尝试了解 SSE/AVX 指令的 VEX 前缀编码。所以如果我问一些简单的问题,请耐心等待。我有以下相关问题。
让我们拿 MOVUP(D/S)指令( 0F 10
)。如果我正确遵循 2 字节 VEX 前缀编码:
以下两种指令编码产生相同的结果:
db 0fh, 10h, 00000000b ; movups xmm0,xmmword ptr [rax]
db 0c5h, 11111000b, 10h, 00000000b ; vmovups xmm0,xmmword ptr [rax]
作为这两个:
db 066h, 0fh, 10h, 00000000b ; movupd xmm0,xmmword ptr [rax]
db 0c5h, 11111001b, 10h, 00000000b ; vmovupd xmm0,xmmword ptr [rax]
因此我的问题:
v
在那些说明中代表什么?是否只是为了表示 VEX
的使用字首? VEX
有什么区别吗(说明的长度除外)上面例子中的前缀? 在
VEX.128.0F.WIG
我可以看到 .128
是第二个 L
的第 2 位( VEX
)字节。然后.0F
用于 3 字节 VEX
前缀,m-mmmm
表格要00001
, 对?但是WIG
是什么意思?部分代表什么?VEX
仅英特尔 CPU 识别的前缀? AMD呢? movups
有什么区别?和 movupd
?似乎它们都只是从源内存中移动了 16 个字节:进
xmm
登记:而“双”或“单”精密包装真的没有任何区别。
谢谢你对我的耐心。
最佳答案
- What does the first v stand for in those instructions? Is it just to denote the use of the VEX prefix?
v 代表指令的 AVX 版本。
- Does it make any difference (with the exception of the length of the instructions) if I use or don't use the VEX prefix in the examples above?
是的,它确实。如果使用 VEX 前缀,则清除寄存器的高位。 (例如,如果您使用 vmovups xmm0,则清除上半部分 ymm0。
- I'm trying to understand Intel's syntax in their documentation. [snip]. But what does the WIG part stand for?
“W” = 宽度标志。 “IG” = 忽略。
从手册中的“3.1.1.2 指令汇总表中的操作码列(带有 VEX 前缀的指令)”部分,
“——WIG:可以使用C5H形式(如果不需要VEX.mmmmm)或VEX.W值在VEX前缀的C4H形式中被忽略。”
"— 如果存在 WIG,则指令可以使用 VEX 的两字节形式或三字节形式进行编码。当使用 VEX 的三字节形式对指令进行编码时,VEX.W 的值将被忽略。 ”
- Is VEX prefix recognized by the Intel CPUs only? How about AMD?
它被任何支持 AVX 的 CPU 识别。自 2011 年以来,英特尔和 AMD 都支持它(英特尔的 Sandy Bridge 及更高版本,以及 AMD 的推土机及更高版本)
- Lastly, what is the difference between movups and movupd? It seems like both of them simply move 16 bytes from the source memory:
我相信某些处理器可能会在浮点 SIMD 寄存器的内容上维护标志;并且在某些情况下使用错误的宽度/类型可能会导致停顿。
关于x86 - VEX 前缀编码和 SSE/AVX MOVUP(D/S) 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773399/