分析简单的ARM NEON INTRINSIC程序
#include <arm_neon.h>
unsigned short int a[] = {1, 2, 3, 4}
int main(void) {
uint16x4_t v;
v = vld1_u16(a);
v = vadd_u16(v, v);
vst1_u16(a, v);
return 0;
}
用GCC命令编译生成目标文件
$ gcc -mfpu=neon -O2 -c -o first.o first.c
然后用OBJDUMP反汇编查看汇编指令
$ objdump -d first.o
得到如下汇编代码
movw r3, #0
movt r3, #0
movs r0, #0
vld1.16 {d16}, [r3]
vadd.i16 d16, d16, d16
vst1.16 {d16}, [r3]
bx lr
从此可以看出
vld1_u16 --> vld1_16
vadd_u16 --> vadd_i16
vst1_u16 --> vst1.16
vst1_u16 --> vst1.16
再试一个例子
#include <arm_neon.h>
unsigned short int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
int main(void) {
uint16x8_t v;
v = vld1q_u16(a);
v = vaddq(a, v);
vst1q_u16(a, v);
return 0;
}
movw r3, #0
movt r3, #0
movs r0, #0
vld1.16 {d16-d17}, [r3]
vadd.i16 q8, q8, q8
vst1.16 {d16-d17}, [r3]
bx lr
对应的规则如下
vld1q_u16 --> vld1_16
vaddq_u16 --> vadd_i16
vst1q_u16 --> vst1.16
vst1q_u16 --> vst1.16
感觉写汇编比用C写好像简单一点。