【发布时间】: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
我有两个问题。
- 对于 arm64,是否可以使用“=r”,或者更好的方式?
- 对于 armv7,“=w”表示“向量浮点寄存器 s0 .. s31”,它是单精度的,是否可以将值加载为双精度?
【问题讨论】:
-
我认为这不会可靠地工作,因为编译器可能会在您的
asm获得控制权之前决定将d0寄存器用于其他用途,无论是什么都可以加载您的魔力值到该寄存器中,它需要在同一个asm块中。 -
无论哪种方式,您是否尝试过查看生成的 asm 代码?这应该很清楚这是否正在做你想做的事情。
标签: assembly gcc arm inline-assembly arm64