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

Tra*_*isG 3 c sse simd

我正在使用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装配,我希望有更快的方法来执行此操作.

Pau*_*l R 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 }
Run Code Online (Sandbox Code Playgroud)

  • 很好......这并不像我想象的那么令人讨厌.当然,我从来没有努力过,因为我通常可以访问SSE4.1. (3认同)