跳到內容

AVX2的基本指令範例

整數搬移指令movzx,會以0填充到目標大小再做搬移

nasm文件可以看到vpmovzx有這些

VPMOVSXBW xmmreg,xmmrm64
VPMOVSXBD xmmreg,xmmrm32
VPMOVSXBQ xmmreg,xmmrm16
VPMOVSXWD xmmreg,xmmrm64
VPMOVSXWQ xmmreg,xmmrm32
VPMOVSXDQ xmmreg,xmmrm64
VPMOVZXBW xmmreg,xmmrm64
VPMOVZXBD xmmreg,xmmrm32
VPMOVZXBQ xmmreg,xmmrm16
VPMOVZXWD xmmreg,xmmrm64
VPMOVZXWQ xmmreg,xmmrm32
VPMOVZXDQ xmmreg,xmmrm64
vpmovzxdq xmm0, xmm1

作用就是將內容補0填充到16 bytes並移動至xmm暫存器
指令名稱說明:

  • Packed在前面是整數指令
  • movzx以0填充,movsx帶符號的擴展確保負數的內容不變
  • 後兩位的意思是將src原本是Dword擴展到Qword,拆分成兩個qword 比如{0x1, 0x1}的形式搬移

雖然SSE4.1也有相同的PMOVZXDQ,但只支援xmm暫存器的操作
AVX2的章節有對於ymm的操作,AVX-512也有更靈活的操作。

整數搬移指令,a和u的差異是對齊,xmm和ymm需要跟16和32 bytes對齊
a表示Aligned,u表示Unaligned
若來源不確定是否對齊需要使用vmovdqu來操作

; vmovdqu ymmreg, ymmrm256
vmovdqu ymm0, YWORD [rdi+rax]

取ymm大小的值用YWORD,xmm對應OWORD, zmm對應ZWORD

整數有vpor, vpxor, vpand等等的這些
浮點有vxorpd, vxorps, vandpd, vandps等等的
命名方式都相同,比如使用vpxor將ymm0清零

; VPXOR ymmreg,ymmreg*,ymmrm256
vpxor ymm0, ymm0, ymm0