b1866050f7f2797c7c2a3af0796ecbd6252cd1fb
[riscv-isa-sim.git] / softfloat / f64_to_ui32.c
1
2 #include <stdbool.h>
3 #include <stdint.h>
4 #include "platform.h"
5 #include "primitives.h"
6 #include "internals.h"
7 #include "softfloat.h"
8
9 uint_fast32_t f64_to_ui32( float64_t a, int_fast8_t roundingMode, bool exact )
10 {
11 union ui64_f64 uA;
12 uint_fast64_t uiA;
13 bool sign;
14 int_fast16_t exp;
15 uint_fast64_t sig;
16 int_fast16_t shiftCount;
17
18 uA.f = a;
19 uiA = uA.ui;
20 sign = signF64UI( uiA );
21 exp = expF64UI( uiA );
22 sig = fracF64UI( uiA );
23 if ( exp ) sig |= UINT64_C( 0x0010000000000000 );
24 shiftCount = 0x42C - exp;
25 if ( 0 < shiftCount ) sig = softfloat_shift64RightJam( sig, shiftCount );
26 return softfloat_roundPackToUI32( sign, sig, roundingMode, exact );
27
28 }
29