对于包含双浮点指令的 STM32F7,我想uint64_t
将double
.
为了测试这一点,我使用了以下代码:
volatile static uint64_t m_testU64 = 45uLL * 0xFFFFFFFFuLL;
volatile static double m_testD;
#ifndef DO_NOT_USE_UL2D
m_testD = (double)m_testU64;
#else
double t = (double)(uint32_t)(m_testU64 >> 32u);
t *= 4294967296.0;
t += (double)(uint32_t)(m_testU64 & 0xFFFFFFFFu);
m_testD = t;
#endif
默认情况下(如果DO_NOT_USE_UL2D
未定义)编译器(gcc 或 clang)正在调用函数:__aeabi_ul2d()
这在执行指令的数量上有点复杂。在此处查看汇编代码:https ://github.com/gcc-mirror/gcc/blob/master/libgcc/config/arm/ieee754-df.S#L537
对于我的特定示例,它需要 20 条指令而无需进入大多数分支
如果 DO_NOT_USE_UL2D
定义了,编译器会生成以下汇编代码:
movw r0, #1728 ; 0x6c0
vldr d2, [pc, #112] ; 0x303fa0
movt r0, #8192 ; 0x2000
vldr s0, [r0, #4]
ldr r1, [r0, #0]
vcvt.f64.u32 d0, s0
vldr s2, [r0]
vcvt.f64.u32 d1, s2
ldr r1, [r0, #4]
vfma.f64 d1, d0, d2
vstr d1, [r0, #8]
代码比较简单,只有10条指令。
所以这里的问题(如果DO_NOT_USE_UL2D
已定义):
- 我的代码(在 C 中)是否正确?
- 我的代码比
__aeabi_ul2d()
函数慢吗(不是很重要,但有点好奇)?
我必须这样做,因为我不允许使用 libgcc 中的函数(有很好的理由......)
请注意,这个问题的主要目的不是关于性能,我真的很好奇 libgcc 中的实现,我真的很想知道我的代码是否有问题。