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

Mik*_*keF 5 x86 x86-64 intel cpu-architecture avx

我试图了解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]
Run Code Online (Sandbox Code Playgroud)

由于这两个:

db 066h, 0fh, 10h, 00000000b        ; movupd      xmm0,xmmword ptr [rax]
db 0c5h, 11111001b, 10h, 00000000b  ; vmovupd     xmm0,xmmword ptr [rax]
Run Code Online (Sandbox Code Playgroud)

因此,我的问题是:

  1. v这些说明中的第一个代表什么?仅仅是表示VEX前缀的使用吗?

  2. 如果我VEX在上面的示例中使用或不使用前缀,是否有任何区别(指令长度除外)?

  3. 我试图在他们的文档中了解Intel的语法。说,此屏幕截图:

在此处输入图片说明

VEX.128.0F.WIG我可以看到的.128L第二个VEX字节的位2()。然后.0F是一个3字节的VEX前缀,m-mmmm格式为00001,对吗?但是WIG零件代表什么呢?

  1. VEX前缀仅由Intel CPU的认可?AMD呢?

  2. 最后,movups和之间有什么区别movupd?似乎他们两个都只是从源内存中移出了16个字节:

在此处输入图片说明

进入xmm寄存器:

在此处输入图片说明

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

多谢您对我的耐心配合。

jtl*_*lim 2

\n
    \n
  1. 这些说明中的第一个 v 代表什么?难道只是为了表示使用VEX前缀吗?
  2. \n
\n
\n\n

v 代表指令的 AVX 版本。

\n\n
\n
    \n
  1. 如果我在上面的示例中使用或不使用 VEX 前缀,会有什么区别吗(指令的长度除外)?
  2. \n
\n
\n\n

是的,它确实。如果使用 VEX 前缀,寄存器的高位将被清除。(例如,如果您使用 vmovups xmm0,则 ymm0 的上半部分将被清除。

\n\n
\n
    \n
  1. 我试图理解英特尔文档中的语法。[剪]。但 WIG 部分代表什么?
  2. \n
\n
\n\n

“W” = 宽度标志。“IG”=忽略。

\n\n

从手册中的“3.1.1.2指令汇总表中的操作码列(带有VEX前缀的指令)”部分,

\n\n

“\xe2\x80\x94 WIG:可以使用 C5H 形式(如果不需要 VEX.mmmmm)或在 VEX 前缀的 C4H 形式中忽略 VEX.W 值。”

\n\n

"\xe2\x80\x94 如果存在 WIG,则可以使用 VEX 的两字节形式或三字节形式对指令进行编码。使用 VEX 的三字节形式对指令进行编码时,VEX 的值.W 被忽略。”

\n\n
\n
    \n
  1. VEX前缀只能被Intel CPU识别吗?AMD 怎么样?
  2. \n
\n
\n\n

任何支持 AVX 的 CPU 都可以识别它。Intel 和 AMD 从 2011 年开始就支持它(Intel 的 Sandy Bridge 及更高版本,AMD 的 Bulldozer 及更高版本)

\n\n
\n
    \n
  1. 最后,movups 和 movupd 之间有什么区别?看起来它们都只是从源内存中移动 16 个字节:
  2. \n
\n
\n\n

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

\n