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

时间:2018-08-09 18:08:45

标签: 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]

因此我的问题:

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

  2. 如果我在上面的示例中使用或不使用VEX前缀,除了说明的长度之外,它有什么区别吗?

  3. 我正在尝试了解其文档中的Intel's syntax。说,此屏幕截图:

enter image description here

VEX.128.0F.WIG中,我看到.128是第二个L字节的位2(VEX)。那么.0F是一个3字节的VEX前缀,m-mmmm的格式为00001,对吗?但是WIG部分代表什么?

  1. VEX前缀仅被Intel CPU识别吗?那么AMD呢?

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

enter image description here

进入xmm寄存器:

enter image description here

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

感谢您对我的耐心。

1 个答案:

答案 0 :(得分:1)

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

v代表指令的AVX版本。

  
      
  1. 如果我在上面的示例中使用或不使用VEX前缀,除了说明的长度之外,这有什么区别吗?
  2.   

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

  
      
  1. 我试图在他们的文档中了解Intel的语法。 [片段]。但是WIG部分代表什么?
  2.   

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

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

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

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

  
      
  1. VEX前缀仅被Intel CPU识别吗?那么AMD呢?
  2.   

任何支持AVX的CPU均可识别。自2011年以来,英特尔和AMD都一直对此提供支持(英特尔的Sandy Bridge和更高版本,以及AMD的Bulldozer和更高版本)

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

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