46{
53 struct exp32_sig64 normExpSig;
54 struct uint128 uiZ;
57
58
59
61 uiA64 = uA.s.signExp;
64 sigA = uA.s.signif;
65
66
67 if ( !(sigA &
UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) {
68 if ( !sigA ) {
69 uiZ64 = signUI64;
70 sigZ = 0;
71 goto uiZ;
72 }
74 exp += normExpSig.exp;
75 sigA = normExpSig.sig;
76 }
77
78
79 if ( 0x403E <= exp ) {
80 if ( exp == 0x7FFF ) {
81 if ( sigA &
UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
83 uiZ64 = uiZ.v64;
84 sigZ = uiZ.v0;
85 goto uiZ;
86 }
87 sigZ =
UINT64_C( 0x8000000000000000 );
88 } else {
89 sigZ = sigA;
90 }
91 uiZ64 = signUI64 | exp;
92 goto uiZ;
93 }
94 if ( exp <= 0x3FFE ) {
96 switch ( roundingMode ) {
98 if ( !(sigA &
UINT64_C( 0x7FFFFFFFFFFFFFFF )) )
break;
100 if ( exp == 0x3FFE ) goto mag1;
101 break;
103 if ( signUI64 ) goto mag1;
104 break;
106 if ( !signUI64 ) goto mag1;
107 break;
108#ifdef SOFTFLOAT_ROUND_ODD
110 goto mag1;
111#endif
112 }
113 uiZ64 = signUI64;
114 sigZ = 0;
115 goto uiZ;
116 mag1:
117 uiZ64 = signUI64 | 0x3FFF;
118 sigZ =
UINT64_C( 0x8000000000000000 );
119 goto uiZ;
120 }
121
122
123 uiZ64 = signUI64 | exp;
125 roundBitsMask = lastBitMask - 1;
126 sigZ = sigA;
128 sigZ += lastBitMask>>1;
130 sigZ += lastBitMask>>1;
131 if ( !(sigZ & roundBitsMask) ) sigZ &= ~lastBitMask;
132 } else if (
134 ) {
135 sigZ += roundBitsMask;
136 }
137 sigZ &= ~roundBitsMask;
138 if ( !sigZ ) {
139 ++uiZ64;
140 sigZ =
UINT64_C( 0x8000000000000000 );
141 }
142 if ( sigZ != sigA ) {
143#ifdef SOFTFLOAT_ROUND_ODD
145#endif
147 }
148 uiZ:
149 uZ.s.signExp = uiZ64;
150 uZ.s.signif = sigZ;
151 return uZ.f;
152
153}
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
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 softfloat_exceptionFlags
@ softfloat_round_near_even
@ softfloat_round_near_maxMag
struct exp32_sig64 softfloat_normSubnormalExtF80Sig(uint_fast64_t sig)