【发布时间】:2019-10-30 12:22:08
【问题描述】:
在How to perform the inverse of _mm256_movemask_epi8 (VPMOVMSKB)? 中,OP 要求_mm256_movemask_epi8 的倒数,但是对于SSE 的_mm_movemask_ps(),是否有更简单的版本?这是我能想到的最好的,还不错。
__m128 movemask_inverse(int x) {
__m128 m = _mm_setr_ps(x & 1, x & 2, x & 4, x & 8);
return _mm_cmpneq_ps(m, _mm_setzero_ps());
}
【问题讨论】:
-
口罩应该这样吗?不是倒过来了吗?
-
@harold 你是对的。通过更改为
setr修复 -
Peter Cordes 在is there an inverse instruction to the movemask instruction in intel avx2? 上的回答讨论了有关 AVX2 案例的许多想法。大多数这些想法也可以以某种形式用于 SSE 案例。 LUT方案和ALU方案适合你的情况。
-
参见例如this Godbolt link。
-
@wim 谢谢,这很聪明,而且性能更好一些。发布代码作为答案,我会接受。