在 m128 中用低 32 位改组高 32 位

Posted

技术标签:

【中文标题】在 m128 中用低 32 位改组高 32 位【英文标题】:shuffling upper 32 bits with lower 32 bits in m128 【发布时间】:2021-05-19 13:24:38 【问题描述】:

我现在正在使用 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 中的值可能会被删除)。

【问题讨论】:

【参考方案1】:

您可以通过shufps xmm, xmm, imm8 instruction 执行此操作,您可以使用它静态选择应为每个输出字存储哪个输入字。

#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;

【讨论】:

_MM_SHUFFLE 宏可用于组成0x27 常量。它使哪些元素去哪里变得更加明显。

以上是关于在 m128 中用低 32 位改组高 32 位的主要内容,如果未能解决你的问题,请参考以下文章

C#和sqlserver中生成新的32位GUID

Linux 内存寻址

C语言 怎么区分当前系统是32位还是64位?

STM32中用 stop 模式 配合低功耗模式下的自动唤醒(AWU) 能否实现FreeRTOS tickless 模式

指针相关

为啥C语言中用float类型进行较大值的运算会丢失较多精度