Bin jetzt grad dabei die SSE-Beschleunigung in meine Vektor-
Unit einzubauen...
allerdings steh ich grad vor nem Problem: Ich möchte die Länge eines Vektors bestimmen...
Die einzelnen Werte zu quadrieren ist ja kein Problem, allerdings scheiter ich grad dabei
eine Alternative zum C++ Intrinsic _mm_hadd_ps zu finden...Dieser Intrinsic addiert alle 4 Werte
in einem MMX Register und speichert das Ergebnis im Ersten Wert des Ergebnis-Registers...
Man könnte natürlich - angenommen man hat die quadrierten Werte in MMX0 - in MMX1 die Werte mit SHUFPS um 1 verschoben speichern (x = MMX0.y, y = MMX.z etc), in MMX2 dann um 2 verschoben und in MMX3 um3 verschoben,
diese 4 Register dann addieren, und man hätte das Ergebnis...Doch die Performance davon ist definitiv
nicht besser als der Native Quelltext
Hat da jeman deine Idee?
Delphi-Quellcode:
//Deklaration des Vectors
TVec4 =
record
x, y, z, w: Single;
end;
//GetLength prozedur
function GetLength(vector4: TVec4): Single;
asm
MOVUPS XMM0, DWORD PTR [&vector4]
MULPS XMM0, XMM0
MOVUPS DQWORD PTR [&Result], XMM0
//Hier müssten jetzt die Werte aus XMM0 alle aufaddiert und wieder in MMX0 gespeichert werden
SQRTSS XMM0, XMM1
MOVSS XMM0, Result
end;