19 using type = std::uint32_t;
20 static_assert(
sizeof(float) ==
sizeof(
type));
25 using type = std::uint64_t;
26 static_assert(
sizeof(double) ==
sizeof(
type));
44 return x * copysign(T{1}, signs);
48template <
class T,
class Abi>
50 std::numeric_limits<T>::is_iec559 && std::is_trivially_copyable_v<T>)
51[[gnu::always_inline]]
inline T
cneg(T x, T signs) {
54 auto r = std::bit_cast<int_type>(x) ^ std::bit_cast<int_type>(signs);
55 return std::bit_cast<T>(r);
59template <
class T,
class Abi>
62 } && std::numeric_limits<T>::is_iec559 && std::is_trivially_copyable_v<datapar::simd<T, Abi>>)
65#if !BATMAT_WITH_GSI_HPC_SIMD
71 auto r = std::bit_cast<int_simd>(x) ^ std::bit_cast<int_simd>(signs);
72 return std::bit_cast<flt_simd>(r);
#define BATMAT_ASSUME(x)
Invokes undefined behavior if the expression x does not evaluate to true.
T cneg(T x, T signs)
Conditionally negates the sign bit of x, depending on signs, which should contain only ±0 (i....
simd< Tp, deduced_abi< Tp, Np > > deduced_simd
stdx::simd< Tp, Abi > simd
typename floating_point_to_int< T >::type floating_point_to_int_t