525705b4f28e6631fd13f36f819d0f0bcc527d02
8 int_fast64_t f64_to_i64_r_minMag( float64_t a
, bool exact
)
15 int_fast16_t shiftCount
;
20 sign
= signF64UI( uiA
);
21 exp
= expF64UI( uiA
);
22 sig
= fracF64UI( uiA
);
23 shiftCount
= exp
- 0x433;
24 if ( 0 <= shiftCount
) {
26 if ( uiA
!= packToF64UI( 1, 0x43E, 0 ) ) {
27 softfloat_raiseFlags( softfloat_flag_invalid
);
28 if ( ! sign
|| ( ( exp
== 0x7FF ) && sig
) ) {
29 return INT64_C( 0x7FFFFFFFFFFFFFFF );
32 return - INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
34 sig
|= UINT64_C( 0x0010000000000000 );
35 absZ
= sig
<<shiftCount
;
38 if ( exact
&& ( exp
| sig
) ) {
39 softfloat_exceptionFlags
|= softfloat_flag_inexact
;
43 sig
|= UINT64_C( 0x0010000000000000 );
44 absZ
= sig
>>( - shiftCount
);
45 if ( exact
&& (uint64_t) ( sig
<<( shiftCount
& 63 ) ) ) {
46 softfloat_exceptionFlags
|= softfloat_flag_inexact
;
49 return sign
? - absZ
: absZ
;