将 Intrinsic xmm 寄存器转换为 uint8_t 数组[16]

Posted

技术标签:

【中文标题】将 Intrinsic xmm 寄存器转换为 uint8_t 数组[16]【英文标题】:Convert Intrinsic xmm register into uint8_t array[16] 【发布时间】:2011-10-05 10:56:09 【问题描述】:

如何有效地将 xmm 寄存器转储到 uint8_t 数组 [16] 中?

【问题讨论】:

(我不知道,但我相信你应该指定你正在使用什么编译器,以及什么CPU。) 【参考方案1】:

_mm_store_si128 将 sse2 寄存器内容存储到指定的内存中。 _mm_store_ps 和 _mm_store_pd 是用于浮点或双寄存器内容的变体。目的地未对齐时,必须使用storeu。

__m128i var;
__declspec( align(16) ) uint8_t array[16];

_mm_store_si128( (__m128i*) array, var );

【讨论】:

但它是特定于微软的....,我在 intel 硬件上使用 linux,我需要将 ipv6 地址 (uint8_t addr[16]) 转换为 __m128 实体.. 有什么想法吗? 您想使用_mm_loadu_si128 将未对齐的数据加载到 SSE 寄存器中。 __declspec( align( 16 ) ) 可以替换为等效的 gcc/clang/etc 属性... alignas (?)【参考方案2】:

memcpy() 怎么样?文档here.

__m128d var;
uint8_t array[16];

memcpy(array, &var, sizeof(array));

【讨论】:

array 而不是 &array[0] 应该更漂亮。

以上是关于将 Intrinsic xmm 寄存器转换为 uint8_t 数组[16]的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个 XMM 128 位寄存器拆分为两个 64 位整数寄存器?

将 XMM 寄存器设置为重复字节模式(广播常量字节)

如何在 x86(32 位)程序集中将无符号整数转换为浮点数?

将单个浮点数移动到 xmm 寄存器

将浮点数从高 xmm 四字移动到低 xmm 四字

如何将浮点常量值移动到xmm寄存器中?