c++ - 在 SSE 整数寄存器之间洗牌

标签 c++ sse

我有两个 sse 整数,我按如下方式分配它:

    __m128i m1 = _mm_set_epi32(4,3,2,1);
    __m128i m2 = _mm_set_epi32(40,30,20,10);

现在,我必须在这两个寄存器之间进行一些混洗,并将结果存储在另外两个寄存器中,这样输出将如下所示:

     m3 = (30,3,10,1);
     m4 = (40,4,20,2);

有什么办法可以做到这一点!!

谢谢

最佳答案

你可以这样做:

t1 = _mm_shuffle_epi32(m1, 0xd8);
t2 = _mm_shuffle_epi32(m2, 0xd8);       
m4 = _mm_unpackhi_epi32(t1,t2);
m3 = _mm_unpacklo_epi32(t1,t2);

这是一个完整的例子

#include <x86intrin.h>
#include <stdio.h>

int main() {
        __m128i m1 = _mm_set_epi32(4,3,2,1);
        __m128i m2 = _mm_set_epi32(40,30,20,10);

        __m128i m3, m4, t1, t2;
        t1 = _mm_shuffle_epi32(m1, 0xd8);
        t2 = _mm_shuffle_epi32(m2, 0xd8);       
        m4 = _mm_unpackhi_epi32(t1,t2);
        m3 = _mm_unpacklo_epi32(t1,t2);

        int out3[4], out4[4];
        _mm_store_si128((__m128i*)out3, m3);
        _mm_store_si128((__m128i*)out4, m4);
        printf("%d %d %d %d\n", out3[3], out3[2], out3[1], out3[0]);
        printf("%d %d %d %d\n", out4[3], out4[2], out4[1], out4[0]);
}

输出

30 3 10 1
40 4 20 2

关于c++ - 在 SSE 整数寄存器之间洗牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047602/

相关文章:

intel - 是否可以创建大数组 AVX/SSE 值

c++ - SSE 的整数/浮点值

c++ - 颜色和纹理如何协同工作?

c++ - 赋值给整型指针地址的 Char 指针地址

c++ - 如何将 "jni/*.c/cpp"文件添加到 CMakeLists.txt 文件?

java - 自顶向下和自底向上编程

c++ - 为什么 gzwrite vector 与 gzwrite 数组不同,数组值相同?

c++ - 清除 __m128i 的高位字节

g++ SSE 内在困境 - 来自内在 "saturates"的值

assembly - 将 XMM 寄存器压入堆栈