#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]
должно быть красивее.