6cdcf7458039fc57fb7aa1309e0348da10cb8695
[riscv-isa-sim.git] / softfloat / f32_to_ui64.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_fast64_t f32_to_ui64( float32_t a, int_fast8_t roundingMode, bool exact )
10 {
11 union ui32_f32 uA;
12 uint_fast32_t uiA;
13 bool sign;
14 int_fast16_t exp;
15 uint_fast32_t sig;
16 int_fast16_t shiftCount;
17 uint_fast64_t sig64, extra;
18 struct uint64_extra sig64Extra;
19
20 uA.f = a;
21 uiA = uA.ui;
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 );
28 return UINT64_C( 0xFFFFFFFFFFFFFFFF );
29 }
30 if ( exp ) sig |= 0x00800000;
31 sig64 = (uint_fast64_t) sig<<40;
32 extra = 0;
33 if ( shiftCount ) {
34 sig64Extra = softfloat_shift64ExtraRightJam( sig64, 0, shiftCount );
35 sig64 = sig64Extra.v;
36 extra = sig64Extra.extra;
37 }
38 return
39 softfloat_roundPackToUI64( sign, sig64, extra, roundingMode, exact );
40
41 }
42