static inline uint32_t uint32_srl_sticky( uint32_t a, uint32_t count ) { uint32_t is_no_shift_mask = uint32_cmpeqz( count ); uint32_t is_valid_shift_mask = uint32_cmplt( count, 32 ); uint32_t is_a_nez_mask = uint32_cmpnez( a ); uint32_t overshift_sticky = uint32_srl( is_a_nez_mask, 31 ); uint64_t a_shifted = uint32_srl( a, count ); uint32_t normal_sticky = a_shifted | ( ( a<<( ( - count ) & 31 ) ) != 0 ); uint32_t result_0 = uint32_sel( is_no_shift_mask, a, normal_sticky ); uint32_t result_1 = uint32_sel( is_valid_shift_mask, result_0, overshift_sticky ); return (result_1); }
static inline uint32_t cp_float_is_nan( uint32_t a ) { uint32_t em = uint32_sll( a, 1 ); uint32_t is_nan_msb = uint32_sub( 0xff000000, em ); uint32_t is_nan_pred = uint32_srl( is_nan_msb, 31 ); return (is_nan_pred); }
static inline uint32_t cp_float_extract_e( uint32_t a ) { const uint32_t e_pos = 23; const uint32_t e_mask = 0x000000ff; const uint32_t es = uint32_srl( a, e_pos ); const uint32_t e = uint32_and( es, e_mask ); return (e); }
float frexp(float _a, int32_t* _outExp) { const uint32_t ftob = floatToBits(_a); const uint32_t masked0 = uint32_and(ftob, UINT32_C(0x7f800000) ); const uint32_t exp0 = uint32_srl(masked0, 23); const uint32_t masked1 = uint32_and(ftob, UINT32_C(0x807fffff) ); const uint32_t bits = uint32_or(masked1, UINT32_C(0x3f000000) ); const float result = bitsToFloat(bits); *_outExp = int32_t(exp0 - 0x7e); return result; }
uint32_t cp_float_is_snan( uint32_t a ) { uint32_t flag_mask = 0x1ff; uint32_t flag_expected = 0x1fe; uint32_t flag_bits = uint32_srl( a, 22 ); uint32_t flag_unsigned = uint32_and( flag_bits, flag_mask ); uint32_t is_flagged = uint32_cmpeq( flag_unsigned, flag_expected ); uint32_t m_lo = uint32_and( a, 0x003fffff ); uint32_t is_m_lo_nez = uint32_cmpnez( m_lo ); uint32_t is_snan = uint32_and( is_flagged, is_m_lo_nez ); return (is_snan); }
static inline uint32_t cp_float_extract_s( uint32_t a ) { const uint32_t s = uint32_srl( a, 31 ); return (s); }