5 #include "primitives.h"
7 #include "specialize.h"
11 softfloat_subMagsF32( uint_fast32_t uiA
, uint_fast32_t uiB
, bool signZ
)
23 expA
= expF32UI( uiA
);
24 sigA
= fracF32UI( uiA
);
25 expB
= expF32UI( uiB
);
26 sigB
= fracF32UI( uiB
);
27 expDiff
= expA
- expB
;
30 if ( 0 < expDiff
) goto expABigger
;
31 if ( expDiff
< 0 ) goto expBBigger
;
33 if ( sigA
| sigB
) goto propagateNaN
;
34 softfloat_raiseFlags( softfloat_flag_invalid
);
35 uiZ
= defaultNaNF32UI
;
42 if ( sigB
< sigA
) goto aBigger
;
43 if ( sigA
< sigB
) goto bBigger
;
44 uiZ
= packToF32UI( softfloat_roundingMode
== softfloat_round_min
, 0, 0 );
48 if ( sigB
) goto propagateNaN
;
49 uiZ
= packToF32UI( signZ
^ 1, 0xFF, 0 );
52 sigA
+= expA
? 0x40000000 : sigA
;
53 sigA
= softfloat_shift32RightJam( sigA
, - expDiff
);
62 if ( sigA
) goto propagateNaN
;
66 sigB
+= expB
? 0x40000000 : sigB
;
67 sigB
= softfloat_shift32RightJam( sigB
, expDiff
);
73 return softfloat_normRoundPackToF32( signZ
, expZ
- 1, sigZ
);
75 uiZ
= softfloat_propagateNaNF32UI( uiA
, uiB
);