这个问题最初是针对 SSE2 here 提出的。由于每个算法都与 ARMv7a+NEON 对相同操作的支持重叠,因此问题已更新为包括 ARMv7+NEON 版本。应评论者的要求,在这里提出这个问题是为了表明它确实是一个单独的主题,并提供可能对 ARMv7+NEON 更实用的替代解决方案。这些问题的最终目的是找到考虑 WebAssembly SIMD 的理想实现。
最佳答案
有符号 64 位饱和减法。
假设我使用 _mm_subs_epi16
进行的测试是正确的,并且转换为 1:1 到 NEON...
uint64x2_t pcmpgtq_armv7 (int64x2_t a, int64x2_t b) {
return vreinterpretq_u64_s64(vshrq_n_s64(vqsubq_s64(b, a), 63));
}
这肯定是模拟 pcmpgtq
最快可实现的方法。
Hacker's Delight的免费章节 给出以下公式:
// return (a > b) ? -1LL : 0LL;
int64_t cmpgt(int64_t a, int64_t b) {
return ((b & ~a) | ((b - a) & ~(b ^ a))) >> 63;
}
int64_t cmpgt(int64_t a, int64_t b) {
return ((b - a) ^ ((b ^ a) & ((b - a) ^ b))) >> 63;
}
关于assembly - 在 ARMv7a 和 Neon 上通过 64 位签名比较来支持 CMGT 的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65191073/