【问题标题】:Load float register value to C variable on Arm and Arm64将浮点寄存器值加载到 Arm 和 Arm64 上的 C 变量
【发布时间】:2021-01-27 08:40:00
【问题描述】:

双精度浮点值在 arm 和 arm64 上都保存在 d0 中。如何将它加载到 C 双变量?

这是正确的吗?

double ret = 0.f;
#if defined(TARGET_ARCH_ARM64)
    __asm__ volatile ("fmov %0, d0" : "=r"(ret));
#elif defined(TARGET_ARCH_ARM)
    __asm__ volatile ("vmov %0, d0" : "=w"(ret));
#endif

我有两个问题。

  1. 对于 arm64,是否可以使用“=r”,或者更好的方式?
  2. 对于 armv7,“=w”表示“向量浮点寄存器 s0 .. s31”,它是单精度的,是否可以将值加载为双精度?

【问题讨论】:

  • 我认为这不会可靠地工作,因为编译器可能会在您的 asm 获得控制权之前决定将 d0 寄存器用于其他用途,无论是什么都可以加载您的魔力值到该寄存器中,它需要在同一个asm 块中。
  • 无论哪种方式,您是否尝试过查看生成的 asm 代码?这应该很清楚这是否正在做你想做的事情。

标签: assembly gcc arm inline-assembly arm64


【解决方案1】:

我已经测试过,程序集本身可以将值从寄存器传输到堆栈或内存中的变量。

正如 Nate Eldredge 所说,还必须考虑编译器对寄存器的使用,否则结果不是我们预期的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多