我使用霓虹灯Instrinics铿锵。
我想测试两个uint32x4_t
超过所有车道平等SIMD值。 所以没有4个的测试结果,而是一个单独的结果,告诉我,如果A和B都等于所有车道。
在Intel AVX,我会使用类似:
_mm256_testz_si256( _mm256_xor_si256( A, B ), _mm256_set1_epi64x( -1 ) )
什么是执行了NEON SIMD全车道平等测试的好办法?
我假设我需要跨车道运行的内在函数。 ARM是否有霓虹灯这些功能?
尝试这个:
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)
如果你只是想知道,如果两个向量是相等的或没有,请尝试以下代码:
result = vceqq_u32(a, b);
if (vminvq_u32(result ) != 0xffffffff) {
// not equal
} else {
// equal
}
见ARM手册: CMEQ和UMINV