https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109028
Bug ID: 109028
Summary: fcmov will not be generated
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: g.peterhoff@t-online.de
Target Milestone: ---
Hello,
very rarely fcmov instructions are generated (https://godbolt.org/z/qE6f76Gda)
thx
Gero
#include <cmath>
#include <array>
#include <numbers>
static constexpr size_t Size = 1024;
using float80_t = long double;
using float64_t = double;
using float32_t = float;
template <typename Type>
inline constexpr Type foo(const Type x) noexcept
{
return (x > 42) ? std::numbers::pi_v<Type> : std::numbers::e_v<Type>;
}
template <typename Type>
inline constexpr Type bar(const Type x) noexcept
{
return std::signbit(x) ? std::numbers::pi_v<Type> : 0;
}
template <typename Type>
inline constexpr Type baz(const Type x) noexcept
{
return std::copysign(std::numbers::pi_v<Type>, x);
}
template <typename Container, typename Function>
inline constexpr void for_all(Container& cnt, Function&& f) noexcept
{
for (auto& val : cnt)
{
val = f(val);
}
}
float80_t foo80(const float80_t x) noexcept { return foo(x); }
float80_t bar80(const float80_t x) noexcept { return bar(x); }
float80_t baz80(const float80_t x) noexcept { return baz(x); }
void foos80(std::array<float80_t, Size>& cnt) noexcept { for_all(cnt,
foo<float80_t>); }
void bars80(std::array<float80_t, Size>& cnt) noexcept { for_all(cnt,
bar<float80_t>); }
void bazs80(std::array<float80_t, Size>& cnt) noexcept { for_all(cnt,
baz<float80_t>); }