9f0ae5c511b6e64a4b59d21fa223681e2dda2b5e
[riscv-isa-sim.git] / softfloat / f32_to_f64.c
1
2 #include <stdbool.h>
3 #include <stdint.h>
4 #include "platform.h"
5 #include "internals.h"
6 #include "specialize.h"
7 #include "softfloat.h"
8
9 float64_t f32_to_f64( float32_t a )
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 uint_fast64_t uiZ;
17 struct exp16_sig32 normExpSig;
18 union ui64_f64 uZ;
19
20 uA.f = a;
21 uiA = uA.ui;
22 sign = signF32UI( uiA );
23 exp = expF32UI( uiA );
24 sig = fracF32UI( uiA );
25 if ( exp == 0xFF ) {
26 uiZ =
27 sig ? softfloat_commonNaNToF64UI(
28 softfloat_f32UIToCommonNaN( uiA ) )
29 : packToF64UI( sign, 0x7FF, 0 );
30 goto uiZ;
31 }
32 if ( ! exp ) {
33 if ( ! sig ) {
34 uiZ = packToF64UI( sign, 0, 0 );
35 goto uiZ;
36 }
37 normExpSig = softfloat_normSubnormalF32Sig( sig );
38 exp = normExpSig.exp - 1;
39 sig = normExpSig.sig;
40 }
41 uiZ = packToF64UI( sign, exp + 0x380, (uint_fast64_t) sig<<29 );
42 uiZ:
43 uZ.ui = uiZ;
44 return uZ.f;
45
46 }
47