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
函數的參數。

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