Re: 32->16 (565)
От: Сергей Мухин Россия  
Дата: 24.01.07 06:10
Оценка:
Здравствуйте, 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 посмотреть
---
С уважением,
Сергей Мухин
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.