ARMv8 NEON 教程(一)
该教程只针对:ARMv8 AArch64
(AArch 64 指ARMv8独有的一种执行状态: ARM Architecture 64 bit)
一、 快速开始
C语言代码: neon_quick_start.c
/********************************************
* E2MCC wrote the code *
*********************************************/
#include <stdio.h>
#include <arm_neon.h> //head file for neon
int main(int argc, char ** argv)
{
/***************************************
* C[0] = A[0] * B[0]
* C[1] = A[1] * B[2]
* C[2] = A[2] * B[2]
* C[3] = A[3] * B[3]
****************************************/
//general
float A[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
float B[6] = {2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
float C[5] = {0};
//neon
float32x4_t neon_A;
float32x4_t neon_B;
float32x4_t neon_C = vdupq_n_f32(0);//set all 4 lane to ZERO
//neon load: neon <-- general
neon_A = vld1q_f32(A);
neon_B = vld1q_f32(B);
//neon compute:
neon_C = vmulq_f32(neon_A, neon_B);
//neon store: neon --> general
vst1q_f32(C, neon_C);
//C will be {2.0, 6.0, 12.0, 20.0, 0.0}
for(int i=0;i<5;++i)
printf("C[%d]=%.1lf\n",i,C[i]);
return 0;
}
编译:
gcc -std=c99 neon_quick_start.c -o neon_quick_start.out
运行:
./neon_quick_start.out
二、NEON功能汇总
可通过 ARM官方neon指令文档 查询。以下给出neon关键功能标识以方便查找:
功能名 | 关键标识 | 全称 |
---|---|---|
读取 | ld | load |
存储 | st | store |
加法 | add | addite |
减法 | sub | subtract |
乘法 | mul | multiply |
除法 | div | divide |
乘加 | mla | multiply and add |
乘减 | mls | multiply and subtract |
绝对值 | abs | absolute |
平方根 | sqrt | square root |
比较 | cmp | compare |
条件选择 | csel | condition select |
最大 | max | maxium |
最小 | min | minium |
三、Neon指令语法(AArch64)
以下是neon的汇编指令,我们一般用不到,但是也需要能看懂。
[prefix][op][suffix] Vd.[T], Vn.[T], Vm.[T]