XMM -> FPU



  • Hallo,

    bei 64bit Funktionen werden Float- bzw. Doublewerte ja standardmäßig per XMM-Register übergeben.
    Zwei Fragen:

    -Wie bekomme ich den Wert denn wieder aus diesem Register heraus, um ihn in einem "Standardregister" z.B. RAX oder in den FPU-Registern benutzen zu können?

    -Warum werden die Fließkommawerte jetzt per XMM übergeben (XMM ist doch sogar 128bit groß, das lohnt sich doch irgendwie garnicht?)? Ich kann sowieso kaum ein System hinter der x64 Calling Convention erkenne...erst RCX, RDX, dann R8, R9 und parallel dazu XMM0 bis XMM3...danach der alte Stack. Warum werden nicht direkt alle R-Register für die Parameterübergabe verwendet, dann wäre das doch einheitlich...
    Hört sich wahrscheinlich ziemlich naiv an, aber ich erkenne wirklich kein System dahinter 😕 😕 😕



  • BlubBlub schrieb:

    -Wie bekomme ich den Wert denn wieder aus diesem Register heraus, um ihn in einem "Standardregister" z.B. RAX oder in den FPU-Registern benutzen zu können?

    movss, movsd, movd, cvtsd2si, cvtss2si,... (RTFM)

    BlubBlub schrieb:

    -Warum werden die Fließkommawerte jetzt per XMM übergeben (XMM ist doch sogar 128bit groß, das lohnt sich doch irgendwie garnicht?)?

    Weil die Register da sind und SSE2 nun mal diese Datentypen (float&double) unterstützt.

    BlubBlub schrieb:

    Ich kann sowieso kaum ein System hinter der x64 Calling Convention erkenne...erst RCX, RDX, dann R8, R9 und parallel dazu XMM0 bis XMM3...danach der alte Stack.

    wie gesagt, der Datentypen wegen und weil man nicht alle GPRs zur Parameterübergabe verwende will.

    BlubBlub schrieb:

    Warum werden nicht direkt alle R-Register für die Parameterübergabe verwendet, dann wäre das doch einheitlich...

    dann gäbe es aber auch keine Nonvolatile register mehr ... das wäre eine ziemliche Verschwendung der Register.

    BlubBlub schrieb:

    Hört sich wahrscheinlich ziemlich naiv an, aber ich erkenne wirklich kein System dahinter 😕 😕 😕

    Das ist nicht naiv - Mann hätte durchaus bei sdtcall&co bleiben können. Einzig die sogenannten "leaf functions", das sind Funktion die den Stack nicht benutzen, profitieren von dieser calling convention.



  • movss, movsd, movd, cvtsd2si, cvtss2si,... (RTFM)

    Stimmt, ich wusste nur leider nicht welches Manual 😉

    Habs mit mov versucht, das hat natürlich nicht geklappt 😃
    Danke sehr.


Anmelden zum Antworten