转自:(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 追加到指令助记符来指定长指令。


613

被折叠的 条评论
为什么被折叠?



