temporary undoing of renaming
[riscv-isa-sim.git] / softfloat / f32_div.c
1
2 #include <stdbool.h>
3 #include <stdint.h>
4 #include "platform.h"
5 #include "internals.h"
6 #include "specialize.h"
7 #include "softfloat.h"
8
9 float32_t f32_div( float32_t a, float32_t b )
10 {
11 union ui32_f32 uA;
12 uint_fast32_t uiA;
13 bool signA;
14 int_fast16_t expA;
15 uint_fast32_t sigA;
16 union ui32_f32 uB;
17 uint_fast32_t uiB;
18 bool signB;
19 int_fast16_t expB;
20 uint_fast32_t sigB;
21 bool signZ;
22 struct exp16_sig32 normExpSig;
23 int_fast16_t expZ;
24 uint_fast32_t sigZ;
25 uint_fast32_t uiZ;
26 union ui32_f32 uZ;
27
28 uA.f = a;
29 uiA = uA.ui;
30 signA = signF32UI( uiA );
31 expA = expF32UI( uiA );
32 sigA = fracF32UI( uiA );
33 uB.f = b;
34 uiB = uB.ui;
35 signB = signF32UI( uiB );
36 expB = expF32UI( uiB );
37 sigB = fracF32UI( uiB );
38 signZ = signA ^ signB;
39 if ( expA == 0xFF ) {
40 if ( sigA ) goto propagateNaN;
41 if ( expB == 0xFF ) {
42 if ( sigB ) goto propagateNaN;
43 goto invalid;
44 }
45 goto infinity;
46 }
47 if ( expB == 0xFF ) {
48 if ( sigB ) goto propagateNaN;
49 goto zero;
50 }
51 if ( ! expB ) {
52 if ( ! sigB ) {
53 if ( ! ( expA | sigA ) ) goto invalid;
54 softfloat_raiseFlags( softfloat_flag_infinity );
55 goto infinity;
56 }
57 normExpSig = softfloat_normSubnormalF32Sig( sigB );
58 expB = normExpSig.exp;
59 sigB = normExpSig.sig;
60 }
61 if ( ! expA ) {
62 if ( ! sigA ) goto zero;
63 normExpSig = softfloat_normSubnormalF32Sig( sigA );
64 expA = normExpSig.exp;
65 sigA = normExpSig.sig;
66 }
67 expZ = expA - expB + 0x7D;
68 sigA = ( sigA | 0x00800000 )<<7;
69 sigB = ( sigB | 0x00800000 )<<8;
70 if ( sigB <= ( sigA + sigA ) ) {
71 ++expZ;
72 sigA >>= 1;
73 }
74 sigZ = ( (uint_fast64_t) sigA<<32 ) / sigB;
75 if ( ! ( sigZ & 0x3F ) ) {
76 sigZ |= ( (uint_fast64_t) sigB * sigZ != (uint_fast64_t) sigA<<32 );
77 }
78 return softfloat_roundPackToF32( signZ, expZ, sigZ );
79 propagateNaN:
80 uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
81 goto uiZ;
82 invalid:
83 softfloat_raiseFlags( softfloat_flag_invalid );
84 uiZ = defaultNaNF32UI;
85 goto uiZ;
86 infinity:
87 uiZ = packToF32UI( signZ, 0xFF, 0 );
88 goto uiZ;
89 zero:
90 uiZ = packToF32UI( signZ, 0, 0 );
91 uiZ:
92 uZ.ui = uiZ;
93 return uZ.f;
94
95 }
96