Delphi-Quellcode:
function AddVecsSSE(
const av1, av2: TTestVec): TTestVec;
{$IF SizeOf(Pointer) = 4} // {$IFDEF Win32}
asm
MOVUPS XMM0, DQWORD PTR [EAX]
// MOVUPS XMM0, &av1
MOVUPS XMM1, DQWORD PTR [EDX]
// MOVUPS XMM1, &av2
ADDPS XMM0, XMM1
MOVUPS DQWORD PTR [ECX], XMM0
// MOVUPS &Result, XMM0
end;
{$ELSE}
begin
Result.x := av1.x + av2.x;
Result.y := av1.y + av2.y;
Result.z := av1.z + av2.z;
Result.w := av1.w + av2.w;
end;
{$IFEND}
Kompilieren läßt sich zwar auch Folgendes, nur funktionieren tut es nicht.
Delphi-Quellcode:
asm
MOVUPS XMM0, DQWORD PTR [EAX]
// MOVUPS XMM0, &av1
ADDPS XMM0, DQWORD PTR [EDX]
// ADDPS XMM0, &av2
MOVUPS DQWORD PTR [ECX], XMM0
// MOVUPS &Result, XMM0
end;
Schade auch, daß SSE irgenwie kein Variablen mag.
[edit]
Doch, mag es.
Delphi-Quellcode:
{$IF SizeOf(Pointer) = 4} // {$IFDEF Win32}
asm
MOVUPS XMM0, DQWORD PTR [&av1]
MOVUPS XMM1, DQWORD PTR [&av2]
ADDPS XMM0, XMM1
MOVUPS DQWORD PTR [&Result], XMM0
end;
{$ELSE}
Aber bei 32 Bit brauchte ich nie [ ], obwohl, ich bin mir grade nicht sicher, ob damals die Parameter nie ByReference übergeben wurden.