Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#30

AW: Floyd-Steinberg Dithering

  Alt 7. Nov 2023, 19:08
In den Kommentaren verweist Peter Cordes auf einen Trick, der ermöglicht, direkt in eax zu laden und benötigt nicht das wiederholte nullen.

Ich war auch mal so frei, die non-volatilen Register korrekt zu sichern:

Code:
procedure TestCMov_Better;
asm
        push  esi
        push  edi

        xor   edx, edx
        mov   esi, 255          // High Limit
        mov   ecx, Count

@1:    mov   edi, 0

@2:    mov   eax, dword[Data + edi * 4]
        cmp   eax, esi   // compare v (eax) with high value
        cmovae eax, edx   // if negative (unsigned check) or 255 we fill 0 (edx)
        cmovge eax, esi   // if greater (signed check) or 255 we fill 255 (esi)
        mov   Byte[CData + edi], al
        inc   edi
        cmp   edi, DATA_LEN
        jl    @2
        dec   ecx
        jne   @1

        pop edi
        pop esi
end;
Wenn nicht genügend Register zur Verfügung sind, können wir auch das hier (nur die Stelle mit dem Vergleich) machen - ist ein kleines bisschen langsamer aber immernoch schneller als alles andere:

Code:
        xor   edx, edx
        cmp   eax, 255    // compare v (eax) with high value
        cmovae eax, edx   // if negative or 255 we fill 0 (edx)
        mov   edx, 255
        cmovge eax, edx   // if greater or 255 we fill 255 (edx)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 7. Nov 2023 um 19:21 Uhr)
  Mit Zitat antworten Zitat