【问题标题】:SSE2 instruction to typecast an integer register to short register and vice-versaSSE2 指令将整数寄存器类型转换为短寄存器,反之亦然
【发布时间】:2013-05-11 05:46:07
【问题描述】:

是否有任何 SSE2 指令将整数寄存器类型转换为短寄存器,反之亦然?请提出建议。

【问题讨论】:

    标签: x86 sse simd sse2


    【解决方案1】:

    这取决于您所说的“类型转换”究竟是什么意思,但如果您正在寻找缩小操作,那么您可以使用 _mm_packs_epi32 (PACKSSDW) 将两个整数向量打包成一个短向量:

    __m128i vint1, vint2;  // 2 vectors of 4 x 32 bit ints
    __m128i vshort;        // 1 vector of 8 x 16 bit ints
    
    vshort = _mm_packs_epi32 (vint1, vint2);
    

    可以这样实现反向、加宽(解包)操作:

     vint1 = _mm_srai_epi32(_mm_unpacklo_epi16(vshort, vshort), 16); // PUNPCKLWD+PSRAD
     vint2 = _mm_srai_epi32(_mm_unpackhi_epi16(vshort, vshort), 16); // PUNPCKHWD+PSRAD
    

    请注意,使用 SSE 解包指令时没有自动符号扩展,因此在扩展有符号值时需要进行算术移位。

    【讨论】:

    • 我的意思正是你所指出的。但是是否有可能做相反的事情,即将 1 个 8 X 16 位整数向量扩展为 2 个 4 X 32 位整数向量,一个具有较低的 4 个短值,另一个具有较高的值。
    • 是的,也有扩展操作 - 我将添加一个示例。再次,我建议获取Intel Intrinsics Guide,它将比我更快、更明确地回答您的问题。
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多