我正在使用VS2005(在工作中)并且需要一个执行以下操作的SSE内在函数:
我预先存在__m128i
n ,其中填充了16位整数a_1,a_2,....,a_8
。
由于我现在想做的一些计算需要32位而不是16位,我想从 n 中提取两组四位16位整数并将它们分成两个分开的{{ 1}}分别包含__m128i
和a_1,...,a_4
。
我可以使用各种a_5,...,a_8
内在函数手动执行此操作,但这些会在汇编中产生八个_mm_set
,我希望有更快的方法来执行此操作。< / p>
答案 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 }