Однако, по-видимому, хотя эти функции должны быть почти тривиальными (просто извлечение/модификация битов из поплавки), они не будут навязываются компилятором (ARM GCC 13.2.0, или навсегда). В качестве примера (бессмысленная, но такая же структура, что и мой фактический случай использования) < /p>
Код: Выделить всё
#include
#include
float expo(float x)
{
if (std::fpclassify(x) != FP_NORMAL)
{
// Remove nan's, inf's, subnormals etc from consideration
std::unreachable();
}
int exp;
float m = frexpf(x, &exp);
return (1 + m) * exp;
}
< /code>
производит < /p>
expo(float):
push {lr}
sub sp, sp, #12
add r0, sp, #4
bl frexpf // function call
vmov.f32 s14, #1.0e+0
vldr.32 s15, [sp, #4] @ int
vadd.f32 s0, s0, s14
vcvt.f32.s32 s15, s15
vmul.f32 s0, s15, s0
add sp, sp, #12
ldr pc, [sp], #4
Код: Выделить всё
memcpyЕсть ли способ побудить GCC внедрить эти функции представления с плавающей запятой, может быть, некоторыми флагами компилятора и т. Д.
Подробнее здесь: https://stackoverflow.com/questions/795 ... -scalb-etc
Мобильная версия