5 #include "primitives.h"
7 #include "specialize.h"
10 softfloat_addMagsF64( uint_fast64_t uiA
, uint_fast64_t uiB
, bool signZ
)
22 expA
= expF64UI( uiA
);
23 sigA
= fracF64UI( uiA
);
24 expB
= expF64UI( uiB
);
25 sigB
= fracF64UI( uiB
);
26 expDiff
= expA
- expB
;
30 if ( expA
== 0x7FF ) {
31 if ( sigA
| sigB
) goto propagateNaN
;
38 signZ
, 0, ( uiA
+ uiB
) & UINT64_C( 0x7FFFFFFFFFFFFFFF ) );
42 sigZ
= UINT64_C( 0x4000000000000000 ) + sigA
+ sigB
;
45 if ( expB
== 0x7FF ) {
46 if ( sigB
) goto propagateNaN
;
47 uiZ
= packToF64UI( signZ
, 0x7FF, 0 );
51 sigA
+= expA
? UINT64_C( 0x2000000000000000 ) : sigA
;
52 sigA
= softfloat_shift64RightJam( sigA
, - expDiff
);
54 if ( expA
== 0x7FF ) {
55 if ( sigA
) goto propagateNaN
;
60 sigB
+= expB
? UINT64_C( 0x2000000000000000 ) : sigB
;
61 sigB
= softfloat_shift64RightJam( sigB
, expDiff
);
63 sigZ
= UINT64_C( 0x2000000000000000 ) + sigA
+ sigB
;
64 if ( sigZ
< UINT64_C( 0x4000000000000000 ) ) {
69 return softfloat_roundPackToF64( signZ
, expZ
, sigZ
);
71 uiZ
= softfloat_propagateNaNF64UI( uiA
, uiB
);