52{
60 struct exp32_sig64 normExpSig;
62 struct uint64_extra sig64Extra;
63 struct uint128 uiZ;
65
66
67
69 sigA = uiA0;
71 sigB = uiB0;
72
73
74 expDiff = expA - expB;
75 if ( ! expDiff ) {
76 if ( expA == 0x7FFF ) {
77 if ( (sigA | sigB) &
UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
78 goto propagateNaN;
79 }
80 uiZ64 = uiA64;
81 uiZ0 = uiA0;
82 goto uiZ;
83 }
84 sigZ = sigA + sigB;
85 sigZExtra = 0;
86 if ( ! expA ) {
88 expZ = normExpSig.exp + 1;
89 sigZ = normExpSig.sig;
90 goto roundAndPack;
91 }
92 expZ = expA;
93 goto shiftRight1;
94 }
95
96
97 if ( expDiff < 0 ) {
98 if ( expB == 0x7FFF ) {
99 if ( sigB &
UINT64_C( 0x7FFFFFFFFFFFFFFF ) )
goto propagateNaN;
101 uiZ0 = uiB0;
102 goto uiZ;
103 }
104 expZ = expB;
105 if ( ! expA ) {
106 ++expDiff;
107 sigZExtra = 0;
108 if ( ! expDiff ) goto newlyAligned;
109 }
111 sigA = sig64Extra.v;
112 sigZExtra = sig64Extra.extra;
113 } else {
114 if ( expA == 0x7FFF ) {
115 if ( sigA &
UINT64_C( 0x7FFFFFFFFFFFFFFF ) )
goto propagateNaN;
116 uiZ64 = uiA64;
117 uiZ0 = uiA0;
118 goto uiZ;
119 }
120 expZ = expA;
121 if ( ! expB ) {
122 --expDiff;
123 sigZExtra = 0;
124 if ( ! expDiff ) goto newlyAligned;
125 }
127 sigB = sig64Extra.v;
128 sigZExtra = sig64Extra.extra;
129 }
130 newlyAligned:
131 sigZ = sigA + sigB;
132 if ( sigZ &
UINT64_C( 0x8000000000000000 ) )
goto roundAndPack;
133
134
135 shiftRight1:
137 sigZ = sig64Extra.v |
UINT64_C( 0x8000000000000000 );
138 sigZExtra = sig64Extra.extra;
139 ++expZ;
140 roundAndPack:
141 return
144
145
146 propagateNaN:
148 uiZ64 = uiZ.v64;
149 uiZ0 = uiZ.v0;
150 uiZ:
151 uZ.s.signExp = uiZ64;
152 uZ.s.signif = uiZ0;
153 return uZ.f;
154
155}
struct uint128 softfloat_propagateNaNExtF80UI(uint_fast16_t uiA64, uint_fast64_t uiA0, uint_fast16_t uiB64, uint_fast64_t uiB0)
#define packToExtF80UI64(sign, exp)
#define expExtF80UI64(a64)
THREAD_LOCAL uint_fast8_t extF80_roundingPrecision
struct exp32_sig64 softfloat_normSubnormalExtF80Sig(uint_fast64_t sig)
extFloat80_t softfloat_roundPackToExtF80(bool sign, int_fast32_t exp, uint_fast64_t sig, uint_fast64_t sigExtra, uint_fast8_t roundingPrecision)