22// SPDX-FileCopyrightText: Copyright the Vortex contributors
33#pragma once
44
5+ #include < bit>
56#include < cstdint>
67#include < span>
78#include < string_view>
1314namespace vortex {
1415struct float16_t {
1516 uint16_t bits;
16- friend bool operator ==(float16_t , float16_t ) = default ;
17+ constexpr friend bool operator ==(float16_t , float16_t ) = default ;
1718 // NOLINTNEXTLINE
18- operator float () const ;
19+ constexpr operator float () const {
20+ float result;
21+ const uint32_t sign = (bits >> 15 ) & 1 ;
22+ const uint32_t exponent = (bits >> 10 ) & 0x1F ;
23+ const uint32_t mantissa = bits & 0x3FF ;
24+
25+ uint32_t out;
26+ if (exponent == 0x1F ) {
27+ out = (sign << 31 ) | 0x7F800000 | (mantissa << 13 );
28+ } else if (exponent == 0 ) {
29+ if (mantissa == 0 ) {
30+ out = sign << 31 ;
31+ } else {
32+ uint32_t m = mantissa;
33+ int e = -1 ;
34+ do {
35+ m <<= 1 ;
36+ ++e;
37+ } while ((m & 0x400 ) == 0 );
38+ out = (sign << 31 ) | ((127 - 15 - e) << 23 ) | ((m & 0x3FF ) << 13 );
39+ }
40+ } else {
41+ out = (sign << 31 ) | ((exponent - 15 + 127 ) << 23 ) | (mantissa << 13 );
42+ }
43+ return std::bit_cast<float >(out);
44+ }
1945};
2046static_assert (sizeof (float16_t ) == 2 && std::is_trivially_copyable_v<float16_t >);
2147} // namespace vortex
@@ -64,6 +90,10 @@ constexpr vx_ptype to_ptype() {
6490 return PTYPE_I32 ;
6591 } else if constexpr (std::is_same_v<T, int64_t >) {
6692 return PTYPE_I64 ;
93+ #if __STDCPP_FLOAT16_T__ == 1
94+ } else if constexpr (std::is_same_v<T, _Float16>) {
95+ return PTYPE_F16 ;
96+ #endif
6797 } else if constexpr (std::is_same_v<T, float16_t >) {
6898 return PTYPE_F16 ;
6999 } else if constexpr (std::is_same_v<T, float >) {
@@ -79,7 +109,13 @@ inline constexpr bool is_numeric_element =
79109 std::is_same_v<T, uint8_t > || std::is_same_v<T, uint16_t > || std::is_same_v<T, uint32_t > ||
80110 std::is_same_v<T, uint64_t > || std::is_same_v<T, int8_t > || std::is_same_v<T, int16_t > ||
81111 std::is_same_v<T, int32_t > || std::is_same_v<T, int64_t > || std::is_same_v<T, float > ||
82- std::is_same_v<T, double > || std::is_same_v<T, float16_t >;
112+ std::is_same_v<T, double >
113+ #if __STDCPP_FLOAT16_T__ == 1
114+ || std::is_same_v<T, _Float16>
115+ #else
116+ || std::is_same_v<T, float16_t >
117+ #endif
118+ ;
83119} // namespace vortex::detail
84120
85121namespace vortex {
0 commit comments