我是靠谱客的博主 专注悟空,最近开发中收集的这篇文章主要介绍arm neon指令,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

neon指令概述

NEON指令按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。

  • 正常指令:生成大小相同且类型通常与操作数向量相同到结果向量。
  • 长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度到两倍,并属于同一类型。L标记,如VMOVL。
  • 宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。W标记,如VADDW。
  • 窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半。N标记,如VMOVN。
  • 饱和指令:当超过数据类型指定到范围则自动限制在该范围内。Q标记,如VQSHRUN

指令的理解

int16x8_t vqaddq_s16 (int16x8_t, int16x8_t)int16x4_t vqadd_s16 (int16x4_t, int16x4_t)中vqaddq_s16和vqadd_s16各个字段的解释如下:

第一个字母’v’指明是vector向量指令,也就是NEON指令;
第二个字母’q’指明是饱和指令,即后续的加法结果会自动饱和;
第三个字段’add’指明是加法指令;
第四个字段’q’指明操作寄存器宽度,为’q’时操作QWORD, 为128位;未指明时操作寄存器为DWORD,为64位;
第五个字段’s16’指明操作的基本单元为有符号16位整数,其最大表示范围为-32768 ~ 32767;
形参和返回值类型约定与C语言一致。

其它助记符包括:

l 长指令,数据扩展
w 宽指令,数据对齐
n 窄指令, 数据压缩

正常指令

长指令

宽指令

窄指令

饱和指令

以加法为例,饱和加法运算 res = st(M+N),如:vuint8x8_t res = vqadd_u8(uint8x8_t M,uint8x8_t N),res超出int8_t的表示范围(0,255),比如256,则设为255。也就是说超出范围取最大

Intel SIMD

Intel Intrinsics Guide

英特尔® 高级矢量扩展指令集简介
英特尔® 高级矢量扩展指令集简介 PDF
Streaming SIMD Extensions (SSE)

相关参考

Neon intrinsics
ARM Neon 指令 解释

最后

以上就是专注悟空为你收集整理的arm neon指令的全部内容,希望文章能够帮你解决arm neon指令所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部