45{
48 bool signA;
53 bool signB;
56 bool signZ;
59#ifdef SOFTFLOAT_FAST_DIV64TO32
62#else
65#endif
68
69
70
72 uiA = uA.ui;
76 uB.f = b;
77 uiB = uB.ui;
81 signZ = signA ^ signB;
82
83
84 if ( expA == 0xFF ) {
85 if ( sigA ) goto propagateNaN;
86 if ( expB == 0xFF ) {
87 if ( sigB ) goto propagateNaN;
88 goto invalid;
89 }
90 goto infinity;
91 }
92 if ( expB == 0xFF ) {
93 if ( sigB ) goto propagateNaN;
94 goto zero;
95 }
96
97
98 if ( ! expB ) {
99 if ( ! sigB ) {
100 if ( ! (expA | sigA) ) goto invalid;
102 goto infinity;
103 }
105 expB = normExpSig.exp;
106 sigB = normExpSig.sig;
107 }
108 if ( ! expA ) {
109 if ( ! sigA ) goto zero;
111 expA = normExpSig.exp;
112 sigA = normExpSig.sig;
113 }
114
115
116 expZ = expA - expB + 0x7E;
117 sigA |= 0x00800000;
118 sigB |= 0x00800000;
119#ifdef SOFTFLOAT_FAST_DIV64TO32
120 if ( sigA < sigB ) {
121 --expZ;
123 } else {
125 }
126 sigZ = sig64A / sigB;
127 if ( ! (sigZ & 0x3F) ) sigZ |= ((
uint_fast64_t) sigB * sigZ != sig64A);
128#else
129 if ( sigA < sigB ) {
130 --expZ;
131 sigA <<= 8;
132 } else {
133 sigA <<= 7;
134 }
135 sigB <<= 8;
137
138
139 sigZ += 2;
140 if ( (sigZ & 0x3F) < 2 ) {
141 sigZ &= ~3;
142#ifdef SOFTFLOAT_FAST_INT64
144#else
146#endif
147 if ( rem &
UINT64_C( 0x8000000000000000 ) ) {
148 sigZ -= 4;
149 } else {
150 if ( rem ) sigZ |= 1;
151 }
152 }
153#endif
155
156
157 propagateNaN:
159 goto uiZ;
160
161
162 invalid:
165 goto uiZ;
166
167
168 infinity:
170 goto uiZ;
171
172
173 zero:
175 uiZ:
176 uZ.ui = uiZ;
177 return uZ.f;
178
179}
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)
float32_t softfloat_roundPackToF32(bool, int_fast16_t, uint_fast32_t)
struct exp16_sig32 softfloat_normSubnormalF32Sig(uint_fast32_t)
#define packToF32UI(sign, exp, sig)
uint32_t softfloat_approxRecip32_1(uint32_t a)
@ softfloat_flag_infinite