NEON指令
NEON指令格式的通用描述如下:
{<prefix>}<op>{<suffix>} Vd.<T>, Vn.<T>, Vm.<T>
- {}代表可选参数。
- <prefix>一般用来标识该条NEON指令处理的数据类型,如S表示有符号整型,U表示无符号整型,F表示浮点数,P表示布尔数据类型。
- <op>表示该条NEON指令的操作类型,比如ADD表示加操作。
- <suffix>表示该条NEON指令的操作行为,比如P表示将向量按对操作,V表示跨所有数据通道操作,2表示在宽指令/窄指令中操作数据的高位部分。
- <T>表示该条NEON指令处理数据的宽度,比如B表示8bit数据宽度,H表示16bit数据宽度,S表示32bit数据宽度,D表示64bit数据宽度。
我们看两个具体的NEON指令代表的含义。
- ADDHN2:将两个128位向量相加,产生一个64位向量结果,作为NEON寄存器的高64位部分存储。
- SADDL2:将NEON寄存器的两个高64位向量相加,产生128位向量结果。
前面提到了宽指令和窄指令,这代表的是什么意思呢?其实,NEON指令按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。
- 正常指令:生成大小相同且类型通常与操作数向量相同的结果向量。
- 长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度的两倍,并属于同一类型。L标记,如VMOVL。
- 宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。W标记,如VADDW。
- 窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半。N标记,如VMOVN。
- 饱和指令:当超过数据类型指定到范围则自动限制在该范围内。Q标记,如VQSHRUN。
父主题: NEON汇编编程