【问题标题】:Intrinsic inverse to _mm_movemask_epi8_mm_movemask_epi8 的内在逆
【发布时间】:2022-07-07 22:36:32
【问题描述】:

所以首先我将描述一下任务:

我需要:

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

所以问题是你可能已经猜到了 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 执行此操作,不胜感激。

【问题讨论】:

    标签: c x86 simd sse sse4


    【解决方案1】:

    当您在矢量比较之后执行_mm_movemask_epi8 时,会为true 生成-1,为false 生成0,您将得到一个具有@987654326 的16 位整数(假设仅SSE) @th bit 为向量中的nth byte 设置等于-1

    下面是逆向操作。

    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);
    }
    

    请注意,您可能希望对从整数掩码转换而来的向量掩码进行按位运算,而不是在整数运算和向量运算之间来回切换。

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 2012-08-05
      • 1970-01-01
      • 2021-04-15
      • 2020-06-06
      • 1970-01-01
      • 2020-05-31
      • 2016-08-10
      • 1970-01-01
      相关资源
      最近更新 更多