在 m128 中将高 32 位与低 32 位混洗
shuffling upper 32 bits with lower 32 bits in m128
我现在正在使用 C 内在函数(SSE/SSE2),我有一个 m128 值,里面有 4 个浮点数。
是否有可能将最高 32 位移动/改组/移动到最低 32 位?
示例:
我在 m128 中有 {1.0f, 2.0f, 3.0f, 4.0f},我想用它制作 {4.0f, 2.0f, 3.0f, 1.0f}。 (中间的值可能会被删除)。
您可以通过 shufps xmm, xmm, imm8
instruction 做到这一点,您可以使用它静态 select 应该为每个输出词存储哪个输入词。
#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;
}
我现在正在使用 C 内在函数(SSE/SSE2),我有一个 m128 值,里面有 4 个浮点数。 是否有可能将最高 32 位移动/改组/移动到最低 32 位?
示例: 我在 m128 中有 {1.0f, 2.0f, 3.0f, 4.0f},我想用它制作 {4.0f, 2.0f, 3.0f, 1.0f}。 (中间的值可能会被删除)。
您可以通过 shufps xmm, xmm, imm8
instruction 做到这一点,您可以使用它静态 select 应该为每个输出词存储哪个输入词。
#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;
}