10#include "rapid/numeric_array.hpp"
14constexpr uint32_t float16_bias = 15;
15constexpr uint32_t float32_bias = 127;
16constexpr uint32_t f32_to_f16_adjustment_exponent = float32_bias - float16_bias;
17constexpr uint32_t f32_to_f16_lowest_normal_exponent = 0x01 + f32_to_f16_adjustment_exponent;
18constexpr uint32_t f32_to_f16_infinite_exponent = 0x1f + f32_to_f16_adjustment_exponent;
19constexpr uint32_t f32_to_f16_adjustment = f32_to_f16_adjustment_exponent << 23;
20constexpr uint32_t f32_to_f16_lowest_normal = f32_to_f16_lowest_normal_exponent << 23;
21constexpr uint32_t f32_to_f16_infinite = f32_to_f16_infinite_exponent << 23;
24inline constinit u32x4 f32_to_f16_constants = u32x4{f32_to_f16_lowest_normal - 1, f32_to_f16_infinite, f32_to_f16_adjustment, 0};
26constexpr f32x4 f16x8_to_f32x4(i16x8 value)
noexcept
32 auto sign = (u >> 15) << 31;
38 u = u + f32_to_f16_constants.zzzz();
41 auto is_normal = bit_cast<u32x4>(gt_mask(bit_cast<i32x4>(u), bit_cast<i32x4>(f32_to_f16_constants.xxxx())));
44 u = u | bit_cast<u32x4>(sign);
49 return bit_cast<f32x4>(u);
52constexpr i16x8 f32x4_to_f16x8(f32x4 value)
noexcept
55 auto u = bit_cast<u32x4>(value);
58 auto sign = (bit_cast<i32x4>(u) >> 31) << 15;
64 auto is_normal = bit_cast<u32x4>(gt_mask(bit_cast<i32x4>(u), bit_cast<i32x4>(f32_to_f16_constants.xxxx())));
67 u =
min(u, f32_to_f16_constants.yyyy());
70 u = u - f32_to_f16_constants.zzzz();
80 u = u | bit_cast<u32x4>(sign);
83 auto tmp = bit_cast<i32x4>(u);
84 return i16x8{tmp, tmp};
93 template<
typename T, std::enable_if_t<std::is_arithmetic_v<T>,
int> = 0>
94 float16(T
const &rhs)
noexcept {
95 ttlet tmp1 =
f32x4{narrow_cast<float>(rhs)};
96 ttlet tmp2 = f32x4_to_f16x8(tmp1);
100 template<
typename T, std::enable_if_t<std::is_arithmetic_v<T>,
int> = 0>
101 float16 &operator=(T
const &rhs)
noexcept {
102 ttlet tmp1 =
f32x4{narrow_cast<float>(rhs)};
103 ttlet tmp2 = f32x4_to_f16x8(tmp1);
108 operator float ()
const noexcept {
109 ttlet tmp1 =
i16x8{
static_cast<int16_t
>(v)};
110 ttlet tmp2 = f16x8_to_f32x4(tmp1);
114 static float16 from_uint16_t(uint16_t
const rhs)
noexcept
121 [[nodiscard]]
constexpr uint16_t get()
const noexcept {
125 constexpr float16 &set(uint16_t rhs)
noexcept {
130 [[nodiscard]]
size_t hash()
const noexcept
135 [[nodiscard]]
friend bool operator==(
float16 const &lhs,
float16 const &rhs)
noexcept {
136 return lhs.v == rhs.v;
139 [[nodiscard]]
friend bool operator!=(
float16 const &lhs,
float16 const &rhs)
noexcept {
140 return lhs.v != rhs.v;
Definition float16.hpp:87
static constexpr numeric_array interleave_lo(numeric_array a, numeric_array b) noexcept
Interleave the first words in both arrays.
Definition numeric_array.hpp:416