簡體   English   中英

_mm_movemask_epi8 的內在逆

[英]Intrinsic inverse to _mm_movemask_epi8

所以首先我將描述這個任務:

我需要:

  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 這樣做,不勝感激。

當您在向量比較之后執行_mm_movemask_epi8時,產生-1true0false ,您將獲得一個 16 位整數(僅假設 SSE),其中第n字節的第n設置為-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);
}

請注意,您可能希望對從整數掩碼轉換而來的向量掩碼進行按位運算,而無需在整數運算和向量運算之間來回切換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM