Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Einfache Funktion in asm übersetzen... (https://www.delphipraxis.net/54501-einfache-funktion-asm-uebersetzen.html)

sniper_w 5. Okt 2005 15:34


Einfache Funktion in asm übersetzen...
 
Delphi-Quellcode:
function VectorLength( const v:array of single ):single;
begin
  Result := sqrt (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
end;
Ich bräuche asm Version dieser Funktion. Wer kann helfen ? Danke.

BenjaminH 5. Okt 2005 15:36

Re: Einfache Funktion in asm übersetzen...
 
Setze da doch einfach einen Haltepunkt hin und schau dir zur Laufzeit da die CPU ansicht an, da steht der asm Code, glaube ich..

tigerman33 5. Okt 2005 16:28

Re: Einfache Funktion in asm übersetzen...
 
Bist du sicher, dass du wirklich asm brauchst? Wenn's dir nur um die Geschwindigkeit geht, wirst du da gegenüber einem modernen Compiler wie Delphi nicht mehr viel rausholen können.

sniper_w 5. Okt 2005 16:36

Re: Einfache Funktion in asm übersetzen...
 
Bei diser Funktion ist die Geschwiendigkeitsgewinn gering, aber sonst gibt es immer ein Geschwindigkeitsgewinn.

tigerman33 5. Okt 2005 16:39

Re: Einfache Funktion in asm übersetzen...
 
Das wollte ich ja auch gar nicht anzweifeln. Bloß ist mittlerweile der von Compilern erzeugte Code schon so weit optimiert, dass im Allgemeinen (also nicht nur bei diesem Beispiel) nur noch geringe Geschwindigkeitsvorteile erzielt werden können. Da muss man dann halt wissen, ob einem das noch den Aufwand wert ist.

ripper8472 5. Okt 2005 16:45

Re: Einfache Funktion in asm übersetzen...
 
guck dir im debugger erstmal an, was der compiler aus der funktion macht.
das kannst du ja hier mal posten.
eventuell ist das auch schon die optimierteste variante.
(kein debug=build, auf release-build stellen!)

Dax 5. Okt 2005 17:20

Re: Einfache Funktion in asm übersetzen...
 
Ich versuch mal mein Glück, muss aber auf keinen Fall stimmen. Das letzte mal, das ich FP-Routinen in Assembler geschrieben hab ist schon ne Weile her ;)

Delphi-Quellcode:
function VectorLength(const v:array of single ):single;
asm
  fld dword ptr [eax]
  fmul st(0), st(0)
  fld dword ptr [eax+4]
  fmul st(0), st(0)
  fld dword ptr [eax+8]
  fmul st(0), st(0)
  fadd
  fadd
  fsqrt
end;

Flocke 5. Okt 2005 17:21

Re: Einfache Funktion in asm übersetzen...
 
... wird so nicht klappen, du hast die Additionen vergessen!

Dax 5. Okt 2005 17:22

Re: Einfache Funktion in asm übersetzen...
 
Habs grad gemerkt und korrigiert :)

dizzy 5. Okt 2005 22:46

Re: Einfache Funktion in asm übersetzen...
 
Ich würde "faddp" benutzen, dann bleibt aufm FPU-Stack nachher nix über. Ich weiss nicht ob das schlimm wäre, aber folgende Variante verrichtet bei mir oft und gut ihre Arbeit:
Delphi-Quellcode:
function VectorLength(const v:array of single ):single;
asm
  fld dword ptr [eax]
  fmul st(0), st(0)
  fld dword ptr [eax+4]
  fmul st(0), st(0)
  fld dword ptr [eax+8]
  fmul st(0), st(0)
  faddp
  faddp
  fsqrt
  fstp result;
end;
Und du hast die Zuweisung an Result vergessen ;).

Dax 5. Okt 2005 22:58

Re: Einfache Funktion in asm übersetzen...
 
FADD wird vom Compiler in ein FADDP st(1) umgesetzt ;-)

Nur eins noch:

Delphi-Quellcode:
  fstp Result;
end;
:arrow:
Code:
fstp dword ptr [ebp-4]
fld dword ptr [ebp-4]
Tja, wenn man wüsste das Delphi Float-Results auf dem FPU-Stack übergibt :zwinker:

dizzy 5. Okt 2005 23:05

Re: Einfache Funktion in asm übersetzen...
 
Zitat:

Zitat von Dax
FADD wird vom Compiler in ein FADDP st(1) umgesetzt ;-)

Dann kann man's auch gleich so schreiben :zwinker:

Zitat:

Zitat von Dax
Tja, wenn man wüsste das Delphi Float-Results auf dem FPU-Stack übergibt :zwinker:

:shock: Wieder was gelernt! Das heisst dass der aktuelle "Top of Stack" gleichzeitig mein result ist? Yeeha, dann kann ich meine Vektor- und Quaternionen Units ja noch weiter optimieren :D
Hatte schon fast befürchtet, dass Delphi den Float in den Speicher semmelt und in EAX nen Pointer drauf übergibt... jaja, ich sollte mal öfter das CPU-Fenster auf machen =]

himitsu 6. Okt 2005 00:14

Re: Einfache Funktion in asm übersetzen...
 
Von wo und wohin die Parameter(darunter auch Result) übergeben/übernommen werden steht allerdings auch in der OH.

Also ob und wann was verwendet wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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