【问题标题】:Transcendental math functions in 64-bit Delphi compiler [closed]64位Delphi编译器中的超越数学函数[关闭]
【发布时间】:2023-03-13 06:52:01
【问题描述】:

按照我的previous question(我假设 64 位编译器仅使用 SSE 指令进行浮点计算):

  • 先验数学如何运作 (sin、atan、exp、log 等)是 在 64 位 Delphi 编译器中实现? AFAIK 没有 SSE 硬件实现。什么 软件库都用了,怎么办 性能和准确性与 当前的 FPU 硬件实现

See also

【问题讨论】:

  • 等到 64 位编译器到来
  • 对不起,我的水晶球坏了……
  • 是否会使用软件评估这些功能?这对我来说听起来很荒谬......它不可能那么坏,现在,可以吗?
  • @Vibeeshan:或者直到 Barry Kelly 看到这个问题。
  • @Andreas Rejbrand:因为这个问题只能由像 Barry Kelly 或 Allen Bauer 这样的 Embarcardero 人来回答,所以应该在 Embarcardero 论坛/新闻组上提问。现在这些问题看起来更像是重复搜索(没有冒犯)。

标签: delphi math delphi-xe2


【解决方案1】:

显然,在产品发布之前,除了 Embarcadero 之外,没有人可以肯定地回答这个问题。

很可能任何体面的 x64 编译器都会使用 SSE2 指令集作为基线,因此会尝试使用 SSE 功能进行尽可能多的浮点计算,从而最大限度地减少 x87 FPU 的使用。但是,也应该说,没有技术原因会阻止在 x64 应用程序代码中使用 x87 FPU(尽管相反的谣言已经存在了一段时间;如果您想了解更多关于这一点的信息,请看看Agner Fog's Calling Convention Manual,特别是第 6.1 章“浮点寄存器可以在 64 位 Windows 中使用吗?”)。

【讨论】:

  • Allen Bauer (Embarcadero) 在 Twitter 上表示,由于 x64 调用约定和 64 位对齐问题,Extended=Double on x64(与 .NET 中相同)delphifeeds.com/go/s/73529
  • @Jeroen - 但 ABI/调用约定中没有任何内容阻止您传递 80 位值;如果参数不适合寄存器(最大 64 位),建议通过引用传递。关于。对齐 - AFAIK 大多数在 x64 上支持 80 位浮点数的编译器将它们对齐到 16 字节边界。德尔福也可以这样做。因此,这些并不是真正阻碍 Embarcadero 实施 80 位 FP 数学的问题。
  • 如果我没记错的话,有一些共享 FPU 堆栈或寄存器,以及其他寄存器。我确信在 MMX 世界中就是这样。如果在 x64 世界中仍然如此,那将变得非常困难。除了可能支持甚至不支持这种 80 位数据类型的其他处理器架构之外。通过在第一个 64 位实现中省略它,他们设置了一个基线,但为将来引入 80 位浮点支持留下了选项。
  • @Jeroen - FPU x87 和 MMX 寄存器是共享的,真的。但是在 Win64 调用约定中不使用 MMX 寄存器,IIRC 应该清除它们的状态(EMMS 指令),即 FPU 模式,而不是 MMX 模式。 x87 和 XMM regs 之间没有寄存器共享,后者用于参数传输。此外,AFAIK 没有没有 x87 FPU 的 x64 CPU。 (英特尔甚至在 SSE3 指令集中引入了一条新的 x87 指令,所以我认为英特尔不认为 x87 已弃用。)我真的希望它们能够支持 80 位。
  • @PhiS:感谢您提供的所有信息;确保 Allen Bauer 和 Barry Kelly 也知道这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多