45{
47 bool roundNearEven;
49 bool isTiny;
52
53
54
57 roundIncrement = 0x200;
59 roundIncrement =
60 (roundingMode
62 ? 0x3FF
63 : 0;
64 }
65 roundBits = sig & 0x3FF;
66
67
69 if ( exp < 0 ) {
70
71
72 isTiny =
74 || (exp < -1)
75 || (sig + roundIncrement <
UINT64_C( 0x8000000000000000 ));
77 exp = 0;
78 roundBits = sig & 0x3FF;
79 if ( isTiny && roundBits ) {
81 }
82 } else if (
83 (0x7FD < exp)
84 || (
UINT64_C( 0x8000000000000000 ) <= sig + roundIncrement)
85 ) {
86
87
90 uiZ =
packToF64UI( sign, 0x7FF, 0 ) - ! roundIncrement;
91 goto uiZ;
92 }
93 }
94
95
96 sig = (sig + roundIncrement)>>10;
97 if ( roundBits ) {
99#ifdef SOFTFLOAT_ROUND_ODD
101 sig |= 1;
102 goto packReturn;
103 }
104#endif
105 }
106 sig &= ~(
uint_fast64_t) (! (roundBits ^ 0x200) & roundNearEven);
107 if ( ! sig ) exp = 0;
108
109
110 packReturn:
112 uiZ:
113 uZ.ui = uiZ;
114 return uZ.f;
115
116}
void softfloat_raiseFlags(uint_fast8_t flags)
#define packToF64UI(sign, exp, sig)
uint64_t softfloat_shiftRightJam64(uint64_t a, uint_fast32_t dist)
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