52{
62 struct uint128 sig128, uiZ;
64
65
66
68 sigA = uiA0;
70 sigB = uiB0;
71
72
73 expDiff = expA - expB;
74 if ( 0 < expDiff ) goto expABigger;
75 if ( expDiff < 0 ) goto expBBigger;
76 if ( expA == 0x7FFF ) {
77 if ( (sigA | sigB) &
UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
78 goto propagateNaN;
79 }
83 goto uiZ;
84 }
85
86
87 expZ = expA;
88 if ( ! expZ ) expZ = 1;
89 sigExtra = 0;
90 if ( sigB < sigA ) goto aBigger;
91 if ( sigA < sigB ) goto bBigger;
92 uiZ64 =
94 uiZ0 = 0;
95 goto uiZ;
96
97
98 expBBigger:
99 if ( expB == 0x7FFF ) {
100 if ( sigB &
UINT64_C( 0x7FFFFFFFFFFFFFFF ) )
goto propagateNaN;
102 uiZ0 =
UINT64_C( 0x8000000000000000 );
103 goto uiZ;
104 }
105 if ( ! expA ) {
106 ++expDiff;
107 sigExtra = 0;
108 if ( ! expDiff ) goto newlyAlignedBBigger;
109 }
111 sigA = sig128.v64;
112 sigExtra = sig128.v0;
113 newlyAlignedBBigger:
114 expZ = expB;
115 bBigger:
116 signZ = ! signZ;
118 goto normRoundPack;
119
120
121 expABigger:
122 if ( expA == 0x7FFF ) {
123 if ( sigA &
UINT64_C( 0x7FFFFFFFFFFFFFFF ) )
goto propagateNaN;
124 uiZ64 = uiA64;
125 uiZ0 = uiA0;
126 goto uiZ;
127 }
128 if ( ! expB ) {
129 --expDiff;
130 sigExtra = 0;
131 if ( ! expDiff ) goto newlyAlignedABigger;
132 }
134 sigB = sig128.v64;
135 sigExtra = sig128.v0;
136 newlyAlignedABigger:
137 expZ = expA;
138 aBigger:
140
141
142 normRoundPack:
143 return
146
147
148 propagateNaN:
150 uiZ64 = uiZ.v64;
151 uiZ0 = uiZ.v0;
152 uiZ:
153 uZ.s.signExp = uiZ64;
154 uZ.s.signif = uiZ0;
155 return uZ.f;
156
157}
struct uint128 softfloat_propagateNaNExtF80UI(uint_fast16_t uiA64, uint_fast64_t uiA0, uint_fast16_t uiB64, uint_fast64_t uiB0)
void softfloat_raiseFlags(uint_fast8_t flags)
#define defaultNaNExtF80UI0
#define defaultNaNExtF80UI64
#define packToExtF80UI64(sign, exp)
#define expExtF80UI64(a64)
THREAD_LOCAL uint_fast8_t softfloat_roundingMode
THREAD_LOCAL uint_fast8_t extF80_roundingPrecision
extFloat80_t softfloat_normRoundPackToExtF80(bool sign, int_fast32_t exp, uint_fast64_t sig, uint_fast64_t sigExtra, uint_fast8_t roundingPrecision)
struct uint128 softfloat_shiftRightJam128(uint64_t a64, uint64_t a0, uint_fast32_t dist)
struct uint128 softfloat_sub128(uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0)