Извлечение данных из регистра xmm в «стандартные» переменные, внутренние - PullRequest
4 голосов
/ 20 октября 2011

Как мне извлечь 2 байта или любое количество байтов из регистра xmm?

В настоящее время я использую массив для дампа всего регистра, а затем я получаю доступ к байтам, которые я хочу. Однако это не так эффективно, как могло бы быть. Есть ли способ эффективно получить только те байты, которые мне интересны?

(я работаю в C на Linux 64bit)

Ответы [ 3 ]

3 голосов
/ 29 октября 2011

Мнемониками для инструкций, которые вы, вероятно, хотите, являются MOVD и MOVQ и соответствующие им значения _mm_cvtsi128_si32 и _mm_cvtsi128_si64.

1 голос
/ 30 октября 2011

С SSE2 вы можете найти _mm_extract_epi16 и _mm_insert_epi16 вheader.

SSE4.1 добавляет _mm_extract_epi8, _mm_extract_epi32, _mm_insert_epi8 и _mm_insert_epi32 вheader.

Вы можете выполнить поиск по любому из них, чтобы найти точный синтаксис и семантику, но в целом формы «extract» принимают два аргумента: __m128i и постоянное целое число, представляющее индекс.Формы «insert» принимают __m128i, значение и индекс.

1 голос
/ 30 октября 2011

В SSE4.1 введены инструкции INSERTPS и PINS , считывающие 8, 16 или 32 бита из ячейки памяти регистра x86 и вставляющие их в поле в заданном регистре XMM, заданномнепосредственным операндом.

EXTRACTPS и PEXTR считывают поле из исходного XMM-регистра и вставляют его в регистр x86 или область памяти.

...