5 #include "primitives.h"
9 uint_fast64_t f64_to_ui64( float64_t a
, int_fast8_t roundingMode
, bool exact
)
16 int_fast16_t shiftCount
;
17 struct uint64_extra sigExtra
;
21 sign
= signF64UI( uiA
);
22 exp
= expF64UI( uiA
);
23 sig
= fracF64UI( uiA
);
24 if ( exp
) sig
|= UINT64_C( 0x0010000000000000 );
25 shiftCount
= 0x433 - exp
;
26 if ( shiftCount
<= 0 ) {
28 softfloat_raiseFlags( softfloat_flag_invalid
);
29 return UINT64_C( 0xFFFFFFFFFFFFFFFF );
31 sigExtra
.v
= sig
<<( - shiftCount
);
34 sigExtra
= softfloat_shift64ExtraRightJam( sig
, 0, shiftCount
);
37 softfloat_roundPackToUI64(
38 sign
, sigExtra
.v
, sigExtra
.extra
, roundingMode
, exact
);