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

标签 x86 x86-64 intel cpu-architecture avx

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

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

enter image description here

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

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在他们的文档中。说,这个截图:

  • enter image description here

    VEX.128.0F.WIG我可以看到 .128是第二个 L 的第 2 位( VEX )字节。然后.0F用于 3 字节 VEX前缀,m-mmmm表格要00001 , 对?但是WIG是什么意思?部分代表什么?
  • VEX仅英特尔 CPU 识别的前缀? AMD呢?
  • 最后,movups有什么区别?和 movupd ?似乎它们都只是从源内存中移动了 16 个字节:

  • enter image description here

    xmm登记:

    enter image description here

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

    谢谢你对我的耐心。

    最佳答案

    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值在VEX前缀的C4H形式中被忽略。”

    "— 如果存在 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 的推土机及更高版本)

    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 寄存器的内容上维护标志;并且在某些情况下使用错误的宽度/类型可能会导致停顿。

    关于x86 - VEX 前缀编码和 SSE/AVX MOVUP(D/S) 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773399/

    相关文章:

    linux - 自修改代码总是在 Linux 上出现段错误

    assembly - 有在线组装指导手册吗

    linux - cpupower monitor中的C-state Cx是什么

    linux - 如果在小区域发出请求,NVME SSD 上的随机读取 IOPS 会减少

    intel - 无法解析 meta-oe/conf/layer.conf

    performance - 现代 x86-64 cpu 仍然受益于内存数据对齐吗?

    c - 如何用内联汇编编译这个程序?

    gcc - 如何更改 OpenMPI 的编译器

    结合 C 和汇编代码

    ubuntu - 在 Ubuntu 18.04 上编译 Intel I219V 以太网卡