能否使用SSE2 _mm_cmpeq_pd这类浮点比较指令比较64位整数?
浮点比较指令能否用于64位整数比较的解答
核心结论
SSE2 _mm_cmpeq_pd、AVX _mm_cmp_pd这类浮点比较指令,绝对不能直接用来模拟64位整数相等比较_mm_cmpeq_epi64,原因如下:
- 浮点相等比较不是按位比对,存在两类不符合整数比较规则的特殊处理:
- NaN值判定规则:只要任意一个操作数是NaN,无论两个NaN的二进制表示是否完全一致,浮点比较都会返回「不相等」
- 正负零判定规则:
+0和-0的二进制表示完全不同,但浮点比较会判定二者相等,这对64位整数来说属于两个完全不同的数值
_mm_cmpeq_epi64的正确模拟方案
如果目标环境不支持SSE4.1(SSE4.1及以上指令集已原生提供_mm_cmpeq_epi64),可以通过拆分高低32位整数比较的方式实现,性能几乎无损失,且完全符合整数比较规则:
// SSE2环境下模拟_mm_cmpeq_epi64的实现 __m128i mm_cmpeq_epi64_sse2(__m128i a, __m128i b) { // 先逐32位比较是否相等 __m128i cmp_32 = _mm_cmpeq_epi32(a, b); // 交换每个64位元素的高低32位比较结果 __m128i shuffle_cmp = _mm_shuffle_epi32(cmp_32, _MM_SHUFFLE(2, 3, 0, 1)); // 高低32位同时相等时,对应64位元素的所有位才会被置为全1 return _mm_and_si128(cmp_32, shuffle_cmp); }
内容的提问来源于stack exchange,提问作者Alex Guteniev
相关产品推荐
相关产品推荐

