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

Go to the source code of this file.

Functions

float128_t softfloat_roundPackToF128 (bool sign, int_fast32_t exp, uint_fast64_t sig64, uint_fast64_t sig0, uint_fast64_t sigExtra)
 

Function Documentation

◆ softfloat_roundPackToF128()

float128_t softfloat_roundPackToF128 ( bool sign,
int_fast32_t exp,
uint_fast64_t sig64,
uint_fast64_t sig0,
uint_fast64_t sigExtra )

Definition at line 44 of file s_roundPackToF128.c.

51{
52 uint_fast8_t roundingMode;
53 bool roundNearEven, doIncrement, isTiny;
54 struct uint128_extra sig128Extra;
55 uint_fast64_t uiZ64, uiZ0;
56 struct uint128 sig128;
57 union ui128_f128 uZ;
58
59 /*------------------------------------------------------------------------
60 *------------------------------------------------------------------------*/
61 roundingMode = softfloat_roundingMode;
62 roundNearEven = (roundingMode == softfloat_round_near_even);
63 doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
64 if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
65 doIncrement =
66 (roundingMode
68 && sigExtra;
69 }
70 /*------------------------------------------------------------------------
71 *------------------------------------------------------------------------*/
72 if ( 0x7FFD <= (uint32_t) exp ) {
73 if ( exp < 0 ) {
74 /*----------------------------------------------------------------
75 *----------------------------------------------------------------*/
76 isTiny =
79 || (exp < -1)
80 || ! doIncrement
82 sig64,
83 sig0,
84 UINT64_C( 0x0001FFFFFFFFFFFF ),
85 UINT64_C( 0xFFFFFFFFFFFFFFFF )
86 );
87 sig128Extra =
88 softfloat_shiftRightJam128Extra( sig64, sig0, sigExtra, -exp );
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
99 && (roundingMode != softfloat_round_near_maxMag)
100 ) {
101 doIncrement =
102 (roundingMode
104 && sigExtra;
105 }
106 } else if (
107 (0x7FFD < exp)
108 || ((exp == 0x7FFD)
109 && softfloat_eq128(
110 sig64,
111 sig0,
112 UINT64_C( 0x0001FFFFFFFFFFFF ),
113 UINT64_C( 0xFFFFFFFFFFFFFFFF )
114 )
115 && doIncrement)
116 ) {
117 /*----------------------------------------------------------------
118 *----------------------------------------------------------------*/
121 if (
122 roundNearEven
123 || (roundingMode == softfloat_round_near_maxMag)
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
143 if ( roundingMode == softfloat_round_odd ) {
144 sig0 |= 1;
145 goto packReturn;
146 }
147#endif
148 }
149 if ( doIncrement ) {
150 sig128 = softfloat_add128( sig64, sig0, 0, 1 );
151 sig64 = sig128.v64;
152 sig0 =
153 sig128.v0
154 & ~(uint64_t)
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_inexact
Definition softfloat.h:85
@ softfloat_flag_underflow
Definition softfloat.h:86
@ softfloat_flag_overflow
Definition softfloat.h:87
THREAD_LOCAL uint_fast8_t softfloat_exceptionFlags
THREAD_LOCAL uint_fast8_t softfloat_detectTininess
@ 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
@ softfloat_tininess_beforeRounding
Definition softfloat.h:62
struct uint128 softfloat_add128(uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0)
Definition s_add128.c:44
bool softfloat_eq128(uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0)
Definition s_eq128.c:43
bool softfloat_lt128(uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0)
Definition s_lt128.c:43
struct uint128_extra softfloat_shiftRightJam128Extra(uint64_t a64, uint64_t a0, uint64_t extra, uint_fast32_t dist)
unsigned int uint32_t
Definition stdint.h:126
uint64_t uint_fast64_t
Definition stdint.h:157
#define UINT64_C(val)
Definition stdint.h:284
uint8_t uint_fast8_t
Definition stdint.h:154
unsigned __int64 uint64_t
Definition stdint.h:136
Here is the call graph for this function:
Here is the caller graph for this function: