Есть массив длиной 48 байт. Нужен алгоритм быстрого копирования/сдвига байтов в массиве. Логически массив делится на 6 блоков по 8 байт. Алгоритм для 586 должен произвести операцию в памяти. Алгоритм для SSE2 не обязан сохранять результат в память. Массив загружается в регистры следующим образом: xmm0 = 0:1 (блок 0 в low qword, блок 1 в high qword) xmm1 = 3:2 xmm2 = 5:4 В этих же регистрах должен быть и результат. В прикреплённом файле последняя версия макросов для SSE (нужен ml.exe версии 6.15). Пользуйте на свой страх и риск. Вот описание первой перетасовки: 0.0->5.0 4.0->0.0 2.2->4.6 5.0->2.4 0.6->5.6 4.6->0.6 2.3->4.7 5.6->2.2 0.7->5.7 4.7->0.7 2.4->4.0 5.7->2.3 3.[0..7] rotate left (типа ROL только на все 8 байтов) Для 586 я фактически копирую отдельные байты через 8-битные регистры и сохраняю их. ROL делаю с помощью SHLD. Мне кажется это самый быстрый вариант. Код (Text): mov ah,[esi].CubeSide0.Sqr0 mov dh,[esi].CubeSide0.Sqr6 mov ch,[esi].CubeSide0.Sqr7 mov al,[esi].CubeSide4.Sqr0 mov dl,[esi].CubeSide4.Sqr6 mov cl,[esi].CubeSide4.Sqr7 mov [esi].CubeSide0.Sqr0,al mov [esi].CubeSide0.Sqr6,dl mov [esi].CubeSide0.Sqr7,cl mov al,[esi].CubeSide2.Sqr2 mov dl,[esi].CubeSide2.Sqr3 mov cl,[esi].CubeSide2.Sqr4 mov [esi].CubeSide4.Sqr0,cl mov [esi].CubeSide4.Sqr6,al mov [esi].CubeSide4.Sqr7,dl mov al,[esi].CubeSide5.Sqr0 mov dl,[esi].CubeSide5.Sqr6 mov cl,[esi].CubeSide5.Sqr7 mov [esi].CubeSide2.Sqr2,dl mov [esi].CubeSide2.Sqr3,cl mov [esi].CubeSide2.Sqr4,al mov [esi].CubeSide5.Sqr0,ah mov [esi].CubeSide5.Sqr6,dh mov [esi].CubeSide5.Sqr7,ch mov eax,dword ptr [esi].CubeSide3 mov edx,dword ptr [esi].CubeSide3.Sqr4 shld dword ptr [esi].CubeSide3,edx,16 shld dword ptr [esi].CubeSide3.Sqr4,eax,16 Для выполнения аналогичной задачи средствами SSE2 приходится обнулять (AND) соответствующие байты в источнике и в конечном блоке, а потом OR-ить их и раскладывать назад. Код прилагается. В регистрах 6 и 7 лежат константы для логических операций. Может ли кто-нибудь предложить более быстрый вариант? Может есть более быстрый алгоритм? Или этот вариант можно ускорить? Код (Text): xmm_xchgLq xmm4,xmm1 xmm_xchg xmm3,xmm2 xmm_lo2hi xmm4,xmm0 pand xmm2,xmm7 ;!.dq067 xmm_mov xmm5,xmm4 pand xmm3,xmm6 ;.dq067 pand xmm4,xmm7 ;!.dq067 xmm_xchgLq xmm3,xmm3 pand xmm5,xmm6 ;.dq067 xmm_xchgLq xmm4,xmm4 xmm_rolHq xmm1,xmm1 por xmm4,xmm3 por xmm2,xmm5 xmm_hi2lo xmm0,xmm4 xmm_lo2lo xmm1,xmm4