影响标志的霓虹汇编向量指令
Posted
技术标签:
【中文标题】影响标志的霓虹汇编向量指令【英文标题】:neon assembly vector instructions that affect flags 【发布时间】:2013-06-13 14:00:51 【问题描述】:我使用 arm 组件和 NEON SIMD 指令。我想获得两个 Q 寄存器中的最大 16 位无符号值,并将它们与阈值进行比较。如果所有 16 位值都小于阈值,我调用一个函数。如果一个或多个值大于阈值,我调用另一个函数。
以下 SIMD 指令获得最大值。
// 阈值是一个 r 寄存器
vdup.16 q15, threshold
vmax.u16 q12, q14, q13
vcgt.u16 q11, q12, q15
vcgt 会影响 FPSCR 标志吗?我想不是。然后我必须检查 q11 是否为零。如果是zeor,调用function1,否则调用function2。 就像
if (q11 == 0)
//call function1
else
//call function2
如何在不将 q11 移动到 4 r 寄存器的情况下做到这一点?
谢谢
【问题讨论】:
【参考方案1】:没有——至少在用户模式下没有。 这些 cmp 指令创建掩码向量,您可以根据这些向量在两个结果之间选择值。
-
使用适当的 vcmp 创建掩码
计算两种情况的结果
使用 1 中的掩码将上述两个结果中的相应元素放置到每个车道。
目前我无法准确告诉您这些说明是什么,因为我是在火车上用 iPhone 写的。但在参考手册中找到它们不会有问题。
【讨论】:
我不想计算这两种情况的结果。我想通过根据阈值一次只选择一个案例来提高程序的速度。这就是为什么,我发布了我的问题。我会找到另一种方式。还是谢谢。 我找到了另一种方法,缩小 q13 中的值,然后将向量与零进行比较。 您应该避免在 NEON 工作时进行任何类型的函数调用。一旦 ARM 寄存器访问内存(这将在函数调用中发生),就会导致流水线停顿,这通常会浪费大约 12 个周期。 ... 更不用说对于每个函数调用,您(或您的编译器)还需要将所有适当的 Q 寄存器存储到堆栈中,以避免被调用函数损坏。这就是为什么大多数 DSP 内核都是叶函数的原因。做你描述的事情是非常低效的。更容易按照 Jake 的建议进行操作,只需内联您的函数即可。 对算法进行矢量化的另一个想法是将所有比较的结果放在一个本质上是布尔值的数组中。当函数返回时,调用函数可以遍历结果数组,并调用相应的子函数。以上是关于影响标志的霓虹汇编向量指令的主要内容,如果未能解决你的问题,请参考以下文章