Я пытаюсь написать процедуру, которая будет логически сдвигать биты на 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