110d565efSmrg /* Software floating-point emulation.
210d565efSmrg    Definitions for IEEE Double Precision
3*ec02198aSmrg    Copyright (C) 1997-2019 Free Software Foundation, Inc.
410d565efSmrg    This file is part of the GNU C Library.
510d565efSmrg    Contributed by Richard Henderson (rth@cygnus.com),
610d565efSmrg 		  Jakub Jelinek (jj@ultra.linux.cz),
710d565efSmrg 		  David S. Miller (davem@redhat.com) and
810d565efSmrg 		  Peter Maydell (pmaydell@chiark.greenend.org.uk).
910d565efSmrg 
1010d565efSmrg    The GNU C Library is free software; you can redistribute it and/or
1110d565efSmrg    modify it under the terms of the GNU Lesser General Public
1210d565efSmrg    License as published by the Free Software Foundation; either
1310d565efSmrg    version 2.1 of the License, or (at your option) any later version.
1410d565efSmrg 
1510d565efSmrg    In addition to the permissions in the GNU Lesser General Public
1610d565efSmrg    License, the Free Software Foundation gives you unlimited
1710d565efSmrg    permission to link the compiled version of this file into
1810d565efSmrg    combinations with other programs, and to distribute those
1910d565efSmrg    combinations without any restriction coming from the use of this
2010d565efSmrg    file.  (The Lesser General Public License restrictions do apply in
2110d565efSmrg    other respects; for example, they cover modification of the file,
2210d565efSmrg    and distribution when not linked into a combine executable.)
2310d565efSmrg 
2410d565efSmrg    The GNU C Library is distributed in the hope that it will be useful,
2510d565efSmrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
2610d565efSmrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
2710d565efSmrg    Lesser General Public License for more details.
2810d565efSmrg 
2910d565efSmrg    You should have received a copy of the GNU Lesser General Public
3010d565efSmrg    License along with the GNU C Library; if not, see
3110d565efSmrg    <http://www.gnu.org/licenses/>.  */
3210d565efSmrg 
3310d565efSmrg #ifndef SOFT_FP_DOUBLE_H
3410d565efSmrg #define SOFT_FP_DOUBLE_H	1
3510d565efSmrg 
3610d565efSmrg #if _FP_W_TYPE_SIZE < 32
3710d565efSmrg # error "Here's a nickel kid.  Go buy yourself a real computer."
3810d565efSmrg #endif
3910d565efSmrg 
4010d565efSmrg #if _FP_W_TYPE_SIZE < 64
4110d565efSmrg # define _FP_FRACTBITS_D	(2 * _FP_W_TYPE_SIZE)
4210d565efSmrg # define _FP_FRACTBITS_DW_D	(4 * _FP_W_TYPE_SIZE)
4310d565efSmrg #else
4410d565efSmrg # define _FP_FRACTBITS_D	_FP_W_TYPE_SIZE
4510d565efSmrg # define _FP_FRACTBITS_DW_D	(2 * _FP_W_TYPE_SIZE)
4610d565efSmrg #endif
4710d565efSmrg 
4810d565efSmrg #define _FP_FRACBITS_D		53
4910d565efSmrg #define _FP_FRACXBITS_D		(_FP_FRACTBITS_D - _FP_FRACBITS_D)
5010d565efSmrg #define _FP_WFRACBITS_D		(_FP_WORKBITS + _FP_FRACBITS_D)
5110d565efSmrg #define _FP_WFRACXBITS_D	(_FP_FRACTBITS_D - _FP_WFRACBITS_D)
5210d565efSmrg #define _FP_EXPBITS_D		11
5310d565efSmrg #define _FP_EXPBIAS_D		1023
5410d565efSmrg #define _FP_EXPMAX_D		2047
5510d565efSmrg 
5610d565efSmrg #define _FP_QNANBIT_D		\
5710d565efSmrg 	((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
5810d565efSmrg #define _FP_QNANBIT_SH_D		\
5910d565efSmrg 	((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
6010d565efSmrg #define _FP_IMPLBIT_D		\
6110d565efSmrg 	((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
6210d565efSmrg #define _FP_IMPLBIT_SH_D		\
6310d565efSmrg 	((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
6410d565efSmrg #define _FP_OVERFLOW_D		\
6510d565efSmrg 	((_FP_W_TYPE) 1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
6610d565efSmrg 
6710d565efSmrg #define _FP_WFRACBITS_DW_D	(2 * _FP_WFRACBITS_D)
6810d565efSmrg #define _FP_WFRACXBITS_DW_D	(_FP_FRACTBITS_DW_D - _FP_WFRACBITS_DW_D)
6910d565efSmrg #define _FP_HIGHBIT_DW_D	\
7010d565efSmrg   ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_D - 1) % _FP_W_TYPE_SIZE)
7110d565efSmrg 
7210d565efSmrg typedef float DFtype __attribute__ ((mode (DF)));
7310d565efSmrg 
7410d565efSmrg #if _FP_W_TYPE_SIZE < 64
7510d565efSmrg 
7610d565efSmrg union _FP_UNION_D
7710d565efSmrg {
7810d565efSmrg   DFtype flt;
7910d565efSmrg   struct _FP_STRUCT_LAYOUT
8010d565efSmrg   {
8110d565efSmrg # if __BYTE_ORDER == __BIG_ENDIAN
8210d565efSmrg     unsigned sign  : 1;
8310d565efSmrg     unsigned exp   : _FP_EXPBITS_D;
8410d565efSmrg     unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
8510d565efSmrg     unsigned frac0 : _FP_W_TYPE_SIZE;
8610d565efSmrg # else
8710d565efSmrg     unsigned frac0 : _FP_W_TYPE_SIZE;
8810d565efSmrg     unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
8910d565efSmrg     unsigned exp   : _FP_EXPBITS_D;
9010d565efSmrg     unsigned sign  : 1;
9110d565efSmrg # endif
920fc04c29Smrg   } bits;
9310d565efSmrg };
9410d565efSmrg 
9510d565efSmrg # define FP_DECL_D(X)		_FP_DECL (2, X)
9610d565efSmrg # define FP_UNPACK_RAW_D(X, val)	_FP_UNPACK_RAW_2 (D, X, (val))
9710d565efSmrg # define FP_UNPACK_RAW_DP(X, val)	_FP_UNPACK_RAW_2_P (D, X, (val))
9810d565efSmrg # define FP_PACK_RAW_D(val, X)	_FP_PACK_RAW_2 (D, (val), X)
9910d565efSmrg # define FP_PACK_RAW_DP(val, X)			\
10010d565efSmrg   do						\
10110d565efSmrg     {						\
10210d565efSmrg       if (!FP_INHIBIT_RESULTS)			\
10310d565efSmrg 	_FP_PACK_RAW_2_P (D, (val), X);		\
10410d565efSmrg     }						\
10510d565efSmrg   while (0)
10610d565efSmrg 
10710d565efSmrg # define FP_UNPACK_D(X, val)			\
10810d565efSmrg   do						\
10910d565efSmrg     {						\
11010d565efSmrg       _FP_UNPACK_RAW_2 (D, X, (val));		\
11110d565efSmrg       _FP_UNPACK_CANONICAL (D, 2, X);		\
11210d565efSmrg     }						\
11310d565efSmrg   while (0)
11410d565efSmrg 
11510d565efSmrg # define FP_UNPACK_DP(X, val)			\
11610d565efSmrg   do						\
11710d565efSmrg     {						\
11810d565efSmrg       _FP_UNPACK_RAW_2_P (D, X, (val));		\
11910d565efSmrg       _FP_UNPACK_CANONICAL (D, 2, X);		\
12010d565efSmrg     }						\
12110d565efSmrg   while (0)
12210d565efSmrg 
12310d565efSmrg # define FP_UNPACK_SEMIRAW_D(X, val)		\
12410d565efSmrg   do						\
12510d565efSmrg     {						\
12610d565efSmrg       _FP_UNPACK_RAW_2 (D, X, (val));		\
12710d565efSmrg       _FP_UNPACK_SEMIRAW (D, 2, X);		\
12810d565efSmrg     }						\
12910d565efSmrg   while (0)
13010d565efSmrg 
13110d565efSmrg # define FP_UNPACK_SEMIRAW_DP(X, val)		\
13210d565efSmrg   do						\
13310d565efSmrg     {						\
13410d565efSmrg       _FP_UNPACK_RAW_2_P (D, X, (val));		\
13510d565efSmrg       _FP_UNPACK_SEMIRAW (D, 2, X);		\
13610d565efSmrg     }						\
13710d565efSmrg   while (0)
13810d565efSmrg 
13910d565efSmrg # define FP_PACK_D(val, X)			\
14010d565efSmrg   do						\
14110d565efSmrg     {						\
14210d565efSmrg       _FP_PACK_CANONICAL (D, 2, X);		\
14310d565efSmrg       _FP_PACK_RAW_2 (D, (val), X);		\
14410d565efSmrg     }						\
14510d565efSmrg   while (0)
14610d565efSmrg 
14710d565efSmrg # define FP_PACK_DP(val, X)			\
14810d565efSmrg   do						\
14910d565efSmrg     {						\
15010d565efSmrg       _FP_PACK_CANONICAL (D, 2, X);		\
15110d565efSmrg       if (!FP_INHIBIT_RESULTS)			\
15210d565efSmrg 	_FP_PACK_RAW_2_P (D, (val), X);		\
15310d565efSmrg     }						\
15410d565efSmrg   while (0)
15510d565efSmrg 
15610d565efSmrg # define FP_PACK_SEMIRAW_D(val, X)		\
15710d565efSmrg   do						\
15810d565efSmrg     {						\
15910d565efSmrg       _FP_PACK_SEMIRAW (D, 2, X);		\
16010d565efSmrg       _FP_PACK_RAW_2 (D, (val), X);		\
16110d565efSmrg     }						\
16210d565efSmrg   while (0)
16310d565efSmrg 
16410d565efSmrg # define FP_PACK_SEMIRAW_DP(val, X)		\
16510d565efSmrg   do						\
16610d565efSmrg     {						\
16710d565efSmrg       _FP_PACK_SEMIRAW (D, 2, X);		\
16810d565efSmrg       if (!FP_INHIBIT_RESULTS)			\
16910d565efSmrg 	_FP_PACK_RAW_2_P (D, (val), X);		\
17010d565efSmrg     }						\
17110d565efSmrg   while (0)
17210d565efSmrg 
17310d565efSmrg # define FP_ISSIGNAN_D(X)		_FP_ISSIGNAN (D, 2, X)
17410d565efSmrg # define FP_NEG_D(R, X)			_FP_NEG (D, 2, R, X)
17510d565efSmrg # define FP_ADD_D(R, X, Y)		_FP_ADD (D, 2, R, X, Y)
17610d565efSmrg # define FP_SUB_D(R, X, Y)		_FP_SUB (D, 2, R, X, Y)
17710d565efSmrg # define FP_MUL_D(R, X, Y)		_FP_MUL (D, 2, R, X, Y)
17810d565efSmrg # define FP_DIV_D(R, X, Y)		_FP_DIV (D, 2, R, X, Y)
17910d565efSmrg # define FP_SQRT_D(R, X)		_FP_SQRT (D, 2, R, X)
18010d565efSmrg # define _FP_SQRT_MEAT_D(R, S, T, X, Q)	_FP_SQRT_MEAT_2 (R, S, T, X, (Q))
18110d565efSmrg # define FP_FMA_D(R, X, Y, Z)		_FP_FMA (D, 2, 4, R, X, Y, Z)
18210d565efSmrg 
18310d565efSmrg # define FP_CMP_D(r, X, Y, un, ex)	_FP_CMP (D, 2, (r), X, Y, (un), (ex))
18410d565efSmrg # define FP_CMP_EQ_D(r, X, Y, ex)	_FP_CMP_EQ (D, 2, (r), X, Y, (ex))
18510d565efSmrg # define FP_CMP_UNORD_D(r, X, Y, ex)	_FP_CMP_UNORD (D, 2, (r), X, Y, (ex))
18610d565efSmrg 
18710d565efSmrg # define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 2, (r), X, (rsz), (rsg))
18810d565efSmrg # define FP_TO_INT_ROUND_D(r, X, rsz, rsg)	\
18910d565efSmrg   _FP_TO_INT_ROUND (D, 2, (r), X, (rsz), (rsg))
19010d565efSmrg # define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 2, X, (r), (rs), rt)
19110d565efSmrg 
19210d565efSmrg # define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_2 (X)
19310d565efSmrg # define _FP_FRAC_HIGH_RAW_D(X)	_FP_FRAC_HIGH_2 (X)
19410d565efSmrg 
19510d565efSmrg # define _FP_FRAC_HIGH_DW_D(X)	_FP_FRAC_HIGH_4 (X)
19610d565efSmrg 
19710d565efSmrg #else
19810d565efSmrg 
19910d565efSmrg union _FP_UNION_D
20010d565efSmrg {
20110d565efSmrg   DFtype flt;
20210d565efSmrg   struct _FP_STRUCT_LAYOUT
20310d565efSmrg   {
20410d565efSmrg # if __BYTE_ORDER == __BIG_ENDIAN
20510d565efSmrg     unsigned sign   : 1;
20610d565efSmrg     unsigned exp    : _FP_EXPBITS_D;
20710d565efSmrg     _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
20810d565efSmrg # else
20910d565efSmrg     _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
21010d565efSmrg     unsigned exp    : _FP_EXPBITS_D;
21110d565efSmrg     unsigned sign   : 1;
21210d565efSmrg # endif
2130fc04c29Smrg   } bits;
21410d565efSmrg };
21510d565efSmrg 
21610d565efSmrg # define FP_DECL_D(X)		_FP_DECL (1, X)
21710d565efSmrg # define FP_UNPACK_RAW_D(X, val)	_FP_UNPACK_RAW_1 (D, X, (val))
21810d565efSmrg # define FP_UNPACK_RAW_DP(X, val)	_FP_UNPACK_RAW_1_P (D, X, (val))
21910d565efSmrg # define FP_PACK_RAW_D(val, X)	_FP_PACK_RAW_1 (D, (val), X)
22010d565efSmrg # define FP_PACK_RAW_DP(val, X)			\
22110d565efSmrg   do						\
22210d565efSmrg     {						\
22310d565efSmrg       if (!FP_INHIBIT_RESULTS)			\
22410d565efSmrg 	_FP_PACK_RAW_1_P (D, (val), X);		\
22510d565efSmrg     }						\
22610d565efSmrg   while (0)
22710d565efSmrg 
22810d565efSmrg # define FP_UNPACK_D(X, val)			\
22910d565efSmrg   do						\
23010d565efSmrg     {						\
23110d565efSmrg       _FP_UNPACK_RAW_1 (D, X, (val));		\
23210d565efSmrg       _FP_UNPACK_CANONICAL (D, 1, X);		\
23310d565efSmrg     }						\
23410d565efSmrg   while (0)
23510d565efSmrg 
23610d565efSmrg # define FP_UNPACK_DP(X, val)			\
23710d565efSmrg   do						\
23810d565efSmrg     {						\
23910d565efSmrg       _FP_UNPACK_RAW_1_P (D, X, (val));		\
24010d565efSmrg       _FP_UNPACK_CANONICAL (D, 1, X);		\
24110d565efSmrg     }						\
24210d565efSmrg   while (0)
24310d565efSmrg 
24410d565efSmrg # define FP_UNPACK_SEMIRAW_D(X, val)		\
24510d565efSmrg   do						\
24610d565efSmrg     {						\
24710d565efSmrg       _FP_UNPACK_RAW_1 (D, X, (val));		\
24810d565efSmrg       _FP_UNPACK_SEMIRAW (D, 1, X);		\
24910d565efSmrg     }						\
25010d565efSmrg   while (0)
25110d565efSmrg 
25210d565efSmrg # define FP_UNPACK_SEMIRAW_DP(X, val)		\
25310d565efSmrg   do						\
25410d565efSmrg     {						\
25510d565efSmrg       _FP_UNPACK_RAW_1_P (D, X, (val));		\
25610d565efSmrg       _FP_UNPACK_SEMIRAW (D, 1, X);		\
25710d565efSmrg     }						\
25810d565efSmrg   while (0)
25910d565efSmrg 
26010d565efSmrg # define FP_PACK_D(val, X)			\
26110d565efSmrg   do						\
26210d565efSmrg     {						\
26310d565efSmrg       _FP_PACK_CANONICAL (D, 1, X);		\
26410d565efSmrg       _FP_PACK_RAW_1 (D, (val), X);		\
26510d565efSmrg     }						\
26610d565efSmrg   while (0)
26710d565efSmrg 
26810d565efSmrg # define FP_PACK_DP(val, X)			\
26910d565efSmrg   do						\
27010d565efSmrg     {						\
27110d565efSmrg       _FP_PACK_CANONICAL (D, 1, X);		\
27210d565efSmrg       if (!FP_INHIBIT_RESULTS)			\
27310d565efSmrg 	_FP_PACK_RAW_1_P (D, (val), X);		\
27410d565efSmrg     }						\
27510d565efSmrg   while (0)
27610d565efSmrg 
27710d565efSmrg # define FP_PACK_SEMIRAW_D(val, X)		\
27810d565efSmrg   do						\
27910d565efSmrg     {						\
28010d565efSmrg       _FP_PACK_SEMIRAW (D, 1, X);		\
28110d565efSmrg       _FP_PACK_RAW_1 (D, (val), X);		\
28210d565efSmrg     }						\
28310d565efSmrg   while (0)
28410d565efSmrg 
28510d565efSmrg # define FP_PACK_SEMIRAW_DP(val, X)		\
28610d565efSmrg   do						\
28710d565efSmrg     {						\
28810d565efSmrg       _FP_PACK_SEMIRAW (D, 1, X);		\
28910d565efSmrg       if (!FP_INHIBIT_RESULTS)			\
29010d565efSmrg 	_FP_PACK_RAW_1_P (D, (val), X);		\
29110d565efSmrg     }						\
29210d565efSmrg   while (0)
29310d565efSmrg 
29410d565efSmrg # define FP_ISSIGNAN_D(X)		_FP_ISSIGNAN (D, 1, X)
29510d565efSmrg # define FP_NEG_D(R, X)			_FP_NEG (D, 1, R, X)
29610d565efSmrg # define FP_ADD_D(R, X, Y)		_FP_ADD (D, 1, R, X, Y)
29710d565efSmrg # define FP_SUB_D(R, X, Y)		_FP_SUB (D, 1, R, X, Y)
29810d565efSmrg # define FP_MUL_D(R, X, Y)		_FP_MUL (D, 1, R, X, Y)
29910d565efSmrg # define FP_DIV_D(R, X, Y)		_FP_DIV (D, 1, R, X, Y)
30010d565efSmrg # define FP_SQRT_D(R, X)		_FP_SQRT (D, 1, R, X)
30110d565efSmrg # define _FP_SQRT_MEAT_D(R, S, T, X, Q)	_FP_SQRT_MEAT_1 (R, S, T, X, (Q))
30210d565efSmrg # define FP_FMA_D(R, X, Y, Z)		_FP_FMA (D, 1, 2, R, X, Y, Z)
30310d565efSmrg 
30410d565efSmrg /* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
30510d565efSmrg    the target machine.  */
30610d565efSmrg 
30710d565efSmrg # define FP_CMP_D(r, X, Y, un, ex)	_FP_CMP (D, 1, (r), X, Y, (un), (ex))
30810d565efSmrg # define FP_CMP_EQ_D(r, X, Y, ex)	_FP_CMP_EQ (D, 1, (r), X, Y, (ex))
30910d565efSmrg # define FP_CMP_UNORD_D(r, X, Y, ex)	_FP_CMP_UNORD (D, 1, (r), X, Y, (ex))
31010d565efSmrg 
31110d565efSmrg # define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 1, (r), X, (rsz), (rsg))
31210d565efSmrg # define FP_TO_INT_ROUND_D(r, X, rsz, rsg)	\
31310d565efSmrg   _FP_TO_INT_ROUND (D, 1, (r), X, (rsz), (rsg))
31410d565efSmrg # define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 1, X, (r), (rs), rt)
31510d565efSmrg 
31610d565efSmrg # define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_1 (X)
31710d565efSmrg # define _FP_FRAC_HIGH_RAW_D(X)	_FP_FRAC_HIGH_1 (X)
31810d565efSmrg 
31910d565efSmrg # define _FP_FRAC_HIGH_DW_D(X)	_FP_FRAC_HIGH_2 (X)
32010d565efSmrg 
32110d565efSmrg #endif /* W_TYPE_SIZE < 64 */
32210d565efSmrg 
32310d565efSmrg #endif /* !SOFT_FP_DOUBLE_H */
324