temporary undoing of renaming
[riscv-isa-sim.git] / softfloat / s_addMagsF32.c
1
2 #include <stdbool.h>
3 #include <stdint.h>
4 #include "platform.h"
5 #include "primitives.h"
6 #include "internals.h"
7 #include "specialize.h"
8
9 float32_t
10 softfloat_addMagsF32( uint_fast32_t uiA, uint_fast32_t uiB, bool signZ )
11 {
12 int_fast16_t expA;
13 uint_fast32_t sigA;
14 int_fast16_t expB;
15 uint_fast32_t sigB;
16 int_fast16_t expDiff;
17 uint_fast32_t uiZ;
18 int_fast16_t expZ;
19 uint_fast32_t sigZ;
20 union ui32_f32 uZ;
21
22 expA = expF32UI( uiA );
23 sigA = fracF32UI( uiA );
24 expB = expF32UI( uiB );
25 sigB = fracF32UI( uiB );
26 expDiff = expA - expB;
27 sigA <<= 6;
28 sigB <<= 6;
29 if ( ! expDiff ) {
30 if ( expA == 0xFF ) {
31 if ( sigA | sigB ) goto propagateNaN;
32 uiZ = uiA;
33 goto uiZ;
34 }
35 if ( ! expA ) {
36 uiZ = packToF32UI( signZ, 0, ( uiA + uiB ) & 0x7FFFFFFF );
37 goto uiZ;
38 }
39 expZ = expA;
40 sigZ = 0x40000000 + sigA + sigB;
41 } else {
42 if ( expDiff < 0 ) {
43 if ( expB == 0xFF ) {
44 if ( sigB ) goto propagateNaN;
45 uiZ = packToF32UI( signZ, 0xFF, 0 );
46 goto uiZ;
47 }
48 expZ = expB;
49 sigA += expA ? 0x20000000 : sigA;
50 sigA = softfloat_shift32RightJam( sigA, - expDiff );
51 } else {
52 if ( expA == 0xFF ) {
53 if ( sigA ) goto propagateNaN;
54 uiZ = uiA;
55 goto uiZ;
56 }
57 expZ = expA;
58 sigB += expB ? 0x20000000 : sigB;
59 sigB = softfloat_shift32RightJam( sigB, expDiff );
60 }
61 sigZ = 0x20000000 + sigA + sigB;
62 if ( sigZ < 0x40000000 ) {
63 --expZ;
64 sigZ <<= 1;
65 }
66 }
67 return softfloat_roundPackToF32( signZ, expZ, sigZ );
68 propagateNaN:
69 uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
70 uiZ:
71 uZ.ui = uiZ;
72 return uZ.f;
73
74 }
75