![]() |
Einfache Funktion in asm übersetzen...
Delphi-Quellcode:
Ich bräuche asm Version dieser Funktion. Wer kann helfen ? Danke.
function VectorLength( const v:array of single ):single;
begin Result := sqrt (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); end; |
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..
|
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.
|
Re: Einfache Funktion in asm übersetzen...
Bei diser Funktion ist die Geschwiendigkeitsgewinn gering, aber sonst gibt es immer ein Geschwindigkeitsgewinn.
|
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.
|
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!) |
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; |
Re: Einfache Funktion in asm übersetzen...
... wird so nicht klappen, du hast die Additionen vergessen!
|
Re: Einfache Funktion in asm übersetzen...
Habs grad gemerkt und korrigiert :)
|
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:
Und du hast die Zuweisung an Result vergessen ;).
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; |
Re: Einfache Funktion in asm übersetzen...
FADD wird vom Compiler in ein FADDP st(1) umgesetzt ;-)
Nur eins noch:
Delphi-Quellcode:
:arrow:
fstp Result;
end;
Code:
Tja, wenn man wüsste das Delphi Float-Results auf dem FPU-Stack übergibt :zwinker:
fstp dword ptr [ebp-4]
fld dword ptr [ebp-4] |
Re: Einfache Funktion in asm übersetzen...
Zitat:
Zitat:
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 =] |
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