![]() |
AW: Floyd-Steinberg Dithering
Zitat:
Danke, Stevie Zwei Fragen hätte ich: 1) Was ist "Data"? Bei mir kommt der Wert, der ggfs. auf 0 oder 255 zu ändern ist, aus EDX (ist -255..255) und der (ggfs. geänderte Wert wird in [esp] gespeichert. 2) zu "Ich war auch mal so frei, die non-volatilen Register korrekt zu sichern:" Ich mache
Delphi-Quellcode:
Du machst
push edi
push esi ... ... pop esi pop edi
Delphi-Quellcode:
Was ist daran korrekter?
push esi
push edi ... ... pop edi pop esi |
AW: Floyd-Steinberg Dithering
@Stevie, nice !
I was going to more generic reusable one like this:
Code:
But it is little slower than xor , and for sure slower then using cmovae and cmovge.
{$ALIGN 16}
procedure TestCMovShort; const LOWER_LIMIT = 0; HIGHER_LIMIT = 255; asm mov esi, HIGHER_LIMIT // High Limit mov ecx, Count db $48, $48 @1: mov edi, 0 db $48, $48, $48 @2: mov edx, dword[Data + edi * 4] mov eax, LOWER_LIMIT //XOR eax, eax // eax is destination value filled with the lowest value cmp edx, esi // comapare v (edx) with high value cmovg eax, esi // if bigger then take the highest esi cmovbe eax, edx // if below or equal we fill value v (edx) mov Byte[CData + edi], al inc edi cmp edi, DATA_LEN jl @2 dec ecx jne @1 end; |
AW: Floyd-Steinberg Dithering
And of course i forgot about pop and push :oops:
|
AW: Floyd-Steinberg Dithering
Zitat:
Code:
Data is filled with arbitrary values bigger than 255 and lower than 0.
const
Count = 1000000; DATA_LEN = 1024; var Data: array[0..DATA_LEN - 1] of Integer; CData: array[0..DATA_LEN - 1] of Byte; .... begin Randomize; for i := Low(Data) to High(Data) do Data[i] := Random(256 * 3) - 256; Zitat:
|
AW: Floyd-Steinberg Dithering
Zitat:
Zitat:
|
AW: Floyd-Steinberg Dithering
Zitat:
|
AW: Floyd-Steinberg Dithering
Zitat:
|
AW: Floyd-Steinberg Dithering
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Da sind die Hersteller meiner CPU anderer Meinung. Zitat aus Kapitel 2-12 in "IA-32 Intel® Architecture Optimization Reference Manual" (Siehe Anhang) Zitat:
Mir ist bewusst, dass bei heutigen Prozessoren (auch bei meinem schon etwas älteren I7 2600K) ein dec/inc und sub 1/add 1 gleich schnell abgearbeitet werden, bei früheren Prozessoren war sub/add (mit #-Werten) deutlich schneller als dec/inc. Ich benutze trotzdem i.d.R. sub/add weil hier, anders als bei dec/inc, auch das CF Flag gesetzt wird. Zu "Der Benchmark ist Blödsinn, denn in TestMov wird der erste jle immer genommen" Nein. Der jle @Z wird nur dann genommen, wenn eax <= 0 ist. Bei @1 wird edx = -255 gesetzt. Bei @2 wird edx in eax kopiert und dann eax mit 0 verglichen und gejumpt, wenn eax <= 0 ist. Bei @N wird edx um 1 erhöht und zu @2 gejumpt, solange edx <= 255 ist. Bei @2 kann edx und dann eax also Werte im Bereich -255 bis 255 haben. Merke: Worte wie "Blödsinn" oder"Quatsch" sollte man vermeiden,
Delphi-Quellcode:
Das mov edi,0 und mov esi,255 ist übrigens überflüssig (resultierte aus copy/paste).
PROCEDURE TestMov;
const S:String=' '; asm push 0 mov edi,0 mov esi,255 mov ecx,Count @1: mov edx,-255 @2: mov eax,edx cmp eax,0 jle @Z cmp eax,255 jbe @S mov byte[esp],255 jmp @N @Z: xor eax,eax @S: mov [esp],al @N: add edx,1 cmp edx,255 jbe @2 sub ecx,1 jne @1 @End: pop ecx end; |
AW: Floyd-Steinberg Dithering
Zitat:
Dass speziell das mit dem dec/inc vs add/sub dort noch zutreffend war, mag ich nicht in Abrede stellen. Mehr zu der Thematik guckst du hier: ![]() Aber mein Fehler, ich geh in aller Regel davon aus, dass wenn man asm redet, sich zumindest innerhalb derselben Dekade bewegt und nicht im Jahr des Releases von Windows Vista :mrgreen: Und die Aussage zu dem jle war selbstverständlich auch auf die Benchmark von Kas bezogen, die dort nämlich immer den jump genommen hat, damit beweist man nämlich gar nix, außer dass der Branchpredictor gut funktioniert (vermutlich auch 2006 schon) ;) |
AW: Floyd-Steinberg Dithering
Zitat:
Wie wäre es, wenn Du bei einer Antwort (wenn Du nicht den Beitrag zitierst), angibst, auf welchen Beitrag Du Dich beziehst? Zum Beispiel ein "Zu #25:" würde helfen, Missverständnisse zu vermeiden. Ist nur eine Anregung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz