3

我正在使用 VS2005(在工作中)并且需要执行以下操作的 SSE 内在函数:

我有一个预先存在的__m128i n填充 16 位整数a_1,a_2,....,a_8

由于我现在想做的一些计算需要 32 位而不是 16 位,所以我想从n中提取两个四组 16 位整数,并将它们放入两个分别__m128i包含a_1,...,a_4和的分隔 s 中a_5,...,a_8

我可以使用各种_mm_set内在函数手动执行此操作,但这些会导致mov汇编中的 8 个 s,我希望有一种更快的方法来执行此操作。

4

1 回答 1

5

假设我正确理解了您想要实现的目标(将一个向量中的 8 x 16 位解压缩为两个 4 x 32 位整数的向量),我通常在 SSE2 及更高版本中这样做:

__mm128i v = _mm_set_epi16(7, 6, 5, 4, 3, 2, 1, 0);  // v = { 7, 6, 5, 4, 3, 2, 1, 0 }
__mm128i v_lo = _mm_srai_epi32(_mm_unpacklo_epi16(v, v), 16); // v_lo = { 3, 2, 1, 0 }
__mm128i v_hi = _mm_srai_epi32(_mm_unpackhi_epi16(v, v), 16); // v_hi = { 7, 6, 5, 4 }
于 2013-02-06T08:28:47.447 回答