Ich bin wieder mal ein wenig mir assembler am probieren.
Ich habe folgenden Minicode, welcher funktioniert.
Code: Alles auswählen
program project1;
{$asmmode intel}
type
TVector4f = array[0..3] of single;
PVector4f = ^TVector4f;
procedure PrintTXM128(v: TVector4f);
begin
WriteLn('[', v[0]: 4: 2, ', ', v[1]: 4: 2, ', ', v[2]: 4: 2, ', ', v[3]: 4: 2, ']');
end;
function AddXMM(A, B: PVector4f): TVector4f assembler nostackframe register;
asm
Movdqu Xmm0, [A]
Movdqu Xmm1, [B]
Addps Xmm0, Xmm1
Movdqu [result], Xmm0
end;
function SubXMM(const A, B: TVector4f): TVector4f; assembler; register;
asm
Movdqu Xmm0, [A]
Movdqu Xmm1, [B]
Subps Xmm0, Xmm1
Movdqu [Result], Xmm0
end;
var
v1: TVector4f = (5.5, 6.6, 7.7, 8.8);
v2: TVector4f = (1.1, 2.2, 3.3, 4.4);
vo: TVector4f;
begin
vo := AddXMM(@v1, @v2);
PrintTXM128(vo);
vo := SubXMM(v1, v2);
PrintTXM128(vo);
end.
Dazu habe ich 2 Fragen. Wieso gibt es keine Fehler, obwohl ich die ";" bei ADDXMM vergessen habe. Am Editor selbst sieht es fast so aus, als ob der dies als Fehler interpretiert, assembler in nicht fett geschrieben.
Und wieso bekomme ich bei AddXMM diese Warnung ?
Ich dachte immer intern ist var oder eine Pointerübergabe das selbe. Das sieht man gut, wen man eine clib extern anbindet.
Code: Alles auswählen
project1.lpr(16,28) Warning: Check size of memory operand "[movdqu mem,xmmreg0]: memory-operand-size is 64 bits, but expected [128 bits]"
project1.lpr(17,28) Warning: Check size of memory operand "[movdqu mem,xmmreg1]: memory-operand-size is 64 bits, but expected [128 bits]"
Und so nebenbei, was bedeuten diese beiden Schlüsselwöörter "nostackframe; register;" ?
Gibt es irgendwo ein Tutorial mit Assembler und Lazarus ?