C++ SSE整数寄存器之间的洗牌

C++ SSE整数寄存器之间的洗牌,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); 现在,我必须在这两个寄存器之间进行一些洗牌,并将结果存储在另外两个寄存器中,以便输出如下: __m128i m1 = _mm_set_epi32(4,3,2,1); __m128i m

我有两个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);
现在,我必须在这两个寄存器之间进行一些洗牌,并将结果存储在另外两个寄存器中,以便输出如下:

    __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]);
}

我对Z玻色子提出了一个稍微不同的解决方案:

#include <emmintrin.h>
#include <iostream>
#include <cstring>

void print_data(const char *name, __m128i v)
{
    struct { int a, b, c, d; } unpacked;

    std::memcpy((void *)&unpacked, (void *)&v, sizeof(v));
    std::cout << name << ":";
    std::cout << unpacked.d << " " << unpacked.c << " " 
          << unpacked.b << " " << unpacked.a << std::endl;
}

int main()
{

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

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

    __m128i tmp1 = _mm_shuffle_epi32(m2, 0x80);
    __m128i tmp2 = _mm_shuffle_epi32(m1, 0x31);
    __m128i m3 = _mm_or_si128(_mm_and_si128(mask, tmp1), _mm_andnot_si128(mask, m1));
    __m128i m4 = _mm_or_si128(_mm_and_si128(mask, m2), _mm_andnot_si128(mask, tmp2));

    print_data("m3", m3);
    print_data("m4", m4);
}
#包括
#包括
#包括
无效打印数据(常量字符*名称,uuu m128i v)
{
结构{inta,b,c,d;}未打包;
标准:memcpy((void*)和未包装,(void*)和v,sizeof(v));

std::不能,但我想处理sseshuffle@MarcoA.这是用来在一个寄存器中洗牌的…我想在两个寄存器之间洗牌。对了,对不起。我应该读更多的carefully@MarcoA.没问题。但你有什么想法吗?老实说,是的,但不幸的是我太累了,无法尝试它,对不起:/I我可能明天就试试WBTW 0xd8=3120,以4为基数(11011000为二进制)。这会告诉您我交换的是哪些数字。我知道以4为基数并不常见,但在这种情况下很方便。