Здравствуйте, Andrew S, Вы писали:
AS>Есть некий цикл, делающий блиттинг куска памяти, преобразовывая на ходу из 32 бит RGB в 16 бит, 565. При ближайшем рассмотрении оказалось, что там делается следующее (тут блок из 2-х точек):
AS>[/asm]
AS>Очевидно, что читать по байту из выровненой памяти — не самый, скажем так, оптимальный вариант. В связи с чем была предпринята попытка нанести непоправимую пользу:
AS>AS> mov eax, [esi]
AS> mov ebx, eax
AS> shr ah, 2
AS> shr eax, 3
AS> shr ebx, 8
AS> and eax, 07FFh
AS> and ebx, 0F800h
AS> mov edx, [esi + 4]
AS> or eax,ebx
AS> mov ebx, edx
AS> shr dh, 2
AS> shl ebx, 8
AS> and edx, 03FF8h
AS> and ebx, 0F8000000h
AS> shl edx, 13
AS> add esi, 8
AS> or eax, ebx
AS> add edi, 4
AS> or eax, edx
AS> mov [edi], eax
AS>
не вникая в сущность я бы сделал так
lodsd
mov ebx, eax
shr ah, 2
shr eax, 3
shr ebx, 8
and eax, 07FFh
and ebx, 0F800h
mov edx, [esi]
or eax,ebx
shr dh, 2
mov ebx, edx
shl ebx, 8
and edx, 03FF8h
and ebx, 0F8000000h
shl edx, 13
or eax, ebx
add esi, 4
or eax, edx
stosd ; тут мы пишем не в EDI+4 а в EDI, надо EDI перед циклом увеличить на 4
ну и cld вне цикла и коррекция EDI.
нет никакой гарантии, что lods/stosd выполняются быстрей чем mov eax, [esi]; add esi, 4
а так лучше VTUNE посмотреть