使用NEON指令比较操作

时间:2014-07-21 09:47:20

标签: arm simd neon

我有以下代码

if ( i < 0 ) {
  i = i + 1
}

使用NEON矢量化指令我需要执行上述操作。如何将NEON寄存器值与0进行比较并执行上述计算?

2 个答案:

答案 0 :(得分:3)

您不需要很多说明。单个vsra指令将执行(向量右移累积):

vsra.u32 q0, q0, #31 // i += ((unsigned int) i) >> 31;

请注意,它是u32,而不是s32

NEON很容易学习,但很难掌握,因为您需要了解许多与黑客相关的技术,以便编写像这样的高效代码,这比传统的if-else方法快很多倍。

答案 1 :(得分:1)

您可以进行比较,然后减去结果,因为true比较结果相当于-1:

const int32x4_t vk0 = { 0 };

uint32x4_t vcmp = vcltq_s32(va, vk0);  // a < 0 ? 
va = vsubq_s32(va, (int32x4_t)vcmp);   // subtract -1 (i.e. add 1) for
                                       // each element where a < 0

如果您想在装配级别执行此操作,则只需使用以下说明: