跳转到内容

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