gpt4 book ai didi

c - _mm_movemask_epi8 的内在逆

转载 作者:行者123 更新时间:2023-12-05 01:50:45 29 4
gpt4 key购买 nike

所以首先我将只描述任务:

我需要:

  1. 比较两个 __m128i
  2. 以某种方式对具有特定 uint16_t 值的结果进行按位与运算(可能首先使用 _mm_movemask_epi8,然后才使用 &)。<
  3. 根据结果对初始值进行混合

所以问题是您可能已经猜到,blend 接受 __m128i 作为掩码,而我将使用 uint16_t。因此,要么我需要某种针对 _mm_movemask_epi8 的逆向指令,要么完全做其他事情。

一些要点——我可能无法将 uint16_t 值更改为其他类型,这很复杂;我在 SSE4.2 上这样做,所以没有 AVX;这里有一个类似的问题How to perform the inverse of _mm256_movemask_epi8 (VPMOVMSKB)?但这是关于 avx 的,我对此非常缺乏经验,所以我无法采用该解决方案。

PS:我可能也需要为 arm 做这件事,如果有任何建议,我将不胜感激。

最佳答案

当你做 _mm_movemask_epi8在 vector 比较之后,产生 -1对于 true0对于 false ,你会得到一个 16 位整数(假设只有 SSE)有 nn 设置的第 byte 等于 -1在 vector 中。

下面是反向(inverse?)操作。

static inline __m128i bitMaskToByteMask16(int m) {
__m128i sel = _mm_set1_epi64x(0x8040201008040201);
return _mm_cmpeq_epi8(
_mm_and_si128(
_mm_shuffle_epi8(_mm_cvtsi32_si128(m),
_mm_set_epi64x(0x0101010101010101, 0)),
sel),
sel);
}

请注意,您可能希望对从整数掩码转换而来的 vector 掩码执行按位运算,而无需在整数运算和 vector 运算之间来回切换。

关于c - _mm_movemask_epi8 的内在逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72898737/

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