5 #include "primitives.h"
9 int_fast64_t f32_to_i64( float32_t a
, int_fast8_t roundingMode
, bool exact
)
16 int_fast16_t shiftCount
;
17 uint_fast64_t sig64
, extra
;
18 struct uint64_extra sig64Extra
;
22 sign
= signF32UI( uiA
);
23 exp
= expF32UI( uiA
);
24 sig
= fracF32UI( uiA
);
25 shiftCount
= 0xBE - exp
;
26 if ( shiftCount
< 0 ) {
27 softfloat_raiseFlags( softfloat_flag_invalid
);
29 return INT64_C( 0x7FFFFFFFFFFFFFFF );
31 return - INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
33 if ( exp
) sig
|= 0x00800000;
34 sig64
= (uint_fast64_t) sig
<<40;
37 sig64Extra
= softfloat_shift64ExtraRightJam( sig64
, 0, shiftCount
);
39 extra
= sig64Extra
.extra
;
41 return softfloat_roundPackToI64( sign
, sig64
, extra
, roundingMode
, exact
);