我必须提取__m128i寄存器的非零值。
例如,我有一个带有八个无符号短裤的向量。
__m128i vector {40, 0, 22, 0, 0, 0, 0, 8}
我想用最少的SSE指令提取40、22和8。
然后,非零值将存储在非零值数组中。
{40, 22, 8, more values from different vectors ... }
是否有可能将它们洗牌或提取和存储它们的良好内在特性?
最佳答案
如果您查看at this paper,那么作者将描述如何使用_mm_cmpestrm指令基本上完成您想要的操作。他们算法的核心是这个(我对其做了一些修改,以完成您想要的,而不是他们想要的):
__m128i res_v = _mm_cmpestrm(
vector,
8,
mm_setzero_si128(),
8,
_SIDD_UWORD_OPS|_SIDD_CMP_EQUAL_ANY|_SIDD_BIT_MASK|_SIDD_NEGATIVE_POLARITY);
int r = _mm_extract_epi32(res_v, 0);
__m128i p = _mm_shuffle_epi8(vector, sh_mask[r]);
如果按照本文所述构建查找表sh_mask,则p应该具有非零元素(无任何重新排序),后跟零元素。 r中设置的位数将告诉您非零元素的数量。
不幸的是,_mm_cmpestrm位于SSE4中。
关于c - 使用SSE从_m128i寄存器中提取非零值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15767404/