首页 > 解决方案 > VEX 前缀编码和 SSE/AVX MOVUP(D/S) 指令

问题描述

我正在尝试了解 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]

因此我的问题:

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

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

  3. 我试图在他们的文档中理解英特尔的语法。说,这个截图:

在此处输入图像描述

VEX.128.0F.WIG可以看到这.128是第 2 个字节的第 2 位(LVEX。然后.0F是一个 3 字节的VEX前缀,m-mmmm形式是00001,对吗?但是这个WIG部分代表什么?

  1. 前缀是否VEX仅由 Intel CPU 识别?AMD怎么样?

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

在此处输入图像描述

进入xmm注册表:

在此处输入图像描述

并且“双”或“单”精度包装确实没有任何区别。

谢谢你对我的耐心。

标签: x86x86-64intelcpu-architectureavx

解决方案


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

v 代表指令的 AVX 版本。

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

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

  1. 我试图在他们的文档中理解英特尔的语法。[剪辑]。但是 WIG 部分代表什么?

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

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

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

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

  1. VEX 前缀是否仅被 Intel CPU 识别?AMD怎么样?

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

  1. 最后,movups和movupd有什么区别?似乎它们都只是从源内存中移动了 16 个字节:

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


推荐阅读