32->16 (565)
От: Andrew S Россия http://alchemy-lab.com
Дата: 23.01.07 19:34
Оценка:
Всем привет.

Есть некий цикл, делающий блиттинг куска памяти, преобразовывая на ходу из 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 — вариант для него уже есть). Тут уже дело, конечно, не в производительности, а просто самому стало интересно. Чувствую, что можно еще выжать из этого, но как — Видимо, глаз замылился? Интересно будет послушать ваши соображения
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.