18 template<
typename T, std::enable_if_t<std::is_arithmetic_v<T>,
int> = 0>
19 float16(T
const &rhs)
noexcept {
20 ttlet tmp1 = numeric_cast<float>(rhs);
21 ttlet tmp2 = _mm_set_ss(tmp1);
22 ttlet tmp3 = _mm_cvtps_ph(tmp2, _MM_FROUND_CUR_DIRECTION);
23 _mm_storeu_si16(&v, tmp3);
26 template<
typename T, std::enable_if_t<std::is_arithmetic_v<T>,
int> = 0>
27 float16 &operator=(T
const &rhs)
noexcept {
28 ttlet tmp1 = numeric_cast<float>(rhs);
29 ttlet tmp2 = _mm_set_ss(tmp1);
30 ttlet tmp3 = _mm_cvtps_ph(tmp2, _MM_FROUND_CUR_DIRECTION);
31 _mm_storeu_si16(&v, tmp3);
35 operator float ()
const noexcept {
36 ttlet tmp1 = _mm_loadu_si16(&v);
37 ttlet tmp2 = _mm_cvtph_ps(tmp1);
38 return _mm_cvtss_f32(tmp2);
41 float16(uint16_t
const &rhs,
bool) noexcept : v(rhs) {}
43 [[nodiscard]]
constexpr uint16_t get()
const noexcept {
47 constexpr float16 &set(uint16_t rhs)
noexcept {
52 [[nodiscard]]
friend bool operator==(
float16 const &lhs,
float16 const &rhs)
noexcept {
53 return lhs.v == rhs.v;
56 [[nodiscard]]
friend bool operator!=(
float16 const &lhs,
float16 const &rhs)
noexcept {
57 return lhs.v != rhs.v;