微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将浮点寄存器值加载到Arm和Arm64上的C变量

如何解决将浮点寄存器值加载到Arm和Arm64上的C变量

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

这正确吗?

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”,它是单精度的,可以将值加倍吗?

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。