FPC编译CVTSD2SS指令失败,Delphi可用汇编代码如何适配FPC
问题根因
FPC 内置汇编器对 SSE 指令的内存操作数尺寸推断逻辑与 Delphi 汇编器存在差异:CVTSD2SS 指令的源操作数要求为 64 位双精度浮点内存单元,但 FPC 默认将无尺寸标注的 [RAX] 推断为 128 位内存单元,与指令要求的操作数规格不匹配,因此触发操作数组合无效报错。
修改后可正常编译的代码
兼容原有写法的版本
procedure LoadSingle(P: Pointer); assembler; asm MOV RAX, P CVTSD2SS XMM0, qword [RAX] end;
仅需将 Delphi 语法中的 QWORD PTR 替换为 FPC 汇编器识别的 qword 尺寸标注即可解决编译错误。
优化版(Windows x64 平台适用)
基于 Windows x64 调用约定,第一个指针参数默认通过 RCX 寄存器传递,可省略不必要的寄存器拷贝操作,代码更精简高效:
procedure LoadSingle(P: Pointer); assembler; asm CVTSD2SS XMM0, qword [RCX] end;
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

