5 #include "primitives.h"
9 int_fast64_t f64_to_i64( 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
);
33 ? INT64_C( 0x7FFFFFFFFFFFFFFF )
34 : - INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
36 sigExtra
.v
= sig
<<( - shiftCount
);
39 sigExtra
= softfloat_shift64ExtraRightJam( sig
, 0, shiftCount
);
42 softfloat_roundPackToI64(
43 sign
, sigExtra
.v
, sigExtra
.extra
, roundingMode
, exact
);