我正在尝试理解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前缀,它是否有任何区别(指令长度除外)?
>我试图在他们的文档中理解Intel’s syntax.说,这个截图:
在VEX.128.0F.WIG中,我可以看到.128是第二个VEX字节的第2位(L).然后.0F用于3字节VEX前缀,m-mmmm形式为00001,对吗?但是WIG部分代表什么?
> VEX前缀仅由Intel 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值在C4H形式的VEX前缀中被忽略.”
“ – 如果存在WIG,则可以使用双字节格式或VEX的三字节格式对指令进行编码.当使用VEX的三字节格式对指令进行编码时,将忽略VEX.W的值. “
- Is VEX prefix recognized by the Intel CPUs only? How about AMD?
任何支持AVX的CPU都会识别它.自2011年以来,英特尔和AMD都支持它(英特尔的Sandy Bridge及其后的产品,以及AMD的Bulldozer及更高版本)
- Lastly, what is the difference between movups and movupd? It seems like both of them simply move 16 bytes from the source memory:
我相信有些处理器可能会在浮点SIMD寄存器的内容上保留标志;并且使用错误的宽度/类型可能会在某些情况下导致失速.