45{
48 bool signA;
61 bool signRem;
64
65
66
68 uiA = uA.ui;
72 uB.f = b;
73 uiB = uB.ui;
76
77
78 if ( expA == 0x1F ) {
79 if ( sigA || ((expB == 0x1F) && sigB) ) goto propagateNaN;
80 goto invalid;
81 }
82 if ( expB == 0x1F ) {
83 if ( sigB ) goto propagateNaN;
85 }
86
87
88 if ( ! expB ) {
89 if ( ! sigB ) goto invalid;
91 expB = normExpSig.exp;
92 sigB = normExpSig.sig;
93 }
94 if ( ! expA ) {
95 if ( ! sigA )
return a;
97 expA = normExpSig.exp;
98 sigA = normExpSig.sig;
99 }
100
101
102 rem = sigA | 0x0400;
103 sigB |= 0x0400;
104 expDiff = expA - expB;
105 if ( expDiff < 1 ) {
106 if ( expDiff < -1 )
return a;
107 sigB <<= 3;
108 if ( expDiff ) {
109 rem <<= 2;
110 q = 0;
111 } else {
112 rem <<= 3;
113 q = (sigB <= rem);
114 if ( q ) rem -= sigB;
115 }
116 } else {
118
119
120
121
122 rem <<= 4;
123 expDiff -= 31;
124
125
126
127
128
129 sigB <<= 3;
130 for (;;) {
132 if ( expDiff < 0 ) break;
134 expDiff -= 29;
135 }
136
137
138
139 q32 >>= ~expDiff & 31;
140 q = q32;
141 rem = (rem<<(expDiff + 30)) - q * sigB;
142 }
143
144
145 do {
146 altRem = rem;
147 ++q;
148 rem -= sigB;
149 } while ( ! (rem & 0x8000) );
150 meanRem = rem + altRem;
151 if ( (meanRem & 0x8000) || (! meanRem && (q & 1)) ) rem = altRem;
152 signRem = signA;
153 if ( 0x8000 <= rem ) {
154 signRem = ! signRem;
155 rem = -rem;
156 }
158
159
160 propagateNaN:
162 goto uiZ;
163 invalid:
166 uiZ:
167 uZ.ui = uiZ;
168 return uZ.f;
169
170}
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
uint_fast16_t softfloat_propagateNaNF16UI(uint_fast16_t uiA, uint_fast16_t uiB)
void softfloat_raiseFlags(uint_fast8_t flags)
struct exp8_sig16 softfloat_normSubnormalF16Sig(uint_fast16_t)
float16_t softfloat_normRoundPackToF16(bool, int_fast16_t, uint_fast16_t)
uint32_t softfloat_approxRecip32_1(uint32_t a)