hier der Auszug aus der PB_HIlfe
- Auf x86-Prozessoren sind die zur Verfügung stehenden flüchtigen Register: eax, edx und ecx, xmm0, xmm1, xmm2 und xmm3.
- Auf x64-Prozessoren sind die zur Verfügung stehenden flüchtigen Register: rax, rcx, rdx, r8, r9, xmm0, xmm1, xmm2 und xmm3.
Alle anderen müssen immer reserviert bleiben.
ich hab für den ASM.Code zur Vektor Matrix Multiplikation mit SSE-Beschleunigung jedoch mehr Register
verwendet Xmm0..XMM7. Das könnte unter Umständen Schwierigkeiten geben.
hier der code! Fragen dazu im Anschluß
Code: Alles auswählen
Procedure.i Vector_X_Matrix(*OUT.TVector, *IN.TVector, *Matrix.TMatrix)
; translated from the FreePascal Wiki at https://wiki.freepascal.org/SSE/de
!MOV rax, [p.p_Matrix]
!Movups Xmm4, [rax + $00]
!Movups Xmm5, [rax + $10]
!Movups Xmm6, [rax + $20]
!Movups Xmm7, [rax + $30]
!Mov rax, [p.p_IN]
!Movups Xmm2, [rax]
; Line 0
!Pshufd Xmm0, Xmm2, 00000000b
!Mulps Xmm0, Xmm4
; Line 1
!Pshufd Xmm1, Xmm2, 01010101b
!Mulps Xmm1, Xmm5
!Addps Xmm0, Xmm1
; Line 2
!Pshufd Xmm1, Xmm2, 10101010b
!Mulps Xmm1, Xmm6
!Addps Xmm0, Xmm1
; Line 3
!Pshufd Xmm1, Xmm2, 11111111b
!Mulps Xmm1, Xmm7
!Addps Xmm0, Xmm1
; Return Result
!Mov rax, [p.p_OUT]
!Movups [rax], Xmm0
Return
EndProcedure
1. Ich würde mal vermuten, dass wenn ich die nicht erlaubten Register in einer Procedure
verwende, die sonst keinen PB-Code ausführt, ist die Gefahr gering, dass ich wichtige Werte überschreibe.
Das reicht mir aber nicht, um das so zu machen.
2. Evtl. könnte man für die XMM4..7 entsprechende !PUSH und !POP Befehle einfügen.
Bin mir jedoch nicht sicher, ob dann der Stack für PB korrect bleibt. Theoretisch müsste er das.
3. Wie kommt man an den Assembler Out-Put???
Ich hab es mit Anleitung und dem Beispiel für Documented ASM-Output versucht.
Bei mir geht das alles nicht.
Mir würde schon der undokummentierte Output reichen. Also einfach die Datei wo das PB hinschreibt.
Ich hab sie leider nicht gefunden!