Вот результаты тестов: Processor======Old version================bogrus version=== PIII 533________0.006218-0.006378__________0.003921-0.003961 PIV 2,4 dual_____0.001996-0.001997__________0.001613-0.001614 PIV 2,8_________0.001985-0.001996__________0.000716-0.000742 На Селеронах разница чуть-ли не в три раза.
Вот еще один кусок, пробовал соптимизировать аналогичным образом - но мне не хватает регистров, точнее регистра (( Код (Text): #define MACRO_GOST4_OLD(aa,bb) \ { \ _asm{mov eax, [ecx][aa]} \ _asm{add eax, edi} \ _asm{mov dl, al} \ _asm{mov bl, ah} \ _asm{mov al, [ebp][edx+OFFSET_GOST_SBOX1]} \ _asm{mov ah, [ebp][ebx+OFFSET_GOST_SBOX2]} \ _asm{ror eax, 16} \ _asm{mov dl, al} \ _asm{mov bl, ah} \ _asm{mov al, [ebp][edx+OFFSET_GOST_SBOX3]} \ _asm{mov ah, [ebp][ebx+OFFSET_GOST_SBOX4]} \ _asm{ror eax, 5} \ _asm{xor esi, eax} \ \ _asm{mov eax, [ecx][bb]} \ _asm{add eax, esi} \ _asm{mov dl, al} \ _asm{mov bl, ah} \ _asm{mov al, [ebp][edx+OFFSET_GOST_SBOX1]} \ _asm{mov ah, [ebp][ebx+OFFSET_GOST_SBOX2]} \ _asm{ror eax, 16} \ _asm{mov dl, al} \ _asm{mov bl, ah} \ _asm{mov al, [ebp][edx+OFFSET_GOST_SBOX3]} \ _asm{mov ah, [ebp][ebx+OFFSET_GOST_SBOX4]} \ _asm{ror eax, 5} \ _asm{xor edi, eax} \ } VOID EncipherGOST4( IN CONST PVOID pKey, IN CONST PVOID pSBox, OUT PVOID pDst, IN CONST PVOID pSrc, IN PVOID pSynchro, IN ULONG uLength) { ULONG uCount = 0; _asm { pushad mov eax, uLength add eax, 7 and eax, ~7 mov uCount, eax mov edx, pSynchro mov esi, [edx] mov edi, [edx+4] mov ebx, pSrc mov eax, pDst mov ecx, pKey xor edx, edx up: push eax push ebx mov ebx, esi mov esi, edi mov edi, ebx xor ebx, ebx push ebp mov ebp, pSBox } MACRO_GOST4(0, 4) MACRO_GOST4(8, 12) MACRO_GOST4(16, 20) MACRO_GOST4(24, 28) MACRO_GOST4(0, 4) MACRO_GOST4(8, 12) MACRO_GOST4(16, 20) MACRO_GOST4(24, 28) MACRO_GOST4(0, 4) MACRO_GOST4(8, 12) MACRO_GOST4(16, 20) MACRO_GOST4(24, 28) MACRO_GOST4(28, 24) MACRO_GOST4(20, 16) MACRO_GOST4(12, 8) MACRO_GOST4(4, 0) _asm { pop ebp pop ebx xor esi, DWORD PTR [ebx] xor edi, DWORD PTR [ebx+4] pop eax mov [eax], esi mov [eax+4], edi add ebx, 8 add eax, 8 sub uCount, 8 jnz up popad } }
2all: а если разбить узел замены на 4 части и заюзать xlatb? Насколько это лучше по сравнению с movzx?
Не используй части регистра вместе с целым, 5 раз уже сказал, зачем ты снова свой кусок кода выставил, непонимаю ..., простой перестановкой местами двух команд ты ничего не добъешся, пенальти надо убирать! xlatb тоже юзает часть регистра, с ним гораздо хуже получается
Вопрос по теме: а какую скорость уважаемые коллеги ожидали бы увидеть (или видели) от реализации ГОСТ-28147 на 32-х разрядном MIPS, работающем на 100 мегагерцах? (Шифрование память-память, SDRAM) В килобайтах/секунду, или в чем её в этом случае мерять логичнее? (Использование кэша процессора, внутренней его памяти (CRAM) - детали реализации, но все равно интересно как они могут повлиять на конечный результат...)