Всем привет.
Есть некий цикл, делающий блиттинг куска памяти, преобразовывая на ходу из 32 бит RGB в 16 бит, 565. При ближайшем рассмотрении оказалось, что там делается следующее (тут блок из 2-х точек):
mov al, [esi+4]
add edi, 4
shr al, 3
mov bh, [esi+5]
shl ebx, 10h
mov dl, [esi]
shr dl, 3
mov ah, [esi+6]
shl eax, 10h
mov bh, [esi+1]
shr ebx, 5
mov dh, [esi+2]
or eax, edx
add esi, 8
and eax, 0F81FF81Fh
and ebx, 7E007E0h
or eax, ebx
mov [edi], eax
Очевидно, что читать по байту из выровненой памяти — не самый, скажем так, оптимальный вариант. В связи с чем была предпринята попытка нанести непоправимую пользу:
mov eax, [esi]
mov ebx, eax
shr ah, 2
shr eax, 3
shr ebx, 8
and eax, 07FFh
and ebx, 0F800h
mov edx, [esi + 4]
or eax,ebx
mov ebx, edx
shr dh, 2
shl ebx, 8
and edx, 03FF8h
and ebx, 0F8000000h
shl edx, 13
add esi, 8
or eax, ebx
add edi, 4
or eax, edx
mov [edi], eax
В результате получили ... снижение производительности (небольшое — буквально тысячные доли процента, но тем не менее, стабильное).
Вопрос — как бы это дело поинтереснее оптимизировать (без MMX — вариант для него уже есть). Тут уже дело, конечно, не в производительности, а просто самому стало интересно. Чувствую, что можно еще выжать из этого, но как —

Видимо, глаз замылился? Интересно будет послушать ваши соображения