Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
extF80_roundToInt.c File Reference
#include <stdbool.h>
#include <stdint.h>
#include "platform.h"
#include "internals.h"
#include "specialize.h"
#include "softfloat.h"
Include dependency graph for extF80_roundToInt.c:

Go to the source code of this file.

Functions

extFloat80_t extF80_roundToInt (extFloat80_t a, uint_fast8_t roundingMode, bool exact)
 

Function Documentation

◆ extF80_roundToInt()

extFloat80_t extF80_roundToInt ( extFloat80_t a,
uint_fast8_t roundingMode,
bool exact )

Definition at line 45 of file extF80_roundToInt.c.

46{
47 union { struct extFloat80M s; extFloat80_t f; } uA;
48 uint_fast16_t uiA64, signUI64;
49 int_fast32_t exp;
50 uint_fast64_t sigA;
51 uint_fast16_t uiZ64;
52 uint_fast64_t sigZ;
53 struct exp32_sig64 normExpSig;
54 struct uint128 uiZ;
55 uint_fast64_t lastBitMask, roundBitsMask;
56 union { struct extFloat80M s; extFloat80_t f; } uZ;
57
58 /*------------------------------------------------------------------------
59 *------------------------------------------------------------------------*/
60 uA.f = a;
61 uiA64 = uA.s.signExp;
62 signUI64 = uiA64 & packToExtF80UI64( 1, 0 );
63 exp = expExtF80UI64( uiA64 );
64 sigA = uA.s.signif;
65 /*------------------------------------------------------------------------
66 *------------------------------------------------------------------------*/
67 if ( !(sigA & UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) {
68 if ( !sigA ) {
69 uiZ64 = signUI64;
70 sigZ = 0;
71 goto uiZ;
72 }
73 normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
74 exp += normExpSig.exp;
75 sigA = normExpSig.sig;
76 }
77 /*------------------------------------------------------------------------
78 *------------------------------------------------------------------------*/
79 if ( 0x403E <= exp ) {
80 if ( exp == 0x7FFF ) {
81 if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
82 uiZ = softfloat_propagateNaNExtF80UI( uiA64, sigA, 0, 0 );
83 uiZ64 = uiZ.v64;
84 sigZ = uiZ.v0;
85 goto uiZ;
86 }
87 sigZ = UINT64_C( 0x8000000000000000 );
88 } else {
89 sigZ = sigA;
90 }
91 uiZ64 = signUI64 | exp;
92 goto uiZ;
93 }
94 if ( exp <= 0x3FFE ) {
96 switch ( roundingMode ) {
98 if ( !(sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) break;
100 if ( exp == 0x3FFE ) goto mag1;
101 break;
103 if ( signUI64 ) goto mag1;
104 break;
106 if ( !signUI64 ) goto mag1;
107 break;
108#ifdef SOFTFLOAT_ROUND_ODD
110 goto mag1;
111#endif
112 }
113 uiZ64 = signUI64;
114 sigZ = 0;
115 goto uiZ;
116 mag1:
117 uiZ64 = signUI64 | 0x3FFF;
118 sigZ = UINT64_C( 0x8000000000000000 );
119 goto uiZ;
120 }
121 /*------------------------------------------------------------------------
122 *------------------------------------------------------------------------*/
123 uiZ64 = signUI64 | exp;
124 lastBitMask = (uint_fast64_t) 1<<(0x403E - exp);
125 roundBitsMask = lastBitMask - 1;
126 sigZ = sigA;
127 if ( roundingMode == softfloat_round_near_maxMag ) {
128 sigZ += lastBitMask>>1;
129 } else if ( roundingMode == softfloat_round_near_even ) {
130 sigZ += lastBitMask>>1;
131 if ( !(sigZ & roundBitsMask) ) sigZ &= ~lastBitMask;
132 } else if (
133 roundingMode == (signUI64 ? softfloat_round_min : softfloat_round_max)
134 ) {
135 sigZ += roundBitsMask;
136 }
137 sigZ &= ~roundBitsMask;
138 if ( !sigZ ) {
139 ++uiZ64;
140 sigZ = UINT64_C( 0x8000000000000000 );
141 }
142 if ( sigZ != sigA ) {
143#ifdef SOFTFLOAT_ROUND_ODD
144 if ( roundingMode == softfloat_round_odd ) sigZ |= lastBitMask;
145#endif
147 }
148 uiZ:
149 uZ.s.signExp = uiZ64;
150 uZ.s.signif = sigZ;
151 return uZ.f;
152
153}
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition pointer.h:1181
struct uint128 softfloat_propagateNaNExtF80UI(uint_fast16_t uiA64, uint_fast64_t uiA0, uint_fast16_t uiB64, uint_fast64_t uiB0)
#define packToExtF80UI64(sign, exp)
Definition internals.h:148
#define expExtF80UI64(a64)
Definition internals.h:147
@ softfloat_flag_inexact
Definition softfloat.h:85
THREAD_LOCAL uint_fast8_t softfloat_exceptionFlags
@ softfloat_round_odd
Definition softfloat.h:77
@ softfloat_round_max
Definition softfloat.h:75
@ softfloat_round_min
Definition softfloat.h:74
@ softfloat_round_near_even
Definition softfloat.h:72
@ softfloat_round_near_maxMag
Definition softfloat.h:76
struct exp32_sig64 softfloat_normSubnormalExtF80Sig(uint_fast64_t sig)
uint16_t uint_fast16_t
Definition stdint.h:155
uint64_t uint_fast64_t
Definition stdint.h:157
#define UINT64_C(val)
Definition stdint.h:284
int32_t int_fast32_t
Definition stdint.h:152
char * s
Here is the call graph for this function: