Сборочный код для оптимизированного смещения битов вектора - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь написать процедуру, которая будет логически сдвигать биты на n позиций вправо всеми элементами вектора наиболее эффективным способом из следующих типов векторов: BYTE-> BYTE, WORD-> WORD, DWORD-> DWORD и WORD-> BYTE (при условии, что в результате присутствуют только 8 бит).Я хотел бы иметь три подпрограммы для каждого типа в зависимости от типа процессора (поддерживается SSE2, поддерживается только MMX, поддерживается только стандартный набор команд se).Поэтому мне нужно всего 12 функций.

Я уже сам нашел, как создавать резервные копии и восстанавливать нужные мне регистры, как создавать циклы, как копировать данные в обычные регистры или регистры MMX и каксмещение на 1 позицию логически.

Потому что я не знаком с языком ассемблера, который в этом суть.Какие регистры я должен использовать для каждого набора команд?Как будет оптимизирована доступность большого вектора (изображения) в кеше L1?Как мне найти следующий элемент вектора (указатель), я знаю, что могу сделать перемещение по адресу, и я предполагаю, что мне нужно увеличить адрес на 1, 2 или 4 в зависимости от моего типа данных?

Хотя у меня есть все идеи, на данный момент написать код немного сложно.

Спасибо.

Арно.

Редактировать: Вотчто я пытаюсь сделать для MMX для сдвига на 1 на DWORD:

__asm("push mm"); // backup register
__asm("push cx"); // backup register
__asm("mov %cx, length"); // initialize loop
__asm("loopstart_shift1:"); // start label
__asm("movd %xmm0, r/m32"); // get 32 bits data
__asm("psrlq %xmm0, 1"); // right shift 32 bits data logically (stuffs 0 on the left) by 1
__asm("mov r/m32,%xmm0"); // set 32 bits data
__asm("dec %cx"); // decrement index
__asm("cmp %cx,0");
__asm("jnz loopstart_shift1");
__asm("pop cx"); // restore register
__asm("pop mm"); // restore register
__asm("emms"); // leave MMX state

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Я настоятельно рекомендую вам сделать паузу и взглянуть на использование intrinsics с C или C ++ вместо того, чтобы пытаться писать необработанный asm - таким образом компилятор C / C ++ позаботится обо всем распределении регистров, инструкциипланирование и общие служебные задачи, и вы можете просто сосредоточиться на важных частях, например, вместо использования psrlq см. _m_psrlq в mmintrin.h.(Еще лучше взглянуть на использование 128-битных встроенных функций SSE.)

0 голосов
/ 24 июня 2011

Звучит так, как если бы вы извлекли выгоду из использования или изучения источника BitMagic .он также полностью основан на встроенных функциях, что делает его гораздо более переносимым (хотя, судя по всему, вы используете GCC, поэтому может потребоваться преобразование MSVC в встроенные GCC).

...