45{
48 bool signA;
53 bool signB;
56 bool signZ;
62
63
64
66 uiA = uA.ui;
70 uB.f = b;
71 uiB = uB.ui;
75 signZ = signA ^ signB;
76
77
78 if ( expA == 0xFF ) {
79 if ( sigA || ((expB == 0xFF) && sigB) ) goto propagateNaN;
80 magBits = expB | sigB;
81 goto infArg;
82 }
83 if ( expB == 0xFF ) {
84 if ( sigB ) goto propagateNaN;
85 magBits = expA | sigA;
86 goto infArg;
87 }
88
89
90 if ( ! expA ) {
91 if ( ! sigA ) goto zero;
93 expA = normExpSig.exp;
94 sigA = normExpSig.sig;
95 }
96 if ( ! expB ) {
97 if ( ! sigB ) goto zero;
99 expB = normExpSig.exp;
100 sigB = normExpSig.sig;
101 }
102
103
104 expZ = expA + expB - 0x7F;
105 sigA = (sigA | 0x00800000)<<7;
106 sigB = (sigB | 0x00800000)<<8;
108 if ( sigZ < 0x40000000 ) {
109 --expZ;
110 sigZ <<= 1;
111 }
113
114
115 propagateNaN:
117 goto uiZ;
118
119
120 infArg:
121 if ( ! magBits ) {
124 } else {
126 }
127 goto uiZ;
128
129
130 zero:
132 uiZ:
133 uZ.ui = uiZ;
134 return uZ.f;
135
136}
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)
uint64_t softfloat_shortShiftRightJam64(uint64_t a, uint_fast8_t dist)