有没有人遇到过以下问题?
A stack variable getting changed/corrupted after calling ne10 assembly function such as ne10_len_vec2f_neon?
e.g
float gain = 8.0;
ne10_len_vec2f_neon(src, dst, len);
after the call to ne10_len_vec2f_neon, the value of gain changes as its memory is getting corrupted.
1. Note this only happens when the project is compiled in release build but not debug build.
2. Does Ne10 assembly functions preserve registers?
3. Replacing the assembly function call to c equivalent such as ne10_len_vec2f_c and both release and debug build seem to work OK.
感谢您的帮助。不确定程序中是否存在固有问题,或者实际上是调用ne10_len_vec2f_neon导致发布build.enter代码时出现损坏
答案 0 :(得分:0)
我在这里快速浏览了一下NEON主代码:
...它根本没有触及基于地址的堆栈,所以不确定它是内存中的堆栈问题。
然而,基于我记得的NEON过程,调用标准q4-q7
(别名d8-d15
或s16-s31
)应由被调用者保留,并且据我所知,该代码如果没有必要的保存/恢复,就会破坏q4-6
,所以它确实看起来像是在寄存器中破坏堆栈。
在失败的情况下你知道gain
是否仍然存储在FPU寄存器中,如果是,那是哪些?如果它存储在任何s16/17/18/19
中,那么这看起来就像是问题所在。似乎合理的是,编译器会选择向上使用s16
来保持函数调用所需的内容,因为它避免了触及RAM内存的需要。
就修复而言,如果您执行以下替换:
s/q4/q8/
s/q5/q9/
s/q6/q10/
在该文件中,我认为它应该有效;没有办法在这里测试,但那些更高的寄存器块不是被调用者保存的。