【问题标题】:Is there something like "emms" on NEON?NEON 上有类似“emms”的东西吗?
【发布时间】:2012-04-01 03:37:03
【问题描述】:

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

【问题讨论】:

    标签: c assembly volatile neon


    【解决方案1】:

    你在使用 gcc 内联汇编吗?然后使用clobber列表。您通知 GCC 您将使用特定的寄存器,并且 gcc 不会在内联 asm 块之后将值存储在其中。在这里阅读: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),或进行内联在它周围组装,您可以自己保存这些寄存器。

    【讨论】:

    • 它是外部函数。您的建议很有帮助!
    • 恰恰相反。 ABI 规定您不得破坏 Q4-Q7
    • 哎呀。对不起。是的,情况正好相反,不是我写的。
    【解决方案2】:

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

    【讨论】:

    • 糟糕,抱歉。这应该是对马丁斯回答的评论。
    猜你喜欢
    • 2011-03-31
    • 2017-07-15
    • 2014-09-22
    • 2010-11-29
    • 2020-03-26
    • 2011-10-18
    • 2023-03-09
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多