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

Function softfloat_subMagsExtF80

lib/softfloat/source/s_subMagsExtF80.c:44–157  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

42#include "softfloat.h"
43
44extFloat80_t
45 softfloat_subMagsExtF80(
46 uint_fast16_t uiA64,
47 uint_fast64_t uiA0,
48 uint_fast16_t uiB64,
49 uint_fast64_t uiB0,
50 bool signZ
51 )
52{
53 int_fast32_t expA;
54 uint_fast64_t sigA;
55 int_fast32_t expB;
56 uint_fast64_t sigB;
57 int_fast32_t expDiff;
58 uint_fast16_t uiZ64;
59 uint_fast64_t uiZ0;
60 int_fast32_t expZ;
61 uint_fast64_t sigExtra;
62 struct uint128 sig128, uiZ;
63 union { struct extFloat80M s; extFloat80_t f; } uZ;
64
65 /*------------------------------------------------------------------------
66 *------------------------------------------------------------------------*/
67 expA = expExtF80UI64( uiA64 );
68 sigA = uiA0;
69 expB = expExtF80UI64( uiB64 );
70 sigB = uiB0;
71 /*------------------------------------------------------------------------
72 *------------------------------------------------------------------------*/
73 expDiff = expA - expB;
74 if ( 0 < expDiff ) goto expABigger;
75 if ( expDiff < 0 ) goto expBBigger;
76 if ( expA == 0x7FFF ) {
77 if ( (sigA | sigB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
78 goto propagateNaN;
79 }
80 softfloat_raiseFlags( softfloat_flag_invalid );
81 uiZ64 = defaultNaNExtF80UI64;
82 uiZ0 = defaultNaNExtF80UI0;
83 goto uiZ;
84 }
85 /*------------------------------------------------------------------------
86 *------------------------------------------------------------------------*/
87 expZ = expA;
88 if ( ! expZ ) expZ = 1;
89 sigExtra = 0;
90 if ( sigB < sigA ) goto aBigger;
91 if ( sigA < sigB ) goto bBigger;
92 uiZ64 =
93 packToExtF80UI64( (softfloat_roundingMode == softfloat_round_min), 0 );
94 uiZ0 = 0;
95 goto uiZ;
96 /*------------------------------------------------------------------------
97 *------------------------------------------------------------------------*/
98 expBBigger:
99 if ( expB == 0x7FFF ) {
100 if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
101 uiZ64 = packToExtF80UI64( signZ ^ 1, 0x7FFF );

Callers 2

extF80_addFunction · 0.85
extF80_subFunction · 0.85

Calls 5

softfloat_sub128Function · 0.70
softfloat_raiseFlagsFunction · 0.50

Tested by

no test coverage detected