在NEON上有类似“emms”的东西吗?

时间:2012-04-01 03:37:03

标签: c assembly volatile neon

我们知道在NEON上,SIMD寄存器q0q7与浮动寄存器s0s31共享。所以下面的代码有一个错误:

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。有没有更好的办法?谢谢!

2 个答案:

答案 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,并在返回时恢复它们。 (编译器自动执行此操作)

相关问题