1 什么是NEON技术
NEON就是一种基于SIMD思想的ARM技术,相比于ARMv6或之前的架构,NEON结合了64-bit和128-bit的SIMD指令集,提供128-bit宽的向量运算(vector operations)。NEON技术从ARMv7开始被采用,目前可以在ARM Cortex-A和Cortex-R系列处理器中采用。
NEON架构参考:zyddora.github.io/2016/02/28/…
2 NEON支持哪些指令集
运算:和、差、积、商 共享的 NEON 和 VFP 指令:涉及加载、多寄存器间的传送、存储 注:所有的支持NEON指令都有一个助记符V,例如:
VADD.I16 D0, D1, D2 @ 16位加法
VMLAL.S16 Q2, D8, D9 @ 有符号16位乘加
具体指令参考官网:developer.arm.com/documentati…
3 什么是arm_neon.h
NEON intrinsics(NEON内部封装), arm编译工具链提供的比汇编更友好的写Neon code的方式。NEON intrinsics是编译器用适当的NEON指令或NEON指令序列替换的函数调用。NEON intrinsics定义在arm_neon.h。
Intrinsics 可以理解成ARM Compiler toolchain和GCC之间接口。
uint8x8_t vadd_u8(uint8x8_t a, uint8x8_t b); // input and output vectors are 64-bit vectors, which use D registers.
uint8x16_t vaddq_u8(uint8x16_t a, uint8x16_t b); // input and output vectors are 128-bit vectors, which use Q registers
uint16x8_t vaddl_u8(uint8x8_t a, uint8x8_t b); // input vectors are 64-bit and output vector is 128-bit.
demo code:
#include <arm_neon.h>
uint32x4_t double_elements(uint32x4_t input)
{
return(vaddq_u32(input, input));
}