Могу ли я получить GCC в Inline FREXP, Scalb и т. Д.?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Могу ли я получить GCC в Inline FREXP, Scalb и т. Д.?

Сообщение Anonymous »

Я оптимизирую числовые вычисления с приближением, которые включают манипулирование поплавками с точки зрения их мантиссы и экспонента. Очевидный способ сделать это, конечно, состоит в том, чтобы использовать библиотечные функции FREXP , Scalb и т. Д.
Однако, по-видимому, хотя эти функции должны быть почти тривиальными (просто извлечение/модификация битов из поплавки), они не будут навязываются компилятором (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
при составлении с -std = c ++ 23 -mcpu = cortex-m7 -o3 -mfloat-abi = hard -fno-math-errno -ffinite-math-only -fno-trapping-math -fno-signed-chranos -fabi-version = 0 (Godbolt). Хотите использовать само по себе очень просто, кажется, что вызов функции здесь может быть нетривиальной стоимостью. С другой стороны, я не хотел бы самостоятельно писать необходимый код битов s).
Есть ли способ побудить GCC внедрить эти функции представления с плавающей запятой, может быть, некоторыми флагами компилятора и т. Д.

Подробнее здесь: https://stackoverflow.com/questions/795 ... -scalb-etc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»