45{
48 bool signA;
53 bool signB;
56 bool signZ;
60#ifdef SOFTFLOAT_FAST_INT64
61 struct uint128 sig128Z;
62#else
64#endif
67
68
69
71 uiA = uA.ui;
75 uB.f = b;
76 uiB = uB.ui;
80 signZ = signA ^ signB;
81
82
83 if ( expA == 0x7FF ) {
84 if ( sigA || ((expB == 0x7FF) && sigB) ) goto propagateNaN;
85 magBits = expB | sigB;
86 goto infArg;
87 }
88 if ( expB == 0x7FF ) {
89 if ( sigB ) goto propagateNaN;
90 magBits = expA | sigA;
91 goto infArg;
92 }
93
94
95 if ( ! expA ) {
96 if ( ! sigA ) goto zero;
98 expA = normExpSig.exp;
99 sigA = normExpSig.sig;
100 }
101 if ( ! expB ) {
102 if ( ! sigB ) goto zero;
104 expB = normExpSig.exp;
105 sigB = normExpSig.sig;
106 }
107
108
109 expZ = expA + expB - 0x3FF;
110 sigA = (sigA |
UINT64_C( 0x0010000000000000 ))<<10;
111 sigB = (sigB |
UINT64_C( 0x0010000000000000 ))<<11;
112#ifdef SOFTFLOAT_FAST_INT64
114 sigZ = sig128Z.v64 | (sig128Z.v0 != 0);
115#else
117 sigZ =
120#endif
121 if ( sigZ <
UINT64_C( 0x4000000000000000 ) ) {
122 --expZ;
123 sigZ <<= 1;
124 }
126
127
128 propagateNaN:
130 goto uiZ;
131
132
133 infArg:
134 if ( ! magBits ) {
137 } else {
139 }
140 goto uiZ;
141
142
143 zero:
145 uiZ:
146 uZ.ui = uiZ;
147 return uZ.f;
148
149}
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
uint_fast64_t softfloat_propagateNaNF64UI(uint_fast64_t uiA, uint_fast64_t uiB)
void softfloat_raiseFlags(uint_fast8_t flags)
float64_t softfloat_roundPackToF64(bool, int_fast16_t, uint_fast64_t)
struct exp16_sig64 softfloat_normSubnormalF64Sig(uint_fast64_t)
#define packToF64UI(sign, exp, sig)
#define indexWord(total, n)
void softfloat_mul64To128M(uint64_t a, uint64_t b, uint32_t *zPtr)
struct uint128 softfloat_mul64To128(uint64_t a, uint64_t b)
unsigned __int64 uint64_t