45{
48 bool signA;
58 uint32_t q, recip32, altRem, meanRem;
59 bool signRem;
62
63
64
66 uiA = uA.ui;
70 uB.f = b;
71 uiB = uB.ui;
74
75
76 if ( expA == 0xFF ) {
77 if ( sigA || ((expB == 0xFF) && sigB) ) goto propagateNaN;
78 goto invalid;
79 }
80 if ( expB == 0xFF ) {
81 if ( sigB ) goto propagateNaN;
83 }
84
85
86 if ( ! expB ) {
87 if ( ! sigB ) goto invalid;
89 expB = normExpSig.exp;
90 sigB = normExpSig.sig;
91 }
92 if ( ! expA ) {
93 if ( ! sigA )
return a;
95 expA = normExpSig.exp;
96 sigA = normExpSig.sig;
97 }
98
99
100 rem = sigA | 0x00800000;
101 sigB |= 0x00800000;
102 expDiff = expA - expB;
103 if ( expDiff < 1 ) {
104 if ( expDiff < -1 )
return a;
105 sigB <<= 6;
106 if ( expDiff ) {
107 rem <<= 5;
108 q = 0;
109 } else {
110 rem <<= 6;
111 q = (sigB <= rem);
112 if ( q ) rem -= sigB;
113 }
114 } else {
116
117
118
119
120 rem <<= 7;
121 expDiff -= 31;
122
123
124
125
126
127 sigB <<= 6;
128 for (;;) {
130 if ( expDiff < 0 ) break;
132 expDiff -= 29;
133 }
134
135
136
137 q >>= ~expDiff & 31;
138 rem = (rem<<(expDiff + 30)) - q * (
uint32_t) sigB;
139 }
140
141
142 do {
143 altRem = rem;
144 ++q;
145 rem -= sigB;
146 } while ( ! (rem & 0x80000000) );
147 meanRem = rem + altRem;
148 if ( (meanRem & 0x80000000) || (! meanRem && (q & 1)) ) rem = altRem;
149 signRem = signA;
150 if ( 0x80000000 <= rem ) {
151 signRem = ! signRem;
152 rem = -rem;
153 }
155
156
157 propagateNaN:
159 goto uiZ;
160 invalid:
163 uiZ:
164 uZ.ui = uiZ;
165 return uZ.f;
166
167}
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
uint_fast32_t softfloat_propagateNaNF32UI(uint_fast32_t uiA, uint_fast32_t uiB)
void softfloat_raiseFlags(uint_fast8_t flags)
struct exp16_sig32 softfloat_normSubnormalF32Sig(uint_fast32_t)
float32_t softfloat_normRoundPackToF32(bool, int_fast16_t, uint_fast32_t)
uint32_t softfloat_approxRecip32_1(uint32_t a)