簡體   English   中英

VEX前綴編碼和SSE / AVX MOVUP(D / S)指令

[英]VEX prefixes encoding and SSE/AVX MOVUP(D/S) instructions

我正在嘗試理解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是第二個VEX字節的第2位( L )。 然后.0F用於3字節VEX前綴, m-mmmm形式為00001 ,對嗎? 但是WIG部分代表什么?

  1. VEX前綴僅由Intel CPU識別嗎? AMD怎么樣?

  2. 最后, movupsmovupd什么movupd 看起來他們兩個只是從源內存移動16個字節:

在此輸入圖像描述

進入xmm寄存器:

在此輸入圖像描述

而“雙”或“單”精密包裝確實沒有任何區別。

謝謝你對我的耐心。

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

“ - 如果存在WIG,則可以使用雙字節格式或VEX的三字節格式對指令進行編碼。當使用VEX的三字節格式對指令進行編碼時,將忽略VEX.W的值。 “

  1. VEX前綴僅由Intel CPU識別嗎? AMD怎么樣?

任何支持AVX的CPU都會識別它。 自2011年以來,英特爾和AMD都支持它(英特爾的Sandy Bridge及其后的產品,以及AMD的Bulldozer及更高版本)

  1. 最后,movups和movupd有什么區別? 看起來他們兩個只是從源內存移動16個字節:

我相信有些處理器可能會在浮點SIMD寄存器的內容上保留標志; 並且使用錯誤的寬度/類型可能會在某些情況下導致失速。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM