[Bug c++/109029] New: std::signbit(double) generiert sehr ineffizienten code
g.peterhoff@t-online.de
gcc-bugzilla@gcc.gnu.org
Sun Mar 5 12:08:25 GMT 2023
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109029
Bug ID: 109029
Summary: std::signbit(double) generiert sehr ineffizienten code
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: g.peterhoff@t-online.de
Target Milestone: ---
Hallo,
std::signbit(double) generiert sehr ineffizienten code und kann somit nicht
vektorisiert werden (https://godbolt.org/z/se6Ea8bo9).
thx
Gero
-std=c++20 -march=x86-64-v3 -O3 -mno-vzeroupper
#include <cmath>
#include <array>
#include <numbers>
#include <algorithm>
static constexpr size_t Size = 1024;
using float80_t = long double;
using float64_t = double;
using float32_t = float;
template <typename Type>
inline constexpr bool foo(const Type x) noexcept
{
return std::signbit(x);
}
template <typename Type>
inline constexpr Type bar(const Type x) noexcept
{
return std::signbit(x) ? std::numbers::pi_v<Type> : 0;
}
template <typename Container, typename Function>
inline constexpr void for_all(Container& cnt, Function&& f) noexcept
{
std::transform(cnt.begin(), cnt.end(), cnt.begin(), f);
}
template <typename ContainerRes, typename ContainerArg, typename Function>
inline constexpr void for_all(ContainerRes& res, const ContainerArg& arg,
Function&& f) noexcept
{
std::transform(arg.begin(), arg.end(), res.begin(), f);
}
float64_t foo64(const float64_t x) noexcept { return foo(x); }
float32_t foo32(const float32_t x) noexcept { return foo(x); }
float64_t bar64(const float64_t x) noexcept { return bar(x); }
float32_t bar32(const float32_t x) noexcept { return bar(x); }
void foos64(std::array<bool, Size>& res, const std::array<float64_t, Size>&
arg) noexcept { for_all(res, arg, foo<float64_t>); }
void foos32(std::array<bool, Size>& res, const std::array<float32_t, Size>&
arg) noexcept { for_all(res, arg, foo<float32_t>); }
void bars64(std::array<float64_t, Size>& cnt) noexcept { for_all(cnt,
bar<float64_t>); }
void bars32(std::array<float32_t, Size>& cnt) noexcept { for_all(cnt,
bar<float32_t>); }
More information about the Gcc-bugs
mailing list