【发布时间】:2014-01-12 21:17:25
【问题描述】:
以下函数不能用 64 位 Delphi XE2 编译器编译。 (错误均与fld指令有关。)
[dcc64 Error] Project1.dpr(12): E2116 Invalid combination of opcode and operands
[dcc64 Error] Project1.dpr(13): E2116 Invalid combination of opcode and operands
[dcc64 Error] Project1.dpr(20): E2116 Invalid combination of opcode and operands
第 12 和 13 行:
fld Y
fld X
第 20 行:
fld X
不幸的是,我没有组装技能,我正在使用需要移植到 64 位的第三方代码。你能帮我让它在 32 位和 64 位上都工作吗?
function PartArcTan(Y, X: Extended): Extended;
asm
fld Y // st(0) = Y
fld X // st(0) = X
fpatan // st(0) = ArcTan(Y, X)
fwait
end;
function ArcSin(X: Extended): Extended; // -1 <= X <= 1
asm
fld X // st(0) = X
fld st(0) // st(1) = X
fmul st(0), st(0) // st(0) = Sqr(X)
fld1 // st(0) = 1
fsubrp st(1), st(0) // st(0) = 1 - Sqr(X)
fsqrt // st(0) = Sqrt(1 - Sqr(X))
fpatan // st(0) = ArcTan(X, Sqrt(1 - X*X))
fwait
end;
【问题讨论】:
-
FLD instruction x64 bit 的可能重复项
-
更正,正如大卫在他的回答中提到的那样,
Math.ArcTan2应该是。根本不要使用 asm。 -
在 64 位 Delphi XE2 中存在使用 x87 FPU 的第三方单元。它被写入重新启用 10 字节(扩展)数据类型,用于 8 字节(双)浮点类型不够用的计算。 OTOH,它的运行速度甚至比 x86 DCC 本机 x87 还要慢 - 因为编译器外单元无法分析代码流以进行优化,并且必须在每个语句后插入
FWAIT操作码。 -
@Arioch Delphi 编译器在浮点代码生成中没有优化,并且在每条语句之后插入 FWAIT。 x87 代码在 x64 下运行缓慢还有其他原因。但是 80 位精度是在 x64 下考虑 x87 操作码的唯一原因。
标签: delphi assembly delphi-xe2 32bit-64bit fpu