Преобразовать встроенный регистр xmm в массив uint8_t[16]

#c #type-conversion #intrinsics

#c #преобразование типа #встроенные

Вопрос:

Как я могу эффективно сбросить регистр xmm в массив uint8_t [16]?

Комментарии:

1. (Я понятия не имею, но я считаю, что вам следует указать, какой компилятор вы используете и какой процессор.)

Ответ №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 );
  

Комментарии:

1. Но это специфично для Microsoft …., я использую linux на оборудовании Intel, и мне нужно преобразовать и ipv6-адрес (uint8_t addr[16]) в объект __m128.. есть идеи?

2. Вы хотите использовать _mm_loadu_si128 для загрузки невыровненных данных в регистр SSE. __declspec( align( 16 ) ) может быть заменен эквивалентным свойством gcc / clang / etc … выравнивание (?)

Ответ №2:

как насчет memcpy() ? Документ здесь.

 __m128d var;
uint8_t array[16];

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

Комментарии:

1. array вместо amp;array[0] должно быть красивее.