temporary undoing of renaming
[riscv-isa-sim.git] / softfloat / s_addMagsF64.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 float64_t
10 softfloat_addMagsF64( uint_fast64_t uiA, uint_fast64_t uiB, bool signZ )
11 {
12 int_fast16_t expA;
13 uint_fast64_t sigA;
14 int_fast16_t expB;
15 uint_fast64_t sigB;
16 int_fast16_t expDiff;
17 uint_fast64_t uiZ;
18 int_fast16_t expZ;
19 uint_fast64_t sigZ;
20 union ui64_f64 uZ;
21
22 expA = expF64UI( uiA );
23 sigA = fracF64UI( uiA );
24 expB = expF64UI( uiB );
25 sigB = fracF64UI( uiB );
26 expDiff = expA - expB;
27 sigA <<= 9;
28 sigB <<= 9;
29 if ( ! expDiff ) {
30 if ( expA == 0x7FF ) {
31 if ( sigA | sigB ) goto propagateNaN;
32 uiZ = uiA;
33 goto uiZ;
34 }
35 if ( ! expA ) {
36 uiZ =
37 packToF64UI(
38 signZ, 0, ( uiA + uiB ) & UINT64_C( 0x7FFFFFFFFFFFFFFF ) );
39 goto uiZ;
40 }
41 expZ = expA;
42 sigZ = UINT64_C( 0x4000000000000000 ) + sigA + sigB;
43 } else {
44 if ( expDiff < 0 ) {
45 if ( expB == 0x7FF ) {
46 if ( sigB ) goto propagateNaN;
47 uiZ = packToF64UI( signZ, 0x7FF, 0 );
48 goto uiZ;
49 }
50 expZ = expB;
51 sigA += expA ? UINT64_C( 0x2000000000000000 ) : sigA;
52 sigA = softfloat_shift64RightJam( sigA, - expDiff );
53 } else {
54 if ( expA == 0x7FF ) {
55 if ( sigA ) goto propagateNaN;
56 uiZ = uiA;
57 goto uiZ;
58 }
59 expZ = expA;
60 sigB += expB ? UINT64_C( 0x2000000000000000 ) : sigB;
61 sigB = softfloat_shift64RightJam( sigB, expDiff );
62 }
63 sigZ = UINT64_C( 0x2000000000000000 ) + sigA + sigB;
64 if ( sigZ < UINT64_C( 0x4000000000000000 ) ) {
65 --expZ;
66 sigZ <<= 1;
67 }
68 }
69 return softfloat_roundPackToF64( signZ, expZ, sigZ );
70 propagateNaN:
71 uiZ = softfloat_propagateNaNF64UI( uiA, uiB );
72 uiZ:
73 uZ.ui = uiZ;
74 return uZ.f;
75
76 }
77