【问题标题】:divpd unrecognized opcode x64divpd 无法识别的操作码 x64
【发布时间】:2014-06-27 20:39:41
【问题描述】:

我为矩阵运算创建了一个经过汇编优化的库,最初是为 Delphi 2007+ 设计的。

代码在 Delphi 下运行良好,所以我也想支持 Freepascal,但我已经走了很长一段路,直到遇到如下行的汇编器语法错误:

divdp xmm1, [r9 + rax - 112];

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

我有点困惑,因为这是一个标准的汇编指令...... 有谁知道我如何“教”Freepascal 理解这种类型的指令?

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

【问题讨论】:

  • divdp 是错字吗?您的意思是 divpd(除以压缩双精度浮点值)吗?
  • 另一件要掌握的是 fpc 是你的编译器。 Lazarus 是一个 IDE。您应该清楚您使用的 fpc 版本。

标签: delphi assembly freepascal


【解决方案1】:

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

首先,Delphi 使用 Intel x86 汇编语法,其中寄存器名称是裸露的,如 rax 和 xmm1;而 freepascal 默认使用 GNU/AT&T 语法,其中操作数在destination-last 中列出,寄存器名称被修饰为 %rax 和 %xmm1。如果您更喜欢 Intel 语法,您可以通过在 fpc 命令行中添加“-Rintel”或在源代码文件顶部添加 asmmode intel 指令来切换默认语法:

{$ASMMODE INTEL}

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

总之,这个 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.

【讨论】:

  • 感谢您的提示!我已经尝试过 ASMMODE 预编译器指令,它似乎适用于大多数代码......我还尝试在 lazarus 的 extrafpc.cfg 文件中添加 -Cfsse3 行并在项目选项中启用它。结果还是一样。我的猜测是无法识别操作码组合“xmm,内存”......对此有任何提示(或者我可以在哪里添加这个?)
  • 奇怪! divpd xmm1, [r9 + rax - 112]; 对我使用 x86_64 的 fpc 2.6.2 来说效果很好,这正是您的示例,其中 dp->pd 错字已更正。你运行的是什么版本的fpc? divpd xmm1, xmm2 会为你集合吗? divpd xmm1,[rax]等呢?
  • 我正在使用最新的 Lazarus 版本,它似乎是针对 FPC 2.6.4 构建的 - 至少根据安装目录中的 FPC 目录名......
  • 我现在安装了 lazaras 1.2.0,它与 FPC 2.6.2 链接。不幸的是,同样的错误仍然出现。我开始将问题发布到 Lazarus 论坛。非常感谢所有试图帮助我的人!
猜你喜欢
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2018-01-27
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多