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