51{
53 bool roundNearEven, doIncrement, isTiny;
54 struct uint128_extra sig128Extra;
56 struct uint128 sig128;
57 union ui128_f128 uZ;
58
59
60
63 doIncrement = (
UINT64_C( 0x8000000000000000 ) <= sigExtra);
65 doIncrement =
66 (roundingMode
68 && sigExtra;
69 }
70
71
73 if ( exp < 0 ) {
74
75
76 isTiny =
79 || (exp < -1)
80 || ! doIncrement
82 sig64,
83 sig0,
86 );
87 sig128Extra =
89 sig64 = sig128Extra.v.v64;
90 sig0 = sig128Extra.v.v0;
91 sigExtra = sig128Extra.extra;
92 exp = 0;
93 if ( isTiny && sigExtra ) {
95 }
96 doIncrement = (
UINT64_C( 0x8000000000000000 ) <= sigExtra);
97 if (
98 ! roundNearEven
100 ) {
101 doIncrement =
102 (roundingMode
104 && sigExtra;
105 }
106 } else if (
107 (0x7FFD < exp)
108 || ((exp == 0x7FFD)
110 sig64,
111 sig0,
114 )
115 && doIncrement)
116 ) {
117
118
121 if (
122 roundNearEven
124 || (roundingMode
126 ) {
127 uiZ64 = packToF128UI64( sign, 0x7FFF, 0 );
128 uiZ0 = 0;
129 } else {
130 uiZ64 =
131 packToF128UI64(
132 sign, 0x7FFE,
UINT64_C( 0x0000FFFFFFFFFFFF ) );
133 uiZ0 =
UINT64_C( 0xFFFFFFFFFFFFFFFF );
134 }
135 goto uiZ;
136 }
137 }
138
139
140 if ( sigExtra ) {
142#ifdef SOFTFLOAT_ROUND_ODD
144 sig0 |= 1;
145 goto packReturn;
146 }
147#endif
148 }
149 if ( doIncrement ) {
151 sig64 = sig128.v64;
152 sig0 =
153 sig128.v0
155 (! (sigExtra &
UINT64_C( 0x7FFFFFFFFFFFFFFF ))
156 & roundNearEven);
157 } else {
158 if ( ! (sig64 | sig0) ) exp = 0;
159 }
160
161
162 packReturn:
163 uiZ64 = packToF128UI64( sign, exp, sig64 );
164 uiZ0 = sig0;
165 uiZ:
166 uZ.ui.v64 = uiZ64;
167 uZ.ui.v0 = uiZ0;
168 return uZ.f;
169
170}
void softfloat_raiseFlags(uint_fast8_t flags)
THREAD_LOCAL uint_fast8_t softfloat_roundingMode
@ softfloat_flag_underflow
@ softfloat_flag_overflow
THREAD_LOCAL uint_fast8_t softfloat_exceptionFlags
THREAD_LOCAL uint_fast8_t softfloat_detectTininess
@ softfloat_round_near_even
@ softfloat_round_near_maxMag
@ softfloat_tininess_beforeRounding
struct uint128 softfloat_add128(uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0)
bool softfloat_eq128(uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0)
bool softfloat_lt128(uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0)
unsigned __int64 uint64_t