【问题标题】:Add 32-bit floats in eax/ecx registers?在 eax/ecx 寄存器中添加 32 位浮点数?
【发布时间】:2015-01-21 17:14:40
【问题描述】:

我有一对 32 位浮点数存储在 eax 和 ecx 中。我可以直接将这些加载到 FPU 中进行操作,而无需先存储到内存中吗?这将大大简化一些编译器代码,但fld 似乎只能对内存进行操作。

【问题讨论】:

  • 不,你不能。就编译器代码而言,我怀疑是否必须遍历内存会产生重大影响。你可以很容易地模拟fld r32 (push r32; fld [esp]; pop r32)。无论如何,如果可用,请考虑使用 SSE。
  • @Jester 我愿意使用 SSE,那个 push-fld-pop 示例的等效 SSE 代码是什么?
  • 您可以使用MOVD 指令直接移动到SSE 寄存器。您可以执行movd xmm0, eax; movd xmm1, ecx; addss xmm0, xmm1;,然后根据需要返回。当然,您通常可以将 xmm 寄存器用于浮点数:)
  • 太棒了,谢谢 :) 如果您将此作为答案发布,我会接受。是的,我想我可以将 xmm 寄存器用于所有内容,但我试图保持代码简单,即使它确实会生成低效的程序集。
  • @PascalCuoq 这是真的。但是eaxecx是整数寄存器,所以这个“重新解释”最终还是要做的。

标签: assembly floating-point x86 fpu x87


【解决方案1】:

不,你不能那样做。就生成代码而言,您可以通过以下序列轻松模拟fld r32,例如(针对大小进行了优化;)):

push r32
fld [esp]
pop r32

如果可用,请考虑使用 SSE,它使用 movd 指令提供直接 GPR 到 XMM 的移动。添加这两个寄存器看起来像这样:

movd xmm0, eax
movd xmm1, ecx
addss xmm0, xmm1

如果您需要 GPR 中的结果,可以使用另一个 movd 将其移回。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 2013-11-25
    • 2019-11-16
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多