Skip to content

Commit bd85811

Browse files
committed
Update SoftFloat
1 parent b86f2a5 commit bd85811

File tree

218 files changed

+11195
-1068
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

218 files changed

+11195
-1068
lines changed

softfloat/f128_add.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
2+
/*============================================================================
3+
4+
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
5+
Package, Release 3d, by John R. Hauser.
6+
7+
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
8+
All rights reserved.
9+
10+
Redistribution and use in source and binary forms, with or without
11+
modification, are permitted provided that the following conditions are met:
12+
13+
1. Redistributions of source code must retain the above copyright notice,
14+
this list of conditions, and the following disclaimer.
15+
16+
2. Redistributions in binary form must reproduce the above copyright notice,
17+
this list of conditions, and the following disclaimer in the documentation
18+
and/or other materials provided with the distribution.
19+
20+
3. Neither the name of the University nor the names of its contributors may
21+
be used to endorse or promote products derived from this software without
22+
specific prior written permission.
23+
24+
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
25+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
27+
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
28+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34+
35+
=============================================================================*/
36+
37+
#include <stdbool.h>
38+
#include <stdint.h>
39+
#include "platform.h"
40+
#include "internals.h"
41+
#include "softfloat.h"
42+
43+
float128_t f128_add( float128_t a, float128_t b )
44+
{
45+
union ui128_f128 uA;
46+
uint_fast64_t uiA64, uiA0;
47+
bool signA;
48+
union ui128_f128 uB;
49+
uint_fast64_t uiB64, uiB0;
50+
bool signB;
51+
#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
52+
float128_t
53+
(*magsFuncPtr)(
54+
uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );
55+
#endif
56+
57+
uA.f = a;
58+
uiA64 = uA.ui.v64;
59+
uiA0 = uA.ui.v0;
60+
signA = signF128UI64( uiA64 );
61+
uB.f = b;
62+
uiB64 = uB.ui.v64;
63+
uiB0 = uB.ui.v0;
64+
signB = signF128UI64( uiB64 );
65+
#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
66+
if ( signA == signB ) {
67+
return softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
68+
} else {
69+
return softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
70+
}
71+
#else
72+
magsFuncPtr =
73+
(signA == signB) ? softfloat_addMagsF128 : softfloat_subMagsF128;
74+
return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
75+
#endif
76+
77+
}
78+

softfloat/f128_classify.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
uint_fast16_t f128_classify( float128_t a )
10+
{
11+
union ui128_f128 uA;
12+
uint_fast64_t uiA64, uiA0;
13+
14+
uA.f = a;
15+
uiA64 = uA.ui.v64;
16+
uiA0 = uA.ui.v0;
17+
18+
uint_fast16_t infOrNaN = expF128UI64( uiA64 ) == 0x7FFF;
19+
uint_fast16_t subnormalOrZero = expF128UI64( uiA64 ) == 0;
20+
bool sign = signF128UI64( uiA64 );
21+
bool fracZero = fracF128UI64( uiA64 ) == 0 && uiA0 == 0;
22+
bool isNaN = isNaNF128UI( uiA64, uiA0 );
23+
bool isSNaN = softfloat_isSigNaNF128UI( uiA64, uiA0 );
24+
25+
return
26+
( sign && infOrNaN && fracZero ) << 0 |
27+
( sign && !infOrNaN && !subnormalOrZero ) << 1 |
28+
( sign && subnormalOrZero && !fracZero ) << 2 |
29+
( sign && subnormalOrZero && fracZero ) << 3 |
30+
( !sign && infOrNaN && fracZero ) << 7 |
31+
( !sign && !infOrNaN && !subnormalOrZero ) << 6 |
32+
( !sign && subnormalOrZero && !fracZero ) << 5 |
33+
( !sign && subnormalOrZero && fracZero ) << 4 |
34+
( isNaN && isSNaN ) << 8 |
35+
( isNaN && !isSNaN ) << 9;
36+
}
37+

