美文网首页
Neon intrinsics指令使用记录

Neon intrinsics指令使用记录

作者: 教训小磊 | 来源:发表于2022-04-11 01:40 被阅读0次

1.neon数据类型

  • 普通向量:分64bit向量和128bit向量,64bit时操作的是寄存器DWORD,128bit时操作的是寄存器QWORD;
    uint8x16_t:这是一个包含无符号8位整数的向量。向量中有16个元素。因此,向量必须位于128位Q寄存器中。
    int16x4_t:这是一个包含有符号16位整数的向量。向量中有4个元素。因此,向量必须位于64位D寄存器中。
  • 数组向量:格式如:typle{n}x{m}x{z}_t,n为向量元素的宽度,m为向量元素的个数,z为向量的个数,一般用于解交织操作, 这种类型一般为一个结构体,比如int8x8x3_t类型指的就是该变量中含有 3 个int8x8_t的向量,分别对应成员:int8x8x3_t.val[0], int8x8x3_t.val[1], int8x8x3_t.val[2]。

2.neon指令分类

  • 正常指令:生成大小相同且类型通常与操作数向量相同的结果向量;


    正常指令
  • 长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度到两倍,并属于同一类型,L标记,如VMOVL;


    长指令
  • 窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半,N标记,如VMOVN;


    窄指令
  • 宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果,W标记,如VADDW;


    宽指令
  • 饱和指令:当超过数据类型指定到范围则自动限制在该范围内。用于数值溢出,类似uint8最大到255,超过部分都归到255,Q标记,如VQADD。
    饱和指令
  • 示例:
    int16x8_t vqaddq_s16 (int16x8_t, int16x8_t)
    int16x4_t vqadd_s16 (int16x4_t, int16x4_t)
    1.第一个字母'v'指明是vector向量指令,也就是NEON指令;
    2.第二个字母'q'指明是饱和指令,即后续的加法结果会自动饱和;
    3.第三个字段'add'指明是加法指令;
    4.第四个字段'q'指明操作寄存器宽度,为'q'时操作QWORD, 为128位;未指明时操作寄存器为DWORD,为64位;
    5.第五个字段's16'指明操作的基本单元为有符号16位整数,其最大表示范围为-32768 ~ 32767,这个字段是针对操作数,而不是目标数;
    6.形参和返回值类型约定与C语言一致。

其它可能用到的助记符包括:
l 长指令,数据扩展
w 宽指令,数据对齐
n 窄指令, 数据压缩

相关文章

网友评论

      本文标题:Neon intrinsics指令使用记录

      本文链接:https://www.haomeiwen.com/subject/ozgbsrtx.html