ARM 内联汇编-1

转自:(72条消息) 10、 ARM 内联汇编学习笔记_天昼AI实验室的博客-CSDN博客_armv8 内联汇编

基本思想:随手记录一下ARM的内联汇编的基础语法,以便更深入的学习NCNN源码~

ARM GCC Inline Assembler Cookbook 参考官网

(1)、基本的汇编语法结构为

asm volatile (
code  代码列表
: output operand list 输出运算符列表
: input operand list 输入运算符列表
: clobber list 被更改资源列表
);
 


 
或者也可以写成这样,因为头文件做了宏定义asm volatile

__asm__ __volatile__ (
code  代码列表
: output operand list 输出运算符列表
: input operand list 输入运算符列表
: clobber list 被更改资源列表
);


(2-1)volatile 表示关键字表示不做任何优化处理;

(2-2) 代码列表,可以写多条指令指令格式如下:

ARMV7 :Documentation – Arm Developer

ARMV7架构包含:



16个通用寄存器(32bit),R0-R15
16个NEON寄存器(128bit),Q0-Q15(同时也可以被视为32个64bit的寄存器,D0-D31)
16个VFP寄存器(32bit),S0-S15

 

NEON和VFP的区别在于VFP是加速浮点计算的硬件不具备数据并行能力,同时VFP更尽兴双精度浮点数(double)的计算,NEON只有单精度浮点计算能力

V{<mod>}<op>{<shape>}{<cond>}{.<dt>}{<dest>}, src1, src2

<mod> 修饰符 (Q, H, D, R)

Q  该指令常用在饱和算法中,如果运算结果发生饱和(超出数据类型,导致溢出),这些状态将被FPSCR寄存器记录,则将结果自动截断,使其避免溢出。VQADD 就是这种指令的一个例子(可通过符号寄存器看出)

H  该指令将使结果减半。它通过向右移动一个位置(实际上是被截断的二分之一)来做到这一点。 VHADD 就是这种指令的一个例子——它可以用来计算两个输入的平均值。

D The instruction doubles the result and saturates. This is commonly required when multiplying numbers in Q15 format, where an additional doubling is required to get the result into the correct form.

R 该指令结果进行四舍五入处理,也就是向上取整操作,否则就将结果数据截断. VRHADD 就是这种指令.

<op> - 操作运算符(如, ADD, SUB, MUL等)

<shape> - Shape (L, W or N, as described in NEON registers)

L 长指令对双字向量操作数执行运算,并生成四字向量结果。 所生成的元素通常是操作数元素宽度的两倍,并属于同一类型。通过将 L 追加到指令助记符来指定长指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值