softfloat/f128_div.c

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
2+
/*============================================================================
3+
4+
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
5+
Package, Release 3d, by John R. Hauser.
6+
7+
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
8+
All rights reserved.
9+
10+
Redistribution and use in source and binary forms, with or without
11+
modification, are permitted provided that the following conditions are met:
12+
13+
1. Redistributions of source code must retain the above copyright notice,
14+
this list of conditions, and the following disclaimer.
15+
16+
2. Redistributions in binary form must reproduce the above copyright notice,
17+
this list of conditions, and the following disclaimer in the documentation
18+
and/or other materials provided with the distribution.
19+
20+
3. Neither the name of the University nor the names of its contributors may
21+
be used to endorse or promote products derived from this software without
22+
specific prior written permission.
23+
24+
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
25+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
27+
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
28+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34+
35+
=============================================================================*/
36+
37+
#include <stdbool.h>
38+
#include <stdint.h>
39+
#include "platform.h"
40+
#include "internals.h"
41+
#include "specialize.h"
42+
#include "softfloat.h"
43+
44+
float128_t f128_div( float128_t a, float128_t b )
45+
{
46+
union ui128_f128 uA;
47+
uint_fast64_t uiA64, uiA0;
48+
bool signA;
49+
int_fast32_t expA;
50+
struct uint128 sigA;
51+
union ui128_f128 uB;
52+
uint_fast64_t uiB64, uiB0;
53+
bool signB;
54+
int_fast32_t expB;
55+
struct uint128 sigB;
56+
bool signZ;
57+
struct exp32_sig128 normExpSig;
58+
int_fast32_t expZ;
59+
struct uint128 rem;
60+
uint_fast32_t recip32;
61+
int ix;
62+
uint_fast64_t q64;
63+
uint_fast32_t q;
64+
struct uint128 term;
65+
uint_fast32_t qs[3];
66+
uint_fast64_t sigZExtra;
67+
struct uint128 sigZ, uiZ;
68+
union ui128_f128 uZ;
69+
70+
/*------------------------------------------------------------------------
71+
*------------------------------------------------------------------------*/
72+
uA.f = a;
73+
uiA64 = uA.ui.v64;
74+
uiA0 = uA.ui.v0;
75+
signA = signF128UI64( uiA64 );
76+
expA = expF128UI64( uiA64 );
77+
sigA.v64 = fracF128UI64( uiA64 );
78+
sigA.v0 = uiA0;
79+
uB.f = b;
80+
uiB64 = uB.ui.v64;
81+
uiB0 = uB.ui.v0;
82+
signB = signF128UI64( uiB64 );
83+
expB = expF128UI64( uiB64 );
84+
sigB.v64 = fracF128UI64( uiB64 );
85+
sigB.v0 = uiB0;
86+
signZ = signA ^ signB;
87+
/*------------------------------------------------------------------------
88+
*------------------------------------------------------------------------*/
89+
if ( expA == 0x7FFF ) {
90+
if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
91+
if ( expB == 0x7FFF ) {
92+
if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
93+
goto invalid;
94+
}
95+
goto infinity;
96+
}
97+
if ( expB == 0x7FFF ) {
98+
if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
99+
goto zero;
100+
}
101+
/*------------------------------------------------------------------------
102+
*------------------------------------------------------------------------*/
103+
if ( ! expB ) {
104+
if ( ! (sigB.v64 | sigB.v0) ) {
105+
if ( ! (expA | sigA.v64 | sigA.v0) ) goto invalid;
106+
softfloat_raiseFlags( softfloat_flag_infinite );
107+
goto infinity;
108+
}
109+
normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );
110+
expB = normExpSig.exp;
111+
sigB = normExpSig.sig;
112+
}
113+
if ( ! expA ) {
114+
if ( ! (sigA.v64 | sigA.v0) ) goto zero;
115+
normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );
116+
expA = normExpSig.exp;
117+
sigA = normExpSig.sig;
118+
}
119+
/*------------------------------------------------------------------------
120+
*------------------------------------------------------------------------*/
121+
expZ = expA - expB + 0x3FFE;
122+
sigA.v64 |= UINT64_C( 0x0001000000000000 );
123+
sigB.v64 |= UINT64_C( 0x0001000000000000 );
124+
rem = sigA;
125+
if ( softfloat_lt128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 ) ) {
126+
--expZ;
127+
rem = softfloat_add128( sigA.v64, sigA.v0, sigA.v64, sigA.v0 );
128+
}
129+
recip32 = softfloat_approxRecip32_1( sigB.v64>>17 );
130+
ix = 3;
131+
for (;;) {
132+
q64 = (uint_fast64_t) (uint32_t) (rem.v64>>19) * recip32;
133+
q = (q64 + 0x80000000)>>32;
134+
--ix;
135+
if ( ix < 0 ) break;
136+
rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
137+
term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
138+
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
139+
if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
140+
--q;
141+
rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
142+
}
143+
qs[ix] = q;
144+
}
145+
/*------------------------------------------------------------------------
146+
*------------------------------------------------------------------------*/
147+
if ( ((q + 1) & 7) < 2 ) {
148+
rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
149+
term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
150+
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
151+
if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
152+
--q;
153+
rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
154+
} else if ( softfloat_le128( sigB.v64, sigB.v0, rem.v64, rem.v0 ) ) {
155+
++q;
156+
rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
157+
}
158+
if ( rem.v64 | rem.v0 ) q |= 1;
159+
}
160+
/*------------------------------------------------------------------------
161+
*------------------------------------------------------------------------*/
162+
sigZExtra = (uint64_t) ((uint_fast64_t) q<<60);
163+
term = softfloat_shortShiftLeft128( 0, qs[1], 54 );
164+
sigZ =
165+
softfloat_add128(
166+
(uint_fast64_t) qs[2]<<19, ((uint_fast64_t) qs[0]<<25) + (q>>4),
167+
term.v64, term.v0
168+
);
169+
return
170+
softfloat_roundPackToF128( signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );
171+
/*------------------------------------------------------------------------
172+
*------------------------------------------------------------------------*/
173+
propagateNaN:
174+
uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
175+
goto uiZ;
176+
/*------------------------------------------------------------------------
177+
*------------------------------------------------------------------------*/
178+
invalid:
179+
softfloat_raiseFlags( softfloat_flag_invalid );
180+
uiZ.v64 = defaultNaNF128UI64;
181+
uiZ.v0 = defaultNaNF128UI0;
182+
goto uiZ;
183+
/*------------------------------------------------------------------------
184+
*------------------------------------------------------------------------*/
185+
infinity:
186+
uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );
187+
goto uiZ0;
188+
/*------------------------------------------------------------------------
189+
*------------------------------------------------------------------------*/
190+
zero:
191+
uiZ.v64 = packToF128UI64( signZ, 0, 0 );
192+
uiZ0:
193+
uiZ.v0 = 0;
194+
uiZ:
195+
uZ.ui = uiZ;
196+
return uZ.f;
197+
198+
}
199+

softfloat/f128_eq.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
2+
/*============================================================================
3+
4+
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
5+
Package, Release 3d, by John R. Hauser.
6+
7+
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
8+
All rights reserved.
9+
10+
Redistribution and use in source and binary forms, with or without
11+
modification, are permitted provided that the following conditions are met:
12+
13+
1. Redistributions of source code must retain the above copyright notice,
14+
this list of conditions, and the following disclaimer.
15+
16+
2. Redistributions in binary form must reproduce the above copyright notice,
17+
this list of conditions, and the following disclaimer in the documentation
18+
and/or other materials provided with the distribution.
19+
20+
3. Neither the name of the University nor the names of its contributors may
21+
be used to endorse or promote products derived from this software without
22+
specific prior written permission.
23+
24+
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
25+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
27+
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
28+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34+
35+
=============================================================================*/
36+
37+
#include <stdbool.h>
38+
#include <stdint.h>
39+
#include "platform.h"
40+
#include "internals.h"
41+
#include "specialize.h"
42+
#include "softfloat.h"
43+
44+
bool f128_eq( float128_t a, float128_t b )
45+
{
46+
union ui128_f128 uA;
47+
uint_fast64_t uiA64, uiA0;
48+
union ui128_f128 uB;
49+
uint_fast64_t uiB64, uiB0;
50+
51+
uA.f = a;
52+
uiA64 = uA.ui.v64;
53+
uiA0 = uA.ui.v0;
54+
uB.f = b;
55+
uiB64 = uB.ui.v64;
56+
uiB0 = uB.ui.v0;
57+
if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
58+
if (
59+
softfloat_isSigNaNF128UI( uiA64, uiA0 )
60+
|| softfloat_isSigNaNF128UI( uiB64, uiB0 )
61+
) {
62+
softfloat_raiseFlags( softfloat_flag_invalid );
63+
}
64+
return false;
65+
}
66+
return
67+
(uiA0 == uiB0)
68+
&& ( (uiA64 == uiB64)
69+
|| (! uiA0 && ! ((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
70+
);
71+
72+
}
73+

0 commit comments

Comments
 (0)