コード例 #1
0
ファイル: float.c プロジェクト: macton/ps3-archive
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);
}
コード例 #2
0
ファイル: float.c プロジェクト: macton/ps3-archive
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);
}
コード例 #3
0
ファイル: float.c プロジェクト: macton/ps3-archive
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);
}
コード例 #4
0
ファイル: math.cpp プロジェクト: fluffyfreak/bx
	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;
	}
コード例 #5
0
ファイル: float.c プロジェクト: macton/ps3-archive
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);
}
コード例 #6
0
ファイル: float.c プロジェクト: macton/ps3-archive
static inline uint32_t cp_float_extract_s( uint32_t a )
{
    const uint32_t s = uint32_srl( a, 31 );

    return (s);
}