Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Parameter in FPU laden (Assembler) (https://www.delphipraxis.net/211936-parameter-fpu-laden-assembler.html)

mwilms 24. Nov 2022 07:24

Parameter in FPU laden (Assembler)
 
Hallo!

Ich habe ein Problem mit dem Laden eines Parameters in den FPU Stack. Vielleicht weiß jemand eine Lösung.

Delphi-Quellcode:

procedure GetDouble(DB1: double); stdcall;
var
  TestDBL: double;
asm
  FLD DB1;    // wird nicht compiliert
  FLD TestDBL; // wird compiliert !
end;

procedure SendDouble;
var
  DB1: double
begin
  DB1 := 1.0;
  GetDouble(DB1);
end;
Vielen Dank für Eure Hilfe!

Klaus01 24. Nov 2022 07:37

AW: Parameter in FPU laden (Assembler)
 
.. kannst Du
Delphi-Quellcode:
procedure GetDouble(DB1: double); stdcall;
in
Delphi-Quellcode:
procedure GetDouble(const DB1: double); stdcall;
ändern, funktioniert es dann?

Grüße
Klaus

Der schöne Günther 24. Nov 2022 07:45

AW: Parameter in FPU laden (Assembler)
 
Ich habe zwar keine Ahnung was der Code tun soll, aber bei mir kompiliert er anstandslos 🤷

mwilms 24. Nov 2022 08:34

AW: Parameter in FPU laden (Assembler)
 
Danke für die Antworten.

An Klaus: Compiliert Delphi 10.4 bei Dir auch anstandslos?

Habe gerade keinen Zugriff auf mein Delphi, werde zuhause deinen Tipp ausprobieren.

Welche Projekt Einstellungen habt ihr? Irgendetwas besonderes?

(Inline Assembler in einer Pascal Procedure läßt sich bei mir auch nicht einbinden. Muß asm in Proceduren auslagern.)

Grüße

Markus

Der schöne Günther 24. Nov 2022 09:08

AW: Parameter in FPU laden (Assembler)
 
Mir fällt grade auf, dass Win32 geht, aber bei Win64 bekommt man auf deiner angekreideten Zeile tatsächlich ein

E2116 Invalid combination of opcode and operands

markus888 24. Nov 2022 09:16

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von mwilms (Beitrag 1515261)
Ich habe ein Problem mit dem Laden eines Parameters in den FPU Stack.


Welches Problem?

Meine Empfehlung:

FLD qword ptr DB1

Klaus01 24. Nov 2022 10:24

AW: Parameter in FPU laden (Assembler)
 
..hier ist auch eine Diskussion FLD mit Windows 64
https://stackoverflow.com/questions/...uction-x64-bit

Ja, Dein Code compiliert bei mir auch nur mit Windows 32.
Grüße
Klaus

markus888 24. Nov 2022 12:56

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von Klaus01 (Beitrag 1515273)
Ja, Dein Code compiliert bei mir auch nur mit Windows 32.

Aha spannend, ich nehme jetzt mal die Nachricht war an mich gerichtet.

Ausgehend von deinem Link, habe ich mir das mal angesehen.
Hab bis jetzt nur mit 32 Bit asm angewendet.

So hat es funktioniert:
Code:
procedure test(t, y:double);stdcall;
var x:double;
asm
  movq x, xmm0
  FLD qword ptr x
end;
Da müsste man sich natürlich etwas mit der Thematik beschäftigen.

himitsu 24. Nov 2022 13:01

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von Klaus01 (Beitrag 1515273)
Ja, Dein Code compiliert bei mir auch nur mit Windows 32.

Richtig, weil es dort keine FPU gibt.

OK, die FPU als EinzelChip gibt es schon ewig nicht mehr, aber als LogicEinheit war Sie in der CPU (32 Bit) dennoch integriert.
Unter 64 Bit macht das Mathematische die CPU nun selbst.

markus888 24. Nov 2022 13:31

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von himitsu (Beitrag 1515283)
Unter 64 Bit macht das Mathematische die CPU nun selbst.

Also ist das im 32 Bit Modus dann nur eine Simulation?
Grundsätzlich kann man ja Werte in die FPU laden, wie man beim Debuggen sehen kann - was bedeutet das dann?
Immerhin nutzt die FPU 80Bit und simd Register meines wissens nur 64.
Die Aussage erscheint mir daher seltsam.

Hast du zufällig einen Link zu einer Doku bezüglich 64 Bit mit FPU?

Edit:
@himitsu, ich glaube du verwechselst da was. Die Befehle die du meinst haben mit 64 Bit nichts zu tun und können im 32 Bit Modus genauso genutzt werden.

HintByError 24. Nov 2022 15:44

AW: Parameter in FPU laden (Assembler)
 
Die FPU-Instruktionen sollen im 64-Bitmodus nicht mehr verwendet werden. Die im 64-Bit-Modus vorhandene FPU ist nur für die Umstellung von FPU-Code, der in 32-Bit-Assembler geschrieben wurde, in den 64-Bit-Modus vorhanden.
Zitat:

FPU instructions
The x87* ‬FPU instructions are executed by the so-called "math coprocessor"‬.* ‬These instructions operate on floating-point,* integer,* ‬and binary-coded decimal (BCD) ‬operands.* The main purpose of these instructions are to perform floating-point arithmetic.* ‬But nowadays we have SIMD instructions that are much faster than FPU.* ‬So,* please,* don't use the FPU in newly written code,* because it usage is marked as outdated in Linux ‬64* ‬ABI.* ‬Use SIMD instead.
Quelle: https://linasm.sourceforge.net/docs/...ions/index.php

Soweit ich das vor Jahren ausgetestet habe, ist die Umsetzung der FPU-Instruktionen im 64-Bit-Modus im Detail nicht identisch mit der Umsetzung im 32-Bit-Modus. Da liegen dann die Tücken bei der Verwendung der FPU-Instruktionen im 64-Bit-Modus verborgen.

himitsu 24. Nov 2022 16:35

AW: Parameter in FPU laden (Assembler)
 
Nicht direkt "simulation" ... die FPU ist aktuell einfach nur direkt in der CPU eingebaut. (sie ist aber nur mit dem 32 Bit-System verdrahtet, bzw. es könnte auch sein, dass es sie oftmals garnicht mehr gibt und ihre Register/ControlCodes z.B. ans SSE umgeleitet werden, aber egal)

(so wie heute oftmals auch gleich die Nouthbridge, Southbridge, IO-Controller, GPU/GrafikKarte, SoundKarte, SATA-Controller, LAN-Controller, USB-Controller, Caches uvm. direkt im CPU-Chip integriert sind)



Beim Design der 64 Bit Architektur hat man aber so Einiges verändert und Fließkommazahlen werden nicht mehr über die FPU (floating point processing unit) berechnet.
Schon für 32 Bit gab es mit der Zeit immer mehrer Erweiterungen, z.B. MMX/SSE.
In 64 Bit wird nur noch mit den SSE-Registern gerechnet und die alten ST-Register der FPU gibt es nicht mehr und entsprechend haben sich auch die Befehlssätze verändert.

markus888 24. Nov 2022 16:47

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von HintByError (Beitrag 1515301)
Soweit ich das vor Jahren ausgetestet habe, ist die Umsetzung der FPU-Instruktionen im 64-Bit-Modus im Detail nicht identisch mit der Umsetzung im 32-Bit-Modus.

Hallo Wolfgang,
grundsätzlich habe ich mich mit der FPU nicht im Detail beschäftigt.
Aber meines Wissens kann man das Verhalten der FPU steuern.
Hast du dich da diesbezüglich mal vertieft?

Bei Berechnungen hast du mit der FPU jedenfalls eine massiven Vorteil was die Genauigkeit betrifft.

Interessant finde ich die Aussage mit der Geschwindigkeit.
Mal sehen was die Tests sagen.

Ich werde das aus gegebenem Anlass testen.
Mir gehts grade um die Performance bei compare für Gleitkommazahlen und da spielt die Genauigkeit nun mal keine Rolle.
Da die Befehle ja auch alle in der 32 Bit Simulation unterstützt werden, kann man die ja immer einsetzen.



Danke jedenfalls für den Hinweis.

markus888 24. Nov 2022 17:42

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von himitsu (Beitrag 1515307)
In 64 Bit wird nur noch mit den SSE-Registern gerechnet und die alten ST-Register der FPU gibt es nicht mehr und entsprechend haben sich auch die Befehlssätze verändert.

Also habs jetzt aufgrund deiner Aussage getestet.
64 Bit Anwendung, da funktioniert in der FPU alles ganz normal.
Und natürlich sind die ST Register alle vorhanden.
Vielleicht ist es ja CPU abhängig, aber mich wundern diese ganzen Aussagen schon.
Schau einfach mal bei deinem Rechner nach.

Hab Logarithmus und Multiplikation mit asm Anweisungen getestet.
Mach mal Logarithmus in Delphi und schau mal was die CPU da macht.
Das sind mehrere hundert Anweisungen mit Objekten mit x Speicherfreigaben erforderlich.
Da schaut mal blöd was da passiert.

Aber von der Hardwareentwicklung habe ich keine Ahnung.
Kann nur beurteilen was ich sehe.
LG Markus

markus888 24. Nov 2022 18:34

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von markus888 (Beitrag 1515310)
Mal sehen was die Tests sagen.

Also die SSE Anweisung ist bei meinem Testrechner beim Vergleich der Gleitkommazahl etwa 50% schneller wie die FPU. :thumb:

Das passt natürlich perfekt.

mwilms 24. Nov 2022 18:58

AW: Parameter in FPU laden (Assembler)
 
Vielen Dank für Eure Beiträge.
Scheinbar ist meine Programmierweise der FPU etwas antiquiert :(
Wäre aber mal interessant zu wissen, was die übliche FPU Programmierung in Delphi unter Windows64 verhindert.
Aus meiner Sicht wäre das doch möglich, oder?

himitsu 24. Nov 2022 20:51

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von mwilms (Beitrag 1515322)
Wäre aber mal interessant zu wissen, was die übliche FPU Programmierung in Delphi unter Windows64 verhindert.

Das
Delphi-Quellcode:
var
.

Nur für Win32 kann Delphi noch sehr viel, sogar Inline-Assembler. (alles, was vor Embarcadero mal gebaut wurde)
Ansonsten kann Delphi entweder kein Assembler, oder z.B. für Win64 ausschließlich "komplette" Assembler-Methoden. (Funktions-Header und sonst nichts außer
Delphi-Quellcode:
asm ... end;
, also lokale Variablen im Assembler -> Register bzw. manuell auf den Stack)

lokale Variablen würden zusätzlichen Code für Erstellung und Freigabe bedeuten.

mwilms 26. Nov 2022 10:57

AW: Parameter in FPU laden (Assembler)
 
Bin auch auf folgende Lösung gekommen:

Delphi-Quellcode:
procedure TestParm(A: double);
var
  B: double;
asm
  movsd B,XMM0
  FLD B
end;
Aber in der Registeransicht der FPU Register erscheint der Wert merkwürdigerweise nicht ?!

markus888 26. Nov 2022 13:52

AW: Parameter in FPU laden (Assembler)
 
Zitat:

Zitat von mwilms (Beitrag 1515425)
Aber in der Registeransicht der FPU Register erscheint der Wert merkwürdigerweise nicht ?!

Hab dir schon bei meinem Post #8 einen funktionierenden Code gepostet.
Vielleicht mal ansehen.

markus888 29. Nov 2022 15:25

AW: Parameter in FPU laden (Assembler)
 
@mwilms,
hast du jetzt geprüft, ob der Code funktioniert?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz