64位Delphi编译器的浮点支持会有哪些预期表现?
64位编译器是否会使用SSE来实现浮点运算?
64位编译器是否支持当前的80位浮点类型(Extended)?
这些问题密切相关,因此我将它们作为一个问题提出。
64位Delphi编译器的浮点支持会有哪些预期表现?
64位编译器是否会使用SSE来实现浮点运算?
64位编译器是否支持当前的80位浮点类型(Extended)?
这些问题密切相关,因此我将它们作为一个问题提出。
PHis在评论中说:x87 FPU在x64上已经被弃用,通常情况下,SSE2将用于浮点数。因此,浮点数及其异常处理可能会有所不同,并且扩展可能没有80位(而是64位或更少可能是128位)。这也涉及到通常的舍入(协处理器控制工作)的更改,当与期望不同的fpu word的C代码进行接口时。
我不会说x87 FPU已经被弃用,但很明显微软已经决定尽最大努力使其成为弃用状态(并且他们似乎真的不喜欢80位FP值),尽管在Win64上使用FPU / 80位浮点数显然是技术上可行的。
我刚才回答了你的另一个问题,但是我认为它实际上应该放在这里:
显然,在产品发布之前,除了Embarcadero没有人能够确定地回答这个问题。
任何好的x64编译器都很可能将SSE2指令集作为基线,并因此尽可能使用SSE功能进行浮点运算,最小化使用x87 FPU。然而,也应该说,没有技术原因会阻止在x64应用程序代码中使用x87 FPU(尽管有关此事的谣言已经存在了一段时间;如果您想要更多信息,请查看Agner Fog的调用约定手册,特别是第6.1章“64位Windows中可以使用浮点寄存器吗?”)。
编辑1:Delphi XE2 Win64确实不支持80位浮点计算(例如,参见这里的讨论(尽管允许读/写这样的值)。可以使用记录+类操作符将这样的功能带回Delphi Win64,就像这个TExtendedX87类型中所做的那样(尽管有警告)。
在 Embarcadero 真正发布 64 位 Delphi 编译器之前,我们不会确切知道它如何实现浮点运算。在此之前的任何推测都只是猜测。但一旦我们确切知道了,要想改变已经为时已晚。
Allen Bauer 的推文似乎表明他们将使用 SSE2,并且 Extended 类型可能会从 80 位减少到 64 位。我认为这是一个坏主意,因为有很多原因。我已经在 QualityCentral 报告中写下了我的想法 Extended should remain an 80-bit type on 64-bit platforms。
如果您不希望在转换到 64 位 Delphi 后,代码从 80 位精度降至 64 位精度,请单击 QualityCentral 链接并投票支持我的报告。投票越多,Embarcadero 越可能会听取意见。如果他们确实使用 SSE2 进行 64 位浮点运算(这是有道理的),那么使用 FPU 添加 80 位浮点运算将是 Embarcadero 的额外工作。除非有很多开发人员要求,否则我怀疑他们会这样做。
对于double=extended位:
请阅读ALlen Bauer的Twitter账户Kylix_rd:
从逻辑上讲,这是合理的,因为虽然SSE2寄存器是128位,但它们被用作两个64位的双精度浮点数。
如果你真的需要它,那么你可以使用TExtendedX87 unit,作者是Philipp M. Schlüter(PhiS on SO),正如在this Embarcadero forum thread中提到的。
@PhiS:当你更新你的答案并加入我的信息时,我会删除我的答案。