5 #include "primitives.h"
7 #include "specialize.h"
11 softfloat_subMagsF64( uint_fast64_t uiA
, uint_fast64_t uiB
, bool signZ
)
23 expA
= expF64UI( uiA
);
24 sigA
= fracF64UI( uiA
);
25 expB
= expF64UI( uiB
);
26 sigB
= fracF64UI( uiB
);
27 expDiff
= expA
- expB
;
30 if ( 0 < expDiff
) goto expABigger
;
31 if ( expDiff
< 0 ) goto expBBigger
;
32 if ( expA
== 0x7FF ) {
33 if ( sigA
| sigB
) goto propagateNaN
;
34 softfloat_raiseFlags( softfloat_flag_invalid
);
35 uiZ
= defaultNaNF64UI
;
42 if ( sigB
< sigA
) goto aBigger
;
43 if ( sigA
< sigB
) goto bBigger
;
44 uiZ
= packToF64UI( softfloat_roundingMode
== softfloat_round_min
, 0, 0 );
47 if ( expB
== 0x7FF ) {
48 if ( sigB
) goto propagateNaN
;
49 uiZ
= packToF64UI( signZ
^ 1, 0x7FF, 0 );
52 sigA
+= expA
? UINT64_C( 0x4000000000000000 ) : sigA
;
53 sigA
= softfloat_shift64RightJam( sigA
, - expDiff
);
54 sigB
|= UINT64_C( 0x4000000000000000 );
61 if ( expA
== 0x7FF ) {
62 if ( sigA
) goto propagateNaN
;
66 sigB
+= expB
? UINT64_C( 0x4000000000000000 ) : sigB
;
67 sigB
= softfloat_shift64RightJam( sigB
, expDiff
);
68 sigA
|= UINT64_C( 0x4000000000000000 );
73 return softfloat_normRoundPackToF64( signZ
, expZ
- 1, sigZ
);
75 uiZ
= softfloat_propagateNaNF64UI( uiA
, uiB
);