我们知道在NEON上,SIMD寄存器q0
〜q7
与浮动寄存器s0
〜s31
共享。所以下面的代码有一个错误:
float_t fRatio = (float_t)srcWidth/dstWidth;
// NEON asm modified q0~q7
MyNeonFunctionPtr1(pData, Stride, (int32_t)(fHorRatio*m_iHorScale));
// following sentence use wrong "fHorRatio",
// which is modified by "MyNeonFunctionPtr1";
int32_t vertStepLuma = (int32_t)(fHorRatio*m_iVertScale);
在x86中,emms可以解决它。但是我如何在NEON上做到这一点?我的临时解决方案是在volatile
上使用vertStepLuma
。有没有更好的办法?谢谢!
答案 0 :(得分:2)
您使用的是gcc内联汇编吗?然后使用clobber列表。您通知GCC您将使用特定寄存器,并且内联asm块后gcc不会存储它们的值。请在此处阅读:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3
否则,如果它是在其他地方实现的外部函数,那么ABI规定你只能破坏q4,q5,q6和q7寄存器:ARM to C calling convention, NEON registers to save修复函数以保存寄存器(q0-q3),或者make它周围的内联汇编,您可以自己保存这些寄存器。
答案 1 :(得分:0)
好吧,被调用者(函数)在覆盖和恢复它们之前应该只保留Q4-Q7,这意味着调用者应该知道不保证其他寄存器保持不变的事实。因此,如果需要,调用者必须在函数调用之前保留Q0-Q3,Q8-Q15,并在返回时恢复它们。 (编译器自动执行此操作)