在SSE寄存器中“扩展”数据类型大小

时间:2013-02-06 08:17:01

标签: c sse simd

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

我预先存在__m128i n ,其中填充了16位整数a_1,a_2,....,a_8

由于我现在想做的一些计算需要32位而不是16位,我想从 n 中提取两组四位16位整数并将它们分成两个分开的{{ 1}}分别包含__m128ia_1,...,a_4

我可以使用各种a_5,...,a_8内在函数手动执行此操作,但这些会在汇编中产生八个_mm_set,我希望有更快的方法来执行此操作。< / p>

1 个答案:

答案 0 :(得分: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 }