x86 – VEX前缀编码和SSE / AVX MOVUP(D / S)指令

我正在尝试理解SSE / AVX指令的VEX前缀编码.如果我问一些简单的话,请耐心等待.我有以下相关问题.

我们来看MOVUP(D/S)指令(0F 10).如果我正确遵循2字节VEX前缀编码:

《x86 – VEX前缀编码和SSE / AVX MOVUP(D / S)指令》

以下两个指令编码产生相同的结果:

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.说,这个截图:

《x86 – VEX前缀编码和SSE / AVX MOVUP(D / S)指令》

在VEX.128.0F.WIG中,我可以看到.128是第二个VEX字节的第2位(L).然后.0F用于3字节VEX前缀,m-mmmm形式为00001,对吗?但是WIG部分代表什么?

> VEX前缀仅由Intel CPU识别吗? AMD怎么样?
>最后,movups和movupd有什么区别?看起来他们两个只是从源内存移动16个字节:

《x86 – VEX前缀编码和SSE / AVX MOVUP(D / S)指令》

进入xmm寄存器:

《x86 – VEX前缀编码和SSE / AVX MOVUP(D / S)指令》

而“双”或“单”精密包装确实没有任何区别.

谢谢你对我的耐心.

最佳答案

  1. What does the first v stand for in those instructions? Is it just to denote the use of the VEX prefix?

v代表指令的AVX版本.

  1. 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.

  1. 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的值. “

  1. Is VEX prefix recognized by the Intel CPUs only? How about AMD?

任何支持AVX的CPU都会识别它.自2011年以来,英特尔和AMD都支持它(英特尔的Sandy Bridge及其后的产品,以及AMD的Bulldozer及更高版本)

  1. Lastly, what is the difference between movups and movupd? It seems like both of them simply move 16 bytes from the source memory:

我相信有些处理器可能会在浮点SIMD寄存器的内容上保留标志;并且使用错误的宽度/类型可能会在某些情况下导致失速.

点赞