7#if defined(HI_HAS_SSE4_1)
11#if defined(HI_HAS_SSSE3)
14#if defined(HI_HAS_SSE3)
17#if defined(HI_HAS_SSE2)
20#if defined(HI_HAS_SSE)
24#include "../float16.hpp"
26namespace hi::inline
v1 {
28inline __m128 _mm_cvtph_ps_sse2(__m128i value)
noexcept
30 hilet f32_to_f16_constants = _mm_set_epi32(0, f32_to_f16_adjustment, f32_to_f16_infinite, f32_to_f16_lowest_normal - 1);
33 auto u = _mm_unpacklo_epi16(value, _mm_setzero_si128());
36 hilet sign = _mm_slli_epi32(_mm_srli_epi32(u, 15), 31);
39 u = _mm_srli_epi32(_mm_slli_epi32(u, 17), 4);
42 hilet f32_to_f16_adjustment_ = _mm_shuffle_epi32(f32_to_f16_constants, 0b10'10'10'10);
43 u = _mm_add_epi32(u, f32_to_f16_adjustment_);
46 hilet f32_to_f16_lowest_normal_ = _mm_shuffle_epi32(f32_to_f16_constants, 0b00'00'00'00);
47 hilet is_normal = _mm_cmpgt_epi32(u, f32_to_f16_lowest_normal_);
50 u = _mm_or_si128(u, sign);
53 u = _mm_and_si128(u, is_normal);
55 return _mm_castsi128_ps(u);
58inline __m128i _mm_cvtps_ph_sse4_1(__m128 value)
noexcept
60 hilet f32_to_f16_constants = _mm_set_epi32(0, f32_to_f16_adjustment, f32_to_f16_infinite, f32_to_f16_lowest_normal - 1);
63 auto u = _mm_castps_si128(value);
66 hilet sign = _mm_slli_epi32(_mm_srai_epi32(u, 31), 15);
69 u = _mm_srli_epi32(_mm_slli_epi32(u, 1), 1);
72 hilet f32_to_f16_lowest_normal_ = _mm_shuffle_epi32(f32_to_f16_constants, 0b00'00'00'00);
73 hilet is_normal = _mm_cmpgt_epi32(u, f32_to_f16_lowest_normal_);
76 hilet f32_to_f16_infinite_ = _mm_shuffle_epi32(f32_to_f16_constants, 0b01'01'01'01);
77 u = _mm_min_epi32(u, f32_to_f16_infinite_);
80 hilet f32_to_f16_adjustment_ = _mm_shuffle_epi32(f32_to_f16_constants, 0b10'10'10'10);
81 u = _mm_sub_epi32(u, f32_to_f16_adjustment_);
84 u = _mm_srli_epi32(u, 13);
87 u = _mm_and_si128(u, is_normal);
91 u = _mm_or_si128(u, sign);
94 return _mm_packs_epi32(u, u);
Utilities used by the HikoGUI library itself.
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:15