MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / softfloat_roundPackToF64

Function softfloat_roundPackToF64

lib/softfloat/source/s_roundPackToF64.c:43–116  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

41#include "softfloat.h"
42
43float64_sf
44 softfloat_roundPackToF64( bool sign, int_fast16_t exp, uint_fast64_t sig )
45{
46 uint_fast8_t roundingMode;
47 bool roundNearEven;
48 uint_fast16_t roundIncrement, roundBits;
49 bool isTiny;
50 uint_fast64_t uiZ;
51 union ui64_f64 uZ;
52
53 /*------------------------------------------------------------------------
54 *------------------------------------------------------------------------*/
55 roundingMode = softfloat_roundingMode;
56 roundNearEven = (roundingMode == softfloat_round_near_even);
57 roundIncrement = 0x200;
58 if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
59 roundIncrement =
60 (roundingMode
61 == (sign ? softfloat_round_min : softfloat_round_max))
62 ? 0x3FF
63 : 0;
64 }
65 roundBits = sig & 0x3FF;
66 /*------------------------------------------------------------------------
67 *------------------------------------------------------------------------*/
68 if ( 0x7FD <= (uint16_t) exp ) {
69 if ( exp < 0 ) {
70 /*----------------------------------------------------------------
71 *----------------------------------------------------------------*/
72 isTiny =
73 (softfloat_detectTininess == softfloat_tininess_beforeRounding)
74 || (exp < -1)
75 || (sig + roundIncrement < UINT64_C( 0x8000000000000000 ));
76 sig = softfloat_shiftRightJam64( sig, -exp );
77 exp = 0;
78 roundBits = sig & 0x3FF;
79 if ( isTiny && roundBits ) {
80 softfloat_raiseFlags( softfloat_flag_underflow );
81 }
82 } else if (
83 (0x7FD < exp)
84 || (UINT64_C( 0x8000000000000000 ) <= sig + roundIncrement)
85 ) {
86 /*----------------------------------------------------------------
87 *----------------------------------------------------------------*/
88 softfloat_raiseFlags(
89 softfloat_flag_overflow | softfloat_flag_inexact );
90 uiZ = packToF64UI( sign, 0x7FF, 0 ) - ! roundIncrement;
91 goto uiZ;
92 }
93 }
94 /*------------------------------------------------------------------------
95 *------------------------------------------------------------------------*/
96 sig = (sig + roundIncrement)>>10;
97 if ( roundBits ) {
98 softfloat_exceptionFlags |= softfloat_flag_inexact;
99#ifdef SOFTFLOAT_ROUND_ODD
100 if ( roundingMode == softfloat_round_odd ) {

Callers 2

extF80_to_f64Function · 0.85

Calls 2

softfloat_raiseFlagsFunction · 0.50

Tested by

no test coverage detected