gpt4 book ai didi

assembly - 如何在sse2上模拟pcmpgtq?

转载 作者:行者123 更新时间:2023-12-03 15:47:56 27 4
gpt4 key购买 nike

PCMPGTQ 是在 sse4.2 中引入的,它为产生掩码的 64 位数字提供大于符号的比较。
如何在 sse4.2 之前的指令集上支持此功能?
更新:同样的问题适用于带有 Neon 的 ARMv7,它也缺少 64 位比较器。对此的姐妹问题可以在这里找到:What is the most efficient way to support CMGT with 64bit signed comparisons on ARMv7a with Neon?

最佳答案

__m128i pcmpgtq_sse2 (__m128i a, __m128i b) {
__m128i r = _mm_and_si128(_mm_cmpeq_epi32(a, b), _mm_sub_epi64(b, a));
r = _mm_or_si128(r, _mm_cmpgt_epi32(a, b));
return _mm_shuffle_epi32(r, _MM_SHUFFLE(3,3,1,1));
}
我们有 32 位有符号比较内在函数,因此将打包的 qwords 拆分为 dwords 对。
如果 a 中的高双字大于 b 中的高双字那么就没有必要比较低双字了。
if (a.hi > b.hi) { r.hi = 0xFFFFFFFF; }
if (a.hi <= b.hi) { r.hi = 0x00000000; }
如果 a 中的高双字等于 b 中的高双字然后 64 位减法将清除或设置结果的所有 32 个高位(如果高双字相等,则它们彼此“取消”,有效地对低双字进行无符号比较,将结果放在高双字中)。
if (a.hi == b.hi) { r = (b - a) & 0xFFFFFFFF00000000; }
将高 32 位中的比较掩码复制到低 32 位。
r.lo = r.hi
更新:这是 Godbolt适用于 SSE2 和 ARMv7+Neon。

关于assembly - 如何在sse2上模拟pcmpgtq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65166174/

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