assembly - 在 ARMv7a 和 Neon 上通过 64 位签名比较来支持 CMGT 的最有效方法是什么?

标签 assembly arm simd webassembly neon

这个问题最初是针对 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/

相关文章:

组装:打印时无意中添加十六进制数字

docker - 如何为ARM设备构建Docker镜像?

重置后的ARM PC值

makefile - 使用 make,如何在程序集项目中使用 .c 文件防止这种行为?

c - 将参数从 C 传递给程序集?

algorithm - 在 MIPS 中查找字数组中的重复整数

C++ 异常开销

c++ - openmp omp declare uniform 这在 GCC 中不受支持吗?

c++ - 使用SIMD指令的平行二项式系数

c++ - (Vec4 x Mat4x4) 产品使用 SIMD 和改进