8 int_fast64_t f32_to_i64_r_minMag( float32_t a
, bool exact
)
15 int_fast16_t shiftCount
;
21 exp
= expF32UI( uiA
);
22 sig
= fracF32UI( uiA
);
24 if ( exact
&& ( exp
| sig
) ) {
25 softfloat_exceptionFlags
|= softfloat_flag_inexact
;
29 sign
= signF32UI( uiA
);
30 shiftCount
= 0xBE - exp
;
31 if ( shiftCount
<= 0 ) {
32 if ( uiA
!= packToF32UI( 1, 0xBE, 0 ) ) {
33 softfloat_raiseFlags( softfloat_flag_invalid
);
34 if ( ! sign
|| ( ( exp
== 0xFF ) && sig
) ) {
35 return INT64_C( 0x7FFFFFFFFFFFFFFF );
38 return - INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
41 sig64
= (uint_fast64_t) sig
<<40;
42 absZ
= sig64
>>shiftCount
;
43 shiftCount
= 40 - shiftCount
;
45 exact
&& ( shiftCount
< 0 ) && (uint32_t) ( sig
<<( shiftCount
& 31 ) )
47 softfloat_exceptionFlags
|= softfloat_flag_inexact
;
49 return sign
? - absZ
: absZ
;