[英]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]
因此我的問題:
第一個v
在這些說明中代表什么? 是否只是表示使用VEX
前綴?
如果我在上面的例子中使用或不使用VEX
前綴,它是否有任何區別(指令的長度除外)?
我試圖在他們的文檔中理解英特爾的語法 。 說,這個截圖:
在VEX.128.0F.WIG
我可以看到.128
是第二個VEX
字節的第2位( L
)。 然后.0F
用於3字節VEX
前綴, m-mmmm
形式為00001
,對嗎? 但是WIG
部分代表什么?
VEX
前綴僅由Intel CPU識別嗎? AMD怎么樣?
最后, movups
和movupd
什么movupd
? 看起來他們兩個只是從源內存移動16個字節:
進入xmm
寄存器:
而“雙”或“單”精密包裝確實沒有任何區別。
謝謝你對我的耐心。
- 第一個v在這些說明中代表什么? 是否只是表示使用VEX前綴?
v代表指令的AVX版本。
- 如果我在上面的例子中使用或不使用VEX前綴,它是否有任何區別(指令的長度除外)?
是的,它確實。 如果使用VEX前綴,則清除寄存器的高位。 (例如,如果使用vmovups xmm0,則清除上半部ymm0。
- 我試圖在他們的文檔中理解英特爾的語法。 [剪斷]。 但是WIG部分代表什么?
“W”=寬度標志。 “IG”=被忽略。
從手冊中的“3.1.1.2指令匯總表中的操作碼列(帶VEX前綴的說明)”部分,
“ - WIG:可以使用C5H格式(如果不需要VEX.mmmmm)或VEX.W值在C4H形式的VEX前綴中被忽略。”
“ - 如果存在WIG,則可以使用雙字節格式或VEX的三字節格式對指令進行編碼。當使用VEX的三字節格式對指令進行編碼時,將忽略VEX.W的值。 “
- VEX前綴僅由Intel CPU識別嗎? AMD怎么樣?
任何支持AVX的CPU都會識別它。 自2011年以來,英特爾和AMD都支持它(英特爾的Sandy Bridge及其后的產品,以及AMD的Bulldozer及更高版本)
- 最后,movups和movupd有什么區別? 看起來他們兩個只是從源內存移動16個字節:
我相信有些處理器可能會在浮點SIMD寄存器的內容上保留標志; 並且使用錯誤的寬度/類型可能會在某些情況下導致失速。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.