divpd无法识别的操作码x64

mra*_*bat 0 delphi assembly freepascal

我已经为矩阵操作创建了一个非常好的汇编程序库,最初用于Delphi 2007+.

这段代码在Delphi下工作得很好,所以我也想支持Freepascal,直到我在一行上遇到汇编语法错误,我才走得很远:

divdp xmm1,[r9 + rax - 112];

Freepascal(实际上是Lazaraus)报告错误:无法识别的opcoded DIVP

我有点困惑,因为这是一个标准的汇编程序指令......任何人都知道如何"教"Freepascal来理解这种类型的指令?

(注意我不想介绍任何db指令......)

Ori*_*lor 10

在新系统上运行汇编代码总是很棘手.

首先,Delphi使用Intel x86汇编语法,其中寄存器名称是rax和xmm1; 而freepascal默认使用GNU/AT&T语法,其中操作数列在目标为最后一个,寄存器名称用%rax和%xmm1表示.如果您更喜欢Intel语法,可以通过在fpc命令行中添加"-Rintel"来切换默认语法,或者将asmmode intel指令添加到源代码文件的顶部:

{$ASMMODE INTEL}
Run Code Online (Sandbox Code Playgroud)

其次,divpd是SSE2指令,因此您可能需要启用SSE作为编译器的"FPU指令集".这似乎是我的fpc 2.6.2 64位安装的默认设置,但是您可能需要在fpc命令行中添加"-Cfsse3"标志.

这个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.
Run Code Online (Sandbox Code Playgroud)