Ben aşağıdaki çalıştırmak çalışıyordum,Delphi XE3'te align-data-move SSE nasıl kullanılır?
type
Vector = array [1..4] of Single;
{$CODEALIGN 16}
function add4(const a, b: Vector): Vector; register; assembler;
asm
movaps xmm0, [a]
movaps xmm1, [b]
addps xmm0, xmm1
movaps [@result], xmm0
end;
Hafıza yeri 16-align olduğu gibi bildiğim kadarıyla, movaps güvenilebilir, movaps üzerinde erişim ihlali verir. movup (hizalama gerekmez) olursa sorun olmaz.
Bu yüzden sorum, Delphi XE3'te, {$ CODEALIGN} bu durumda çalışmıyor gibi görünüyor.
DÜZENLEME
Çok garip ... Ben şu çalıştı.
program Project3;
{$APPTYPE CONSOLE}
uses
windows; // if not using windows, no errors at all
type
Vector = array [1..4] of Single;
function add4(const a, b: Vector): Vector;
asm
movaps xmm0, [a]
movaps xmm1, [b]
addps xmm0, xmm1
movaps [@result], xmm0
end;
procedure test();
var
v1, v2: vector;
begin
v1[1] := 1;
v2[1] := 1;
v1 := add4(v1,v2); // this works
end;
var
a, b, c: Vector;
begin
{$ifndef cpux64}
{$MESSAGE FATAL 'this example is for x64 target only'}
{$else}
test();
c := add4(a, b); // throw out AV here
{$endif}
end.
Eğer 'windows kullan' eklenmezse, her şey yolunda. Eğer 'window' (pencere kullan) 'ise, c: = add4 (a, b) istisnası atıyor ancak testinde().
Bunu kim açıklayabilir?
DÜZENLEME hepsi şimdi bana mantıklı. Delphi XE3 için sonuçlar - 64 bit X64 de
- yığın çerçeveler (gereken şekilde) 16-bayt, {$ CODEALIGN 16} 16 bayta proc/eğlence için kod hizalar ayarlanır vardır.
- dinamik dizi v1 önce tam sayı Var bildirmek durumunda
- Ancak yığın değişkenler , örneğin, her zaman 16-bayt hizalı değildir SetMinimumBlockAlignment (mba16byte) kullanılarak 16 hizalamak için ayarlanabilir yığın yaşamaktadır Yukarıdaki örnekte v2, örn. test(), örnek çalışmayacak.
'CODEALIGN', _code_ öğelerini hizalar. Eğer _data_ 'ı hizalamak isterseniz,' ALIGN' direktifini kullanabilirsiniz. – Michael
Aynı zamanda {ALIGN 16} denedim ve işe yaramıyor. –