c - NEON 上有类似 "emms"的东西吗?

标签 c assembly volatile neon

我们知道,在 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/

相关文章:

c - 对 `GlewInit' 的 undefined reference - OpenGL

c++ - main in反汇编后的说明

java - 使用修饰符创建不可变类的好方法(线程安全)

java - 处理后续网络请求的线程是否能保证看到前一个请求期间写入的 volatile 变量的值?

java - 关于 Volatile 这篇文章的问题

C中的控制指令

c - 使用 argv[] 从命令行读取文件

c - 当 switch 语句中有两个连续的 break 时会发生什么?

java - 如何在 JVM 中查看 JIT 编译的代码?

c - 使用 ASM 函数覆盖弱 C 函数别名