Float to ASM convert

05/07/2008 - 09:59 von Jens Kallup | Report spam
Hallo Hubert,

kann einer von Euch den AssemblerCode für eine "float" zahl geben?
Hier der Ausdrück:

1+2*4

Danke
Jens
 

Lesen sie die antworten

#1 Hubert Seidel
05/07/2008 - 13:05 | Warnen spam
Hallo Jens,

"Jens Kallup" schrieb im Newsbeitrag
news:486f29c7$0$25952$
Hallo Hubert,



In einer NG solltest Du eine Frage nicht an eine gezielte Person stellen...
auch nicht wenn Du anschl. in "euch" übergehst... und auch nicht wenn hier
nicht viel los ist und die Warscheinlichkeit bei 99% liegt das ich zu BASM
antworte (wenn ich kann ;-)

kann einer von Euch den AssemblerCode für eine "float" zahl geben?
Hier der Ausdrück:

1+2*4


Also "Float to ASM" finde ich mehrteutig... oder meinst Du "Float in ASM"
oder gar "Float in BASM"?
(ich dachte nur wg. news:486f2741$0$25953$ "BASM
gesucht")

Also gehe ich mal den (für mich) einfachen Weg:

Es gibt drei Konstanten a=1,b=2,c=4 und eine lokale Variable d;
Eine Funktion berechnet das Ergebnis wie folgt: Result := a+b*c;
(Bei Punkt vor Strich kommt 9 raus)
Die Funktion habe ich einfach mal CalcA genannt.
d:=CalcA; benötigte bei mir 33 CPU-Takte (PIII).
Nachdem ich mir den Code Disassembliert habe, viel mir
auf dass das Ergebnis auf dem Stack zwischen gespeichert wird.
Bei Delphi wird das Ergebnis einer Fließkommaoperation
jedoch über das erste Register der FPU übergeben (schlau).
Ich habe eine zweite Implementierung in BASM
geschrieben mit exakt den gleichen Befehlen wie
Delphi compiliert hat (ebenfalls 33 CPU-Takte, code identisch).
Zu guter letzt habe ich eine dritte Implemetierung von CalcA
ausprobiert, bei der ich die Stacknutzung (lokale Variable Ergebnis)
einfach weg gemacht habe und ebenfalls die Reihenfolge
"Füllen der FPU" und "Rechenoperationen" getauscht habe.
Achja... das wait habe ich auch raus geschmissen. Ich muss
aber zugeben das ich nicht weis (hab's bisher nie beobachtet)
ob es Nachteile geben könnte (ich sehe hier kein Sinn drin :).
Ich bin erstaunt, das ich so die Ausführungsgeschwindigkeit
fast verdoppeln konnte (33 zu 17!).
So eine Ausbeute hatte ich schon lange nicht mehr bei der Handoptimierung
:-)))
[Ich bin meist sehr zufrieden was Delphi so code-generiert :-]
Naja... und da Berechnungen mit Konstanten eher selten vorkommen
das gleiche noch mal mit Parameter in Beispiel B anschl.

Hier mein konkretes Beispiel A:

const
a:extended = 1;
b:extended = 2;
c:extended = 4;

(*
function CalcA:extended; // Delphi-Code
begin // 33 PIII-CPU-Takte mit zuweisung zur Variable
Result := a+b*c;
end;

function CalcA:extended; // 1:1 wie Delphi compiliert hat
asm // 33 PIII-CPU-Takte mit zuweisung zur Variable
add esp,-$0c
fld tbyte ptr [b]
fld tbyte ptr [c]
fmulp
fld tbyte ptr [a]
faddp
fstp tbyte ptr [esp]
wait
fld tbyte ptr [esp]
add esp, $0c
end;
*)

function CalcA:extended; // Handoptimiert, ohne wait und ohne Stack
asm // 17 PIII-CPU-Takte mit zuweisung zur Variable
fld tbyte ptr [a]
fld tbyte ptr [b]
fld tbyte ptr [c]
fmulp
faddp
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBox(0,PChar(FloatToStr(CalcA)), 'CalcA', 0);
end;

Hier mein noch mein Beispiel B:

(*
function CalcB(a,b,c:extended):extended; // Delphi-Code
begin // 78 PIII-CPU-Takte mit zuweisung zur Variable
Result := a+b*c;
end;
*)

function CalcB(a,b,c:extended):extended; // Delphi-Code
asm // 60 PIII-CPU-Takte mit zuweisung zur Variable
fld c
fld b
fmulp
fld a
faddp
end;

procedure TForm1.Button2Click(Sender: TObject);
var
a,b,c,d:extended;
begin
a:=1;
b:=2;
c:=4;
d:=CalcB(a,b,c);
MessageBox(0,PChar(FloatToStr(d)), 'CalcB', 0);
end;

mfg.
Herby

P.S:
CPU-Takte sind ca.-Angaben (mit Rdtsc gemessen)

http://www.hubert-seidel.de

Ähnliche fragen