我正在尝试了解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
前缀仅由Intel CPU识别吗? AMD呢? movups
和movupd
有什么区别?似乎他们两个都只是从源内存中移了16个字节:到
xmm
寄存器中:而“双”或“单”精密包装的确没有任何区别。
多谢您对我的耐心配合。
最佳答案
v代表指令的AVX版本。
是的,它确实。如果使用VEX前缀,则将清除寄存器的高位。 (例如,如果您使用vmovups xmm0,则将清除ymm0的上半部分。
“W” =宽度标志。 “IG” =被忽略。
在手册的“指令摘要表中的“3.1.1.2操作码列(带VEX前缀的指令)”部分中,
“— WIG:可以使用C5H形式(如果不需要VEX.mmmmm)或VEX.W值在VEX前缀的C4H形式中被忽略。”
“—如果存在WIG,则可以使用VEX的两字节形式或三字节形式对指令进行编码。当使用VEX的三字节形式对指令进行编码时,将忽略VEX.W的值。 ”
任何支持AVX的CPU都可以识别它。自2011年以来,英特尔和AMD都一直对此提供支持(英特尔的Sandy Bridge和更高版本,以及AMD的Bulldozer和更高版本)
我相信某些处理器可能会在浮点SIMD寄存器的内容上保留标志。在某些情况下使用错误的宽度/类型可能会导致停顿。
关于x86 - VEX前缀编码和SSE/AVX MOVUP(D/S)指令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51773399/