NEON_17

程序约定

为了使用内部函数,必须支持Advanced SIMD体系结构,并且在任何情况下都可能启用或不启用某些特定的指令。 定义以下宏且等于1时,相应的功能可用:

 

__ARM_NEON
编译器支持高级SIMD
AArch64始终为1
__ARM_NEON_FP
支持NEON浮点运算
AArch64始终为1
__ARM_FEATURE_CRYPTO
可以使用加密指令。
因此,可以使用加密NEON内部函数。
__ARM_FEATURE_FMA
融合的乘加指令可用。
因此可以使用使用它们的NEON内在函数。

 

该列表并非详尽无遗,Arm C语言扩展文档中进一步详细介绍了宏。

类型
arm_neon.h中有三种主要的数据类型类别,它们遵循以下模式:

baseW_t
标量数据类型
baseWxL_t
向量数据类型
baseWxLxN_t
向量数组数据类型
其中:

base是指基本数据类型。
W是基本类型的宽度。
L是矢量数据类型(例如标量数组)中标量数据类型实例的数量。
N是向量数组类型(例如标量数组的结构)中向量数据类型实例的数量。

 

通常,W和L使得矢量数据类型的长度为64或128位,因此完全适合Neon寄存器。 N对应于一次对多个寄存器进行操作的指令。

在我们之前的代码中,我们遇到了这三个示例:

uint8_t
uint8x16_t
uint8x16x3_t

 

函数
根据Arm C语言扩展,arm_neon.h中的函数原型遵循通用模式。在最一般的级别上是:

ret v[p][q][r]name[u][n][q][x][_high][_lane | laneq][_n][_result]_type(args)

请注意,某些字母和名称会重载,但请按照上述顺序:

ret
函数的返回类型。
v
vector的缩写,存在于所有内在函数中。
p
表示成对操作。 ([value]表示可能存在值)。
q
表示饱和操作(AArch64操作中的vqtb [l] [x]除外,其中q表示128位索引和结果操作数)。
r
表示舍入运算。
name
基本操作的描述性名称。通常这是一个高级SIMD指令,但并非必须如此。
u
表示有符号到无符号的饱和度。
n
表示收窄操作。
q
该名称后缀表示对128位向量的运算。
X
表示AArch64中的高级SIMD标量操作。它可以是b,h,s或d(即8位,16位,32位或64位)之一。

_high
在AArch64中,用于涉及128位操作数的扩展和缩小操作。 为了扩展128位操作数,high是指源操作数的高64位。 为了缩小范围,它指的是目标操作数的高64位。
_n
指示作为参数提供的标量操作数。
_lane
表示从向量通道中获取的标量操作数。 _laneq表示从128位宽度的输入向量的通道中获取的标量操作数。 (左|右仅表示左或右)。
类型
缩写形式的主要操作数类型。
args
函数的参数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章