测试NEON SIMD寄存器超过所有车道平等(Testing NEON SIMD registers

2019-09-30 11:35发布

我使用霓虹灯Instrinics铿锵。

我想测试两个uint32x4_t超过所有车道平等SIMD值。 所以没有4个的测试结果,而是一个单独的结果,告诉我,如果A和B都等于所有车道。

在Intel AVX,我会使用类似:

_mm256_testz_si256( _mm256_xor_si256( A, B ), _mm256_set1_epi64x( -1 ) )

什么是执行了NEON SIMD全车道平等测试的好办法?

我假设我需要跨车道运行的内在函数。 ARM是否有霓虹灯这些功能?

Answer 1:

尝试这个:

uint16x4_t t = vqmovn_u32(veorq_u32(a, b));
vget_lane_u64(vreinterpret_u64_u16(t), 0) == 0

我期望编译器执行该测试时,发现特定目标的优化。


我刚刚意识到的东西方便...

如果你想测试所有车道都小于2的某次幂,您可以通过更换做到这一点vqmovn_u32()vqshrn_n_u32() ; 我相信这可以扩展到为在+/-二的幂(包括下限,不包括上限)使用符号类型vqrshrn_n_s32() 例如,应使用能够在一个单一的测试同时接受-1,0 vqrshrn_n_s32(x, 1)



Answer 2:

如果你只是想知道,如果两个向量是相等的或没有,请尝试以下代码:

result = vceqq_u32(a, b);
if (vminvq_u32(result ) != 0xffffffff) {
     // not equal
} else {
     // equal
}

见ARM手册: CMEQ和UMINV



文章来源: Testing NEON SIMD registers for equality over all lanes