5 #include "primitives.h"
7 #include "specialize.h"
10 float64_t
f64_mul( float64_t a
, float64_t b
)
23 uint_fast64_t magBits
;
24 struct exp16_sig64 normExpSig
;
26 struct uint128 sigZ128
;
27 uint_fast64_t sigZ
, uiZ
;
32 signA
= signF64UI( uiA
);
33 expA
= expF64UI( uiA
);
34 sigA
= fracF64UI( uiA
);
37 signB
= signF64UI( uiB
);
38 expB
= expF64UI( uiB
);
39 sigB
= fracF64UI( uiB
);
40 signZ
= signA
^ signB
;
41 if ( expA
== 0x7FF ) {
42 if ( sigA
|| ( ( expB
== 0x7FF ) && sigB
) ) goto propagateNaN
;
43 magBits
= expB
| sigB
;
46 if ( expB
== 0x7FF ) {
47 if ( sigB
) goto propagateNaN
;
48 magBits
= expA
| sigA
;
52 if ( ! sigA
) goto zero
;
53 normExpSig
= softfloat_normSubnormalF64Sig( sigA
);
54 expA
= normExpSig
.exp
;
55 sigA
= normExpSig
.sig
;
58 if ( ! sigB
) goto zero
;
59 normExpSig
= softfloat_normSubnormalF64Sig( sigB
);
60 expB
= normExpSig
.exp
;
61 sigB
= normExpSig
.sig
;
63 expZ
= expA
+ expB
- 0x3FF;
64 sigA
= ( sigA
| UINT64_C( 0x0010000000000000 ) )<<10;
65 sigB
= ( sigB
| UINT64_C( 0x0010000000000000 ) )<<11;
66 sigZ128
= softfloat_mul64To128( sigA
, sigB
);
67 sigZ
= sigZ128
.v64
| ( sigZ128
.v0
!= 0 );
68 if ( sigZ
< UINT64_C( 0x4000000000000000 ) ) {
72 return softfloat_roundPackToF64( signZ
, expZ
, sigZ
);
74 uiZ
= softfloat_propagateNaNF64UI( uiA
, uiB
);
78 softfloat_raiseFlags( softfloat_flag_invalid
);
79 uiZ
= defaultNaNF64UI
;
81 uiZ
= packToF64UI( signZ
, 0x7FF, 0 );
85 uiZ
= packToF64UI( signZ
, 0, 0 );