2014-06-27 46 views
0

我已经为矩阵操作创建了相当优化的汇编程序库,最初是针对Delphi 2007+的。divpd无法识别的操作码x64

代码工作得很好德尔福下,所以我想支持FreePascal的还有和我很远,直到我上一条线,如遇到汇编语法错误:

divdp XMM1,[R9 + RAX - 112] ;

FreePascal的(实际上Lazaraus)报告有一个错误:无法识别 DIVP opcoded

我有点疑惑,因为这是一个标准的汇编程序指令...... 任何人都知道我怎么能“教” FreePascal的理解这种类型的指令?

(注意我不想引入任何分贝指示...)

+2

'divdp'是一个错字吗?你的意思是'divpd'(Divide Packed Double-Precision Flo-Point Values)? – Michael

+0

要掌握的另一件事是fpc是你的编译器。拉撒路是一个IDE。你应该清楚你使用的fpc版本。 –

回答

10

汇编代码始终是棘手的一个新的系统上运行。

首先,Delphi使用Intel x86汇编语法,其中寄存器名称像rax和xmm1一样裸露;而默认情况下freepascal使用GNU/AT & T语法,其中操作数列出了destination-last,并且寄存器名称的装饰类似于%rax和%xmm1。如果你喜欢英特尔的语法,可以通过添加“-Rintel”切换默认语法将FPC的命令行,或asmmode intel指令添加到您的源代码文件的顶部:

{$ASMMODE INTEL} 

其次,divpd是一个SSE2指令,所以你可能需要启用SSE作为编译器的“FPU指令集”。这似乎是我的fpc 2.6.2 64位安装中的默认设置,但是您可能需要将其他机器添加到fpc命令行中才能使用"-Cfsse3" flag

这个SSE内联汇编一起在我的freepascal编译器上使用默认标志工作。

{$ASMMODE INTEL} 
Program ssedemo; 
var 
    X: int32; 

Begin  
Writeln('Starting SSE now:'); 

asm 
    MOV EAX,40 
    CVTSI2SD XMM1,EAX 
    MOV ECX,10 
    CVTSI2SD XMM2,ECX 

    DIVSD XMM1,XMM2 

    CVTSD2SI EAX,XMM1 
    MOV X,EAX 
end; 

Writeln(X); 

End. 
+0

感谢提示!我已经尝试了ASMMODE预编译器指令,它似乎适用于大多数代码...我也尝试在lazarus的extrafpc.cfg文件中添加-Cfsse3行,并在项目选项中启用它。仍然是同样的结果。我的猜测是操作码组合“xmm,memory”不被识别......任何提示(或我可以在哪里添加这个?) – mrabat

+0

奇怪! 'divpd xmm1,[r9 + rax - 112];'对我来说使用fpc 2.6.2 for x86_64很好,这正是你纠正dp-> pd错字的例子。你正在运行什么版本的fpc? 'divpd xmm1,xmm2'为你组装吗? 'divpd xmm1,[rax]'等等怎么样? –

+0

我正在使用最新的Lazarus版本,这似乎是再次建立FPC 2.6.4 - 至少根据安装目录中的FPC目录名称.... – mrabat