ARM汇编(一)

分析简单的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


再试一个例子
#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

感觉写汇编比用C写好像简单一点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值