Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
extF80_mul.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_mul.c:

Go to the source code of this file.

Functions

extFloat80_t extF80_mul (extFloat80_t a, extFloat80_t b)
 

Function Documentation

◆ extF80_mul()

extFloat80_t extF80_mul ( extFloat80_t a,
extFloat80_t b )

Definition at line 44 of file extF80_mul.c.

45{
46 union { struct extFloat80M s; extFloat80_t f; } uA;
47 uint_fast16_t uiA64;
48 uint_fast64_t uiA0;
49 bool signA;
50 int_fast32_t expA;
51 uint_fast64_t sigA;
52 union { struct extFloat80M s; extFloat80_t f; } uB;
53 uint_fast16_t uiB64;
54 uint_fast64_t uiB0;
55 bool signB;
56 int_fast32_t expB;
57 uint_fast64_t sigB;
58 bool signZ;
59 uint_fast64_t magBits;
60 struct exp32_sig64 normExpSig;
61 int_fast32_t expZ;
62 struct uint128 sig128Z, uiZ;
63 uint_fast16_t uiZ64;
64 uint_fast64_t uiZ0;
65 union { struct extFloat80M s; extFloat80_t f; } uZ;
66
67 /*------------------------------------------------------------------------
68 *------------------------------------------------------------------------*/
69 uA.f = a;
70 uiA64 = uA.s.signExp;
71 uiA0 = uA.s.signif;
72 signA = signExtF80UI64( uiA64 );
73 expA = expExtF80UI64( uiA64 );
74 sigA = uiA0;
75 uB.f = b;
76 uiB64 = uB.s.signExp;
77 uiB0 = uB.s.signif;
78 signB = signExtF80UI64( uiB64 );
79 expB = expExtF80UI64( uiB64 );
80 sigB = uiB0;
81 signZ = signA ^ signB;
82 /*------------------------------------------------------------------------
83 *------------------------------------------------------------------------*/
84 if ( expA == 0x7FFF ) {
85 if (
86 (sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
87 || ((expB == 0x7FFF) && (sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
88 ) {
89 goto propagateNaN;
90 }
91 magBits = expB | sigB;
92 goto infArg;
93 }
94 if ( expB == 0x7FFF ) {
95 if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
96 magBits = expA | sigA;
97 goto infArg;
98 }
99 /*------------------------------------------------------------------------
100 *------------------------------------------------------------------------*/
101 if ( ! expA ) expA = 1;
102 if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
103 if ( ! sigA ) goto zero;
104 normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
105 expA += normExpSig.exp;
106 sigA = normExpSig.sig;
107 }
108 if ( ! expB ) expB = 1;
109 if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
110 if ( ! sigB ) goto zero;
111 normExpSig = softfloat_normSubnormalExtF80Sig( sigB );
112 expB += normExpSig.exp;
113 sigB = normExpSig.sig;
114 }
115 /*------------------------------------------------------------------------
116 *------------------------------------------------------------------------*/
117 expZ = expA + expB - 0x3FFE;
118 sig128Z = softfloat_mul64To128( sigA, sigB );
119 if ( sig128Z.v64 < UINT64_C( 0x8000000000000000 ) ) {
120 --expZ;
121 sig128Z =
123 sig128Z.v64, sig128Z.v0, sig128Z.v64, sig128Z.v0 );
124 }
125 return
127 signZ, expZ, sig128Z.v64, sig128Z.v0, extF80_roundingPrecision );
128 /*------------------------------------------------------------------------
129 *------------------------------------------------------------------------*/
130 propagateNaN:
131 uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
132 uiZ64 = uiZ.v64;
133 uiZ0 = uiZ.v0;
134 goto uiZ;
135 /*------------------------------------------------------------------------
136 *------------------------------------------------------------------------*/
137 infArg:
138 if ( ! magBits ) {
140 uiZ64 = defaultNaNExtF80UI64;
141 uiZ0 = defaultNaNExtF80UI0;
142 } else {
143 uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
144 uiZ0 = UINT64_C( 0x8000000000000000 );
145 }
146 goto uiZ;
147 /*------------------------------------------------------------------------
148 *------------------------------------------------------------------------*/
149 zero:
150 uiZ64 = packToExtF80UI64( signZ, 0 );
151 uiZ0 = 0;
152 uiZ:
153 uZ.s.signExp = uiZ64;
154 uZ.s.signif = uiZ0;
155 return uZ.f;
156
157}
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)
void softfloat_raiseFlags(uint_fast8_t flags)
#define defaultNaNExtF80UI0
Definition specialize.h:194
#define defaultNaNExtF80UI64
Definition specialize.h:193
#define packToExtF80UI64(sign, exp)
Definition internals.h:148
#define expExtF80UI64(a64)
Definition internals.h:147
#define signExtF80UI64(a64)
Definition internals.h:146
THREAD_LOCAL uint_fast8_t extF80_roundingPrecision
@ softfloat_flag_invalid
Definition softfloat.h:89
struct uint128 softfloat_add128(uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0)
Definition s_add128.c:44
struct uint128 softfloat_mul64To128(uint64_t a, uint64_t b)
struct exp32_sig64 softfloat_normSubnormalExtF80Sig(uint_fast64_t sig)
extFloat80_t softfloat_roundPackToExtF80(bool sign, int_fast32_t exp, uint_fast64_t sig, uint_fast64_t sigExtra, uint_fast8_t roundingPrecision)
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
uint16_t signExp
char * s
Here is the call graph for this function: