本文目的:都是学过的知识,防忘
参考《DEN0018A_neon_programmers_guide》
- D寄存器的使用以及子过程调用保护
D寄存器使用顺序建议:
D0-D7 > D16-D31 > D8-D15
子过程需保护:D8-D15,其余不用
即汇编函数中一般需要添加:vpush {q4-q7} - 浮点参数传递规则
对于软浮点,即-mfloat-abi=soft或softfp,使用r0-r3及stack传递参数
反之,即-mfloat-abi=hard,则使用d0-d7及stack传递参数
对于硬浮点构造,参数传递规则如下:
对于integer参数,同普通参传,如
void f(uint32_t a, uint64_t b)
r0: a
r1: unused
r2: b[31:0]
r3: b[63:32]
而对于浮点数,则使用d0-d7,注意浮点参数传递会有回填现象,如
void f(float a, double b)
d0:
s0: a
s1: unused
d1: b
和
void f(float a, double b, float c)
d0:
s0: a
s1: c
d1: b
但需注意,一旦用到了stack,这种回填就不再发生了,如
void f(double a, double b, double c, double d, double e, double f, float g,
double h, double i, float j)
d0: a
d1: b
d2: c
d3: d
d4: e
d5: f
d6:
s12: g
s13: unused
d7: h
*sp: i
*sp+8: j
*sp+12: unused (4 bytes of padding for 8-byte sp alignment)