我需要做两个128位整数的水平xor(通过32位整数)并将结果组合成一个64位整数。所以这样的操作:
uint32_t x0[4];
uint32_t x1[4];
uint32_t xor0 = x0[0];
uint32_t xor1 = x1[0];
for (int i = 1; i < 4; ++i) {
xor0 ^= x0[i];
xor1 ^= x1[i];
}
uint64_t xor = uint64_t(xor1) << 32 | xor0;
我终于找到了以下代码,这似乎有效:
__m128i x0 = ...;
__m128i x1 = ...;
__m128i xor64_0 = _mm_unpackhi_epi64(x0, x1);
__m128i xor64_1 = _mm_unpacklo_epi64(x0, x1);
__m128i xor64 = _mm_xor_si128(xor64_0, xor64_1);
__m128i xor32_0 = _mm_shuffle_epi32(xor64, _MM_SHUFFLE(3, 1, 2, 0));
__m128i xor32_1 = _mm_shuffle_epi32(xor64, _MM_SHUFFLE(2, 0, 3, 1));
__m128i xor32 = _mm_xor_si128(xor32_0, xor32_1);
uint64_t xor = _mm_cvtsi128_si64(xor32);
这是最快的实施吗?将整数和浮点运算组合起来是否合理,例如_mm_movehdup_ps(。)?