如何在Delphi XE3中使用align-data-move SSE?
我试图运行以下,
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; 它提供了对movaps的访问冲突,据我所知,如果内存位置为16对齐,则可以信任movaps.如果是movups(不需要对齐),它没有问题. 所以我的问题是,在Delphi XE3中,{$CODEALIGN}在这种情况下似乎不起作用. 编辑 很奇怪……我尝试了以下几点. 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,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. 如果没有添加“使用窗口”,一切都很好. 谁能解释一下? 编辑 > X64的堆栈帧设置为16字节(根据需要),{$CODEALIGN 16}将proc / fun的代码与16字节对齐. 解决方法
您需要将数据对齐16字节.这需要一些关心和关注.您可以确保堆分配器对齐到16个字节.但是您无法确保编译器将16字节对齐堆栈分配的变量,因为您的数组的对齐属性为4,即元素的大小.在其他结构中声明的任何变量也将具有4字节对齐.这是一个很难解决的障碍.
我不认为您可以在当前可用的编译器版本中解决您的问题.至少除非你放弃堆叠分配的变量,我猜这些变量太难以吞下.你可能会对外部汇编程序有一些好运. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |