2

我们知道在 NEON 上,SIMD 寄存器q0~q7与浮点寄存器s0~共享s31。所以下面的代码有一个bug:

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 上做到这一点?我的临时解决方案是使用volatileon vertStepLuma。有没有更好的办法?谢谢!

4

2 回答 2

2

你在使用 gcc 内联汇编吗?然后使用clobber列表。您通知 GCC 您将使用特定的寄存器,并且 gcc 不会在内联 asm 块之后将值存储在其中。在这里阅读:http: //www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3

否则,如果它是在其他地方实现的外部函数,则 ABI 规定您只允许破坏 q4、q5、q6 和 q7 寄存器:ARM 到 C 调用约定,保存 NEON 寄存器修复函数以保存寄存器 (q0-q3),或围绕它进行内联汇编,您自己保存这些寄存器。

于 2012-04-01T05:30:02.987 回答
0

好吧,被调用者(函数)在覆盖和恢复它们之前应该只保留 Q4-Q7,这意味着调用者应该知道不能保证其他寄存器保持不变。因此,调用者必须在函数调用之前保留 Q0-Q3、Q8-Q15 并在返回时恢复它们。(编译器会自动执行此操作)

于 2012-04-03T02:32:32.313 回答