前言
今天我们继续介绍NEON intrinsics的指令知识,上篇大前端CPU优化技术--NEON intrinsics开篇中已经介绍了部分指令的作用。本篇文章除了介绍指令还会附上场景示例,方便大家更深刻的理解,废话不多说我们继续前面的指令讲解。
intrinsics 指令介绍
初始化
//将一个64bit的数据装入vector中,并返回元素类型为type的vector。
Result_t vcreate_type(Scalar_t N);
//用类型为type的数值,初始化一个元素类型为type的新vector的所有元素。
Resutl_t vdup_type(Scalar_t N);
Result_t vmov_n_type(Scalar_t N);
Result_t vdup_n_type(Scalar_t N);
Result_t vdupq_n_type(Scalar_t N);
Result_t vmovq_n_type(Scalar_t N);
//用元素类型为type的vector的某个元素,初始化一个元素类型为type的新vector的所有元素
Result_t vdup<q>_lane_type(Vector_t N, int n);
vdupq_lane_type
Data processing
max\min操作
// 基本的 max, min
Result_t vmax<q>_type(Vector1_t N, Vector2_t M);
Result_t vmin<q>_type(Vector1_t N, Vector2_t M);
// pairwise 类型的 max, min
Result_t vpmax_type(Vector1_t N, Vector2_t M);
Result_t vpmin_type(Vector1_t N, Vector2_t M);
绝对值
// 基本的绝对值计算
Result_t vabs<q>_type(Vector_t N);
// 差的绝对值操作
Result_t vabd<q>_type(Vector1_t N, Vector2_t M);
// L(Long)类型, 差的绝对值
Result_t vabdl_type(Vector1_t N, Vector2_t M);
// 差的绝对值,并和另一个向量相加
Result_t vaba<q>_type(Vector1_t N, Vector2_t M, Vector3_t P);
// L(Long)类型, 差的绝对值,并和另一个向量相加, 输出是输入长度的两倍
Result_t vabal_type(Vector1_t N, Vector2_t M, Vector3_t P);
取反
// 基本的取反操作
Result_t vneg<q>_type(Vector_t N);
// Q(Saturated)类型,带饱和的取反操作
Result_t vqneg<q>_type(Vector_t N);
按位统计 0 或 1 的个数
// 统计每个通道 1 的个数
Result_t vcnt<q>_type(Vector_t N);
// 从符号位开始,统计每个通道中与符号位相同的位的个数,且这些位必须是连续的
Result_t vcls<q>_type(Vector_t N);
// 从符号位开始,统计每个通道连续0的个数
Result_t vclz<q>_type(Vector_t N);
倒