![](/img/trans.png)
[英]How to perform the inverse of _mm256_movemask_epi8 (VPMOVMSKB)?
[英]Intrinsic inverse to _mm_movemask_epi8
所以首先我將描述這個任務:
我需要:
__m128i
。uint16_t
值的結果進行按位和運算(可能先使用_mm_movemask_epi8
,然后再使用&
)。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
時,產生-1
為true
和0
為false
,您將獲得一個 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.