9 softfloat_roundPackToI32(
10 bool sign
, uint_fast64_t sig
, int_fast8_t roundingMode
, bool exact
)
12 bool roundNearestEven
;
13 int roundIncrement
, roundBits
;
15 union { uint32_t ui
; int32_t i
; } uZ
;
18 roundNearestEven
= ( roundingMode
== softfloat_round_nearest_even
);
19 roundIncrement
= 0x40;
22 && ( roundingMode
!= softfloat_round_nearest_maxMag
)
25 ( roundingMode
== softfloat_round_minMag
)
27 == ( sign
? softfloat_round_max
: softfloat_round_min
) )
31 roundBits
= sig
& 0x7F;
32 sig
+= roundIncrement
;
33 if ( sig
& UINT64_C( 0xFFFFFF8000000000 ) ) goto invalid
;
35 sig32
&= ~ ( ! ( roundBits
^ 0x40 ) & roundNearestEven
);
36 uZ
.ui
= sign
? - sig32
: sig32
;
38 if ( z
&& ( ( z
< 0 ) ^ sign
) ) goto invalid
;
39 if ( exact
&& roundBits
) {
40 softfloat_exceptionFlags
|= softfloat_flag_inexact
;
44 softfloat_raiseFlags( softfloat_flag_invalid
);
45 return sign
? -0x7FFFFFFF - 1 : 0x7FFFFFFF;