8 int_fast32_t f64_to_i32_r_minMag( float64_t a
, bool exact
)
15 int_fast16_t shiftCount
;
17 union { uint32_t ui
; int32_t i
; } uZ
;
22 exp
= expF64UI( uiA
);
23 sig
= fracF64UI( uiA
);
25 if ( exact
&& ( exp
| sig
) ) {
26 softfloat_exceptionFlags
|= softfloat_flag_inexact
;
30 sign
= signF64UI( uiA
);
32 if ( ( exp
== 0x7FF ) && sig
) sign
= 0;
35 sig
|= UINT64_C( 0x0010000000000000 );
36 shiftCount
= 0x433 - exp
;
37 absZ
= sig
>>shiftCount
;
38 uZ
.ui
= sign
? - absZ
: absZ
;
40 if ( ( z
< 0 ) != sign
) goto invalid
;
41 if ( exact
&& ( (uint_fast64_t) absZ
<<shiftCount
!= sig
) ) {
42 softfloat_exceptionFlags
|= softfloat_flag_inexact
;
46 softfloat_raiseFlags( softfloat_flag_invalid
);
47 return sign
? -0x7FFFFFFF - 1 : 0x7FFFFFFF;