C 在m128中将上32位与下32位混洗

C 在m128中将上32位与下32位混洗,c,sse,simd,intrinsics,C,Sse,Simd,Intrinsics,我现在正在使用C内部函数(仅限SSE/SSE2),我有一个m128值,其中有4个浮点数。 是否有可能将最高位的32位移位/混洗/移动到最低位的32位 例如: 我在m128中有{1.0f,2.0f,3.0f,4.0f},我想把它变成{4.0f,2.0f,3.0f,1.0f}。(beetween中的值可能会被删除)。您可以通过,静态选择每个输出字应存储的输入字 #include <stdio.h> #include <xmmintrin.h> int main(void)

我现在正在使用C内部函数(仅限SSE/SSE2),我有一个m128值,其中有4个浮点数。 是否有可能将最高位的32位移位/混洗/移动到最低位的32位

例如: 我在m128中有{1.0f,2.0f,3.0f,4.0f},我想把它变成{4.0f,2.0f,3.0f,1.0f}。(beetween中的值可能会被删除)。

您可以通过,静态选择每个输出字应存储的输入字

#include <stdio.h>
#include <xmmintrin.h>

int main(void) {
    float array[4] = {1.0f, 2.0f, 3.0f, 4.0f};
    __m128 data;
    printf("before : %.1f %.1f %.1f %.1f\n", array[0], array[1], array[2], array[3]);
    data = _mm_loadu_ps(array);
    data = _mm_shuffle_ps(data, data, 0x27);
    _mm_storeu_ps(array, data);
    printf("after  : %.1f %.1f %.1f %.1f\n", array[0], array[1], array[2], array[3]);
    return 0;
}
#包括
#包括
内部主(空){
浮点数组[4]={1.0f,2.0f,3.0f,4.0f};
__m128数据;
printf(“before:%.1f%.1f%.1f%.1f%.1f\n”,数组[0],数组[1],数组[2],数组[3]);
数据=_mm_loadu_ps(数组);
数据=_mm_shuffle_ps(数据,数据,0x27);
_mm_storeu_ps(数组、数据);
printf(“之后:%.1f%.1f%.1f%.1f%.1f\n”,数组[0],数组[1],数组[2],数组[3]);
返回0;
}
您可以通过,通过它您可以静态地选择每个输出字应该存储哪个输入字

#include <stdio.h>
#include <xmmintrin.h>

int main(void) {
    float array[4] = {1.0f, 2.0f, 3.0f, 4.0f};
    __m128 data;
    printf("before : %.1f %.1f %.1f %.1f\n", array[0], array[1], array[2], array[3]);
    data = _mm_loadu_ps(array);
    data = _mm_shuffle_ps(data, data, 0x27);
    _mm_storeu_ps(array, data);
    printf("after  : %.1f %.1f %.1f %.1f\n", array[0], array[1], array[2], array[3]);
    return 0;
}
#包括
#包括
内部主(空){
浮点数组[4]={1.0f,2.0f,3.0f,4.0f};
__m128数据;
printf(“before:%.1f%.1f%.1f%.1f%.1f\n”,数组[0],数组[1],数组[2],数组[3]);
数据=_mm_loadu_ps(数组);
数据=_mm_shuffle_ps(数据,数据,0x27);
_mm_storeu_ps(数组、数据);
printf(“之后:%.1f%.1f%.1f%.1f%.1f\n”,数组[0],数组[1],数组[2],数组[3]);
返回0;
}

\u MM\u SHUFFLE
可用于组成
0x27
常量。它使元素的去向更加明显。
\u MM\u SHUFFLE
宏可用于组合
0x27
常量。它使哪些元素流向何处变得更加明显。