gpt4 book ai didi

assembly - 在 SSE2 上进行无符号 64 位比较的最有效方法是什么?

转载 作者:行者123 更新时间:2023-12-03 08:29:53 26 4
gpt4 key购买 nike

PCMPGTQ 在 SSE2 上不存在,并且本身不适用于无符号整数。我们的目标是为无符号 64 位比较提供向后兼容的解决方案,以便我们可以将它们纳入 WebAssembly SIMD 标准中。

这是 ARMv7+NEON 问题的姊妹问题: What is the most efficient way to do SIMD unsigned 64 bit comparison (CMHS) on ARMv7 with NEON?

并且与已针对 SSE2 和 Neon 回答的签名比较变体问题相关:

How to simulate pcmpgtq on sse2?

What is the most efficient way to support CMGT with 64bit signed comparisons on ARMv7a with Neon?

最佳答案

翻译自《黑客之乐》:

static
__m128i sse2_cmpgt_epu64(__m128i a, __m128i b) {
__m128i r = _mm_andnot_si128(_mm_xor_si128(b, a), _mm_sub_epi64(b, a));
r = _mm_or_si128(r, _mm_andnot_si128(b, a));
return _mm_shuffle_epi32(_mm_srai_epi32(r, 31), _MM_SHUFFLE(3,3,1,1));
}

概念:如果混合“符号”(无符号 MSB)则返回 a,否则返回 b - a

(MSB(a) ^ MSB(b)) ? a : b - a; // result in MSB

这是有道理的:

  • 如果 a 的 MSB 已设置,而 b 未设置,则 a 上面未签名(因此 MSB(a) 为我们的结果)
  • 如果b的MSB已设置而a的MSB未设置,则a在下面是无符号的(因此MSB(a)是我们的结果)
  • 如果它们的 MSB 相同,则它们的值位于无符号范围的同一半中,因此 b-a 实际上是 63 位减法。 MSB 将取消,并且 b-a 的 MSB 将等于“借用”输出,该输出告诉您 a 是否严格高于 b。 (就像标量 sub 的 CF 标志一样。jbjc)。所以 MSB(b-a) 就是我们的结果。

请注意,SIMD andnot/and/or 是位混合,但我们只关心 MSB。我们用 srai -> shuffle_epi32 广播它,丢弃低位中的垃圾。 (或者使用 SSE3,movshdup,如 @Soont 的答案中所述。)


它与有符号比较不同:

(MSB(a) ^ MSB(b)) ? ~a : b - a; // result in MSB

如果符号混合,那么 ~a 的符号当然也是 b 的符号。

关于assembly - 在 SSE2 上进行无符号 64 位比较的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65441496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com