5 #include "primitives.h"
7 #include "specialize.h"
10 float64_t
f64_div( float64_t a
, float64_t b
)
23 struct exp16_sig64 normExpSig
;
26 struct uint128 term
, rem
;
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
) goto propagateNaN
;
43 if ( expB
== 0x7FF ) {
44 if ( sigB
) goto propagateNaN
;
49 if ( expB
== 0x7FF ) {
50 if ( sigB
) goto propagateNaN
;
55 if ( ! ( expA
| sigA
) ) goto invalid
;
56 softfloat_raiseFlags( softfloat_flag_infinity
);
59 normExpSig
= softfloat_normSubnormalF64Sig( sigB
);
60 expB
= normExpSig
.exp
;
61 sigB
= normExpSig
.sig
;
64 if ( ! sigA
) goto zero
;
65 normExpSig
= softfloat_normSubnormalF64Sig( sigA
);
66 expA
= normExpSig
.exp
;
67 sigA
= normExpSig
.sig
;
69 expZ
= expA
- expB
+ 0x3FD;
70 sigA
= ( sigA
| UINT64_C( 0x0010000000000000 ) )<<10;
71 sigB
= ( sigB
| UINT64_C( 0x0010000000000000 ) )<<11;
72 if ( sigB
<= ( sigA
+ sigA
) ) {
76 sigZ
= softfloat_estimateDiv128To64( sigA
, 0, sigB
);
77 if ( ( sigZ
& 0x1FF ) <= 2 ) {
78 term
= softfloat_mul64To128( sigB
, sigZ
);
79 rem
= softfloat_sub128( sigA
, 0, term
.v64
, term
.v0
);
80 while ( UINT64_C( 0x8000000000000000 ) <= rem
.v64
) {
82 rem
= softfloat_add128( rem
.v64
, rem
.v0
, 0, sigB
);
84 sigZ
|= ( rem
.v0
!= 0 );
86 return softfloat_roundPackToF64( signZ
, expZ
, sigZ
);
88 uiZ
= softfloat_propagateNaNF64UI( uiA
, uiB
);
91 softfloat_raiseFlags( softfloat_flag_invalid
);
92 uiZ
= defaultNaNF64UI
;
95 uiZ
= packToF64UI( signZ
, 0x7FF, 0 );
98 uiZ
= packToF64UI( signZ
, 0, 0 );