将 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 位整数寄存器?