c++ - 如何反转 __m128 类型变量?

标签 c++ c x86 sse simd

我知道这应该是一个谷歌搜索问题,但我就是找不到答案。

假设我有一个__m128变量a,它的内容是a[0]a[1]a[2]a[3]。是否有单个函数可以将其反转为a[3]a[2]a[1]a[0]

最佳答案

使用_mm_shuffle_ps() .该指令已在 SSE 中可用,并且可以通过组合来自两个输入 vector 中的每一个的任意 32 位分量,将 4 个 32 位分量收集到一个 vector 中。

如何使用宏 _MM_SHUFFLE() 创建掩码

宏定义如下:

/* Create a selector for use with the SHUFPS instruction.  */
#define _MM_SHUFFLE(fp3,fp2,fp1,fp0) \
 (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | (fp0))

源索引和目标索引按升序从右到左运行。 前两个选择器值(fp0fp1)指定m1 中的源组件。 , 最后两个( fp2fp3 )在 m2 中的那些.每个选定的源组件都分配给 m3[index] , 其中index对应于它的选择器参数 fp<index> .

反转 vector 中的 32 位分量

__m128 input = ...;
__m128 reversed = _mm_shuffle_ps(input,input,_MM_SHUFFLE(0, 1, 2, 3));

注意:掩码是立即数。它不能是动态的,因为它是生成的机器指令的一部分。

英特尔内部函数指南:https://software.intel.com/sites/landingpage/IntrinsicsGuide/

关于c++ - 如何反转 __m128 类型变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20051746/

相关文章:

c - 在 C 中进行类型转换后复制数组的更快方法?

c - 如何从 C 代码中获取单操作数 imul

c++ - 在不破坏封装的情况下访问功能替代品

c++ - 升压:Serialization: Who cleans up the deserialized data?

c++ - 我需要在 VS 上更改编译器

c - 如果应用程序在 lxc 容器中运行,则向 Netlink 发送消息失败并显示 ECONNREFUSED

c - 如何在 FFmpeg 代码 (C) 中设置帧速率/FPS?

c++ - GDB 在操作 SSE2 寄存器时报告 EXC_BAD_ACCESS

android - 谷歌使用新的 Intel Atom x86 仿真器映射 SDK

c++ - 没有合适的用户定义转换