我们知道,在 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 上做到这一点呢?我的临时解决方案是在 vertStepLuma
上使用 volatile
。有没有更好的办法?谢谢!
最佳答案
您使用 gcc 内联汇编吗?然后使用破坏列表。您通知 GCC 您将使用特定的寄存器,并且 gcc 不会在内联 asm block 之后将值存储在其中。阅读此处: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),或在其周围创建一个内联汇编,以便您自己保存这些寄存器。
关于c - NEON 上有类似 "emms"的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9961685/