1*10d565efSmrg /* Software floating-point emulation. 2*10d565efSmrg Definitions for IEEE Double Precision 3*10d565efSmrg Copyright (C) 1997-2016 Free Software Foundation, Inc. 4*10d565efSmrg This file is part of the GNU C Library. 5*10d565efSmrg Contributed by Richard Henderson (rth@cygnus.com), 6*10d565efSmrg Jakub Jelinek (jj@ultra.linux.cz), 7*10d565efSmrg David S. Miller (davem@redhat.com) and 8*10d565efSmrg Peter Maydell (pmaydell@chiark.greenend.org.uk). 9*10d565efSmrg 10*10d565efSmrg The GNU C Library is free software; you can redistribute it and/or 11*10d565efSmrg modify it under the terms of the GNU Lesser General Public 12*10d565efSmrg License as published by the Free Software Foundation; either 13*10d565efSmrg version 2.1 of the License, or (at your option) any later version. 14*10d565efSmrg 15*10d565efSmrg In addition to the permissions in the GNU Lesser General Public 16*10d565efSmrg License, the Free Software Foundation gives you unlimited 17*10d565efSmrg permission to link the compiled version of this file into 18*10d565efSmrg combinations with other programs, and to distribute those 19*10d565efSmrg combinations without any restriction coming from the use of this 20*10d565efSmrg file. (The Lesser General Public License restrictions do apply in 21*10d565efSmrg other respects; for example, they cover modification of the file, 22*10d565efSmrg and distribution when not linked into a combine executable.) 23*10d565efSmrg 24*10d565efSmrg The GNU C Library is distributed in the hope that it will be useful, 25*10d565efSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of 26*10d565efSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 27*10d565efSmrg Lesser General Public License for more details. 28*10d565efSmrg 29*10d565efSmrg You should have received a copy of the GNU Lesser General Public 30*10d565efSmrg License along with the GNU C Library; if not, see 31*10d565efSmrg <http://www.gnu.org/licenses/>. */ 32*10d565efSmrg 33*10d565efSmrg #ifndef SOFT_FP_DOUBLE_H 34*10d565efSmrg #define SOFT_FP_DOUBLE_H 1 35*10d565efSmrg 36*10d565efSmrg #if _FP_W_TYPE_SIZE < 32 37*10d565efSmrg # error "Here's a nickel kid. Go buy yourself a real computer." 38*10d565efSmrg #endif 39*10d565efSmrg 40*10d565efSmrg #if _FP_W_TYPE_SIZE < 64 41*10d565efSmrg # define _FP_FRACTBITS_D (2 * _FP_W_TYPE_SIZE) 42*10d565efSmrg # define _FP_FRACTBITS_DW_D (4 * _FP_W_TYPE_SIZE) 43*10d565efSmrg #else 44*10d565efSmrg # define _FP_FRACTBITS_D _FP_W_TYPE_SIZE 45*10d565efSmrg # define _FP_FRACTBITS_DW_D (2 * _FP_W_TYPE_SIZE) 46*10d565efSmrg #endif 47*10d565efSmrg 48*10d565efSmrg #define _FP_FRACBITS_D 53 49*10d565efSmrg #define _FP_FRACXBITS_D (_FP_FRACTBITS_D - _FP_FRACBITS_D) 50*10d565efSmrg #define _FP_WFRACBITS_D (_FP_WORKBITS + _FP_FRACBITS_D) 51*10d565efSmrg #define _FP_WFRACXBITS_D (_FP_FRACTBITS_D - _FP_WFRACBITS_D) 52*10d565efSmrg #define _FP_EXPBITS_D 11 53*10d565efSmrg #define _FP_EXPBIAS_D 1023 54*10d565efSmrg #define _FP_EXPMAX_D 2047 55*10d565efSmrg 56*10d565efSmrg #define _FP_QNANBIT_D \ 57*10d565efSmrg ((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE) 58*10d565efSmrg #define _FP_QNANBIT_SH_D \ 59*10d565efSmrg ((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE) 60*10d565efSmrg #define _FP_IMPLBIT_D \ 61*10d565efSmrg ((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE) 62*10d565efSmrg #define _FP_IMPLBIT_SH_D \ 63*10d565efSmrg ((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE) 64*10d565efSmrg #define _FP_OVERFLOW_D \ 65*10d565efSmrg ((_FP_W_TYPE) 1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE) 66*10d565efSmrg 67*10d565efSmrg #define _FP_WFRACBITS_DW_D (2 * _FP_WFRACBITS_D) 68*10d565efSmrg #define _FP_WFRACXBITS_DW_D (_FP_FRACTBITS_DW_D - _FP_WFRACBITS_DW_D) 69*10d565efSmrg #define _FP_HIGHBIT_DW_D \ 70*10d565efSmrg ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_D - 1) % _FP_W_TYPE_SIZE) 71*10d565efSmrg 72*10d565efSmrg typedef float DFtype __attribute__ ((mode (DF))); 73*10d565efSmrg 74*10d565efSmrg #if _FP_W_TYPE_SIZE < 64 75*10d565efSmrg 76*10d565efSmrg union _FP_UNION_D 77*10d565efSmrg { 78*10d565efSmrg DFtype flt; 79*10d565efSmrg struct _FP_STRUCT_LAYOUT 80*10d565efSmrg { 81*10d565efSmrg # if __BYTE_ORDER == __BIG_ENDIAN 82*10d565efSmrg unsigned sign : 1; 83*10d565efSmrg unsigned exp : _FP_EXPBITS_D; 84*10d565efSmrg unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE; 85*10d565efSmrg unsigned frac0 : _FP_W_TYPE_SIZE; 86*10d565efSmrg # else 87*10d565efSmrg unsigned frac0 : _FP_W_TYPE_SIZE; 88*10d565efSmrg unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE; 89*10d565efSmrg unsigned exp : _FP_EXPBITS_D; 90*10d565efSmrg unsigned sign : 1; 91*10d565efSmrg # endif 92*10d565efSmrg } bits __attribute__ ((packed)); 93*10d565efSmrg }; 94*10d565efSmrg 95*10d565efSmrg # define FP_DECL_D(X) _FP_DECL (2, X) 96*10d565efSmrg # define FP_UNPACK_RAW_D(X, val) _FP_UNPACK_RAW_2 (D, X, (val)) 97*10d565efSmrg # define FP_UNPACK_RAW_DP(X, val) _FP_UNPACK_RAW_2_P (D, X, (val)) 98*10d565efSmrg # define FP_PACK_RAW_D(val, X) _FP_PACK_RAW_2 (D, (val), X) 99*10d565efSmrg # define FP_PACK_RAW_DP(val, X) \ 100*10d565efSmrg do \ 101*10d565efSmrg { \ 102*10d565efSmrg if (!FP_INHIBIT_RESULTS) \ 103*10d565efSmrg _FP_PACK_RAW_2_P (D, (val), X); \ 104*10d565efSmrg } \ 105*10d565efSmrg while (0) 106*10d565efSmrg 107*10d565efSmrg # define FP_UNPACK_D(X, val) \ 108*10d565efSmrg do \ 109*10d565efSmrg { \ 110*10d565efSmrg _FP_UNPACK_RAW_2 (D, X, (val)); \ 111*10d565efSmrg _FP_UNPACK_CANONICAL (D, 2, X); \ 112*10d565efSmrg } \ 113*10d565efSmrg while (0) 114*10d565efSmrg 115*10d565efSmrg # define FP_UNPACK_DP(X, val) \ 116*10d565efSmrg do \ 117*10d565efSmrg { \ 118*10d565efSmrg _FP_UNPACK_RAW_2_P (D, X, (val)); \ 119*10d565efSmrg _FP_UNPACK_CANONICAL (D, 2, X); \ 120*10d565efSmrg } \ 121*10d565efSmrg while (0) 122*10d565efSmrg 123*10d565efSmrg # define FP_UNPACK_SEMIRAW_D(X, val) \ 124*10d565efSmrg do \ 125*10d565efSmrg { \ 126*10d565efSmrg _FP_UNPACK_RAW_2 (D, X, (val)); \ 127*10d565efSmrg _FP_UNPACK_SEMIRAW (D, 2, X); \ 128*10d565efSmrg } \ 129*10d565efSmrg while (0) 130*10d565efSmrg 131*10d565efSmrg # define FP_UNPACK_SEMIRAW_DP(X, val) \ 132*10d565efSmrg do \ 133*10d565efSmrg { \ 134*10d565efSmrg _FP_UNPACK_RAW_2_P (D, X, (val)); \ 135*10d565efSmrg _FP_UNPACK_SEMIRAW (D, 2, X); \ 136*10d565efSmrg } \ 137*10d565efSmrg while (0) 138*10d565efSmrg 139*10d565efSmrg # define FP_PACK_D(val, X) \ 140*10d565efSmrg do \ 141*10d565efSmrg { \ 142*10d565efSmrg _FP_PACK_CANONICAL (D, 2, X); \ 143*10d565efSmrg _FP_PACK_RAW_2 (D, (val), X); \ 144*10d565efSmrg } \ 145*10d565efSmrg while (0) 146*10d565efSmrg 147*10d565efSmrg # define FP_PACK_DP(val, X) \ 148*10d565efSmrg do \ 149*10d565efSmrg { \ 150*10d565efSmrg _FP_PACK_CANONICAL (D, 2, X); \ 151*10d565efSmrg if (!FP_INHIBIT_RESULTS) \ 152*10d565efSmrg _FP_PACK_RAW_2_P (D, (val), X); \ 153*10d565efSmrg } \ 154*10d565efSmrg while (0) 155*10d565efSmrg 156*10d565efSmrg # define FP_PACK_SEMIRAW_D(val, X) \ 157*10d565efSmrg do \ 158*10d565efSmrg { \ 159*10d565efSmrg _FP_PACK_SEMIRAW (D, 2, X); \ 160*10d565efSmrg _FP_PACK_RAW_2 (D, (val), X); \ 161*10d565efSmrg } \ 162*10d565efSmrg while (0) 163*10d565efSmrg 164*10d565efSmrg # define FP_PACK_SEMIRAW_DP(val, X) \ 165*10d565efSmrg do \ 166*10d565efSmrg { \ 167*10d565efSmrg _FP_PACK_SEMIRAW (D, 2, X); \ 168*10d565efSmrg if (!FP_INHIBIT_RESULTS) \ 169*10d565efSmrg _FP_PACK_RAW_2_P (D, (val), X); \ 170*10d565efSmrg } \ 171*10d565efSmrg while (0) 172*10d565efSmrg 173*10d565efSmrg # define FP_ISSIGNAN_D(X) _FP_ISSIGNAN (D, 2, X) 174*10d565efSmrg # define FP_NEG_D(R, X) _FP_NEG (D, 2, R, X) 175*10d565efSmrg # define FP_ADD_D(R, X, Y) _FP_ADD (D, 2, R, X, Y) 176*10d565efSmrg # define FP_SUB_D(R, X, Y) _FP_SUB (D, 2, R, X, Y) 177*10d565efSmrg # define FP_MUL_D(R, X, Y) _FP_MUL (D, 2, R, X, Y) 178*10d565efSmrg # define FP_DIV_D(R, X, Y) _FP_DIV (D, 2, R, X, Y) 179*10d565efSmrg # define FP_SQRT_D(R, X) _FP_SQRT (D, 2, R, X) 180*10d565efSmrg # define _FP_SQRT_MEAT_D(R, S, T, X, Q) _FP_SQRT_MEAT_2 (R, S, T, X, (Q)) 181*10d565efSmrg # define FP_FMA_D(R, X, Y, Z) _FP_FMA (D, 2, 4, R, X, Y, Z) 182*10d565efSmrg 183*10d565efSmrg # define FP_CMP_D(r, X, Y, un, ex) _FP_CMP (D, 2, (r), X, Y, (un), (ex)) 184*10d565efSmrg # define FP_CMP_EQ_D(r, X, Y, ex) _FP_CMP_EQ (D, 2, (r), X, Y, (ex)) 185*10d565efSmrg # define FP_CMP_UNORD_D(r, X, Y, ex) _FP_CMP_UNORD (D, 2, (r), X, Y, (ex)) 186*10d565efSmrg 187*10d565efSmrg # define FP_TO_INT_D(r, X, rsz, rsg) _FP_TO_INT (D, 2, (r), X, (rsz), (rsg)) 188*10d565efSmrg # define FP_TO_INT_ROUND_D(r, X, rsz, rsg) \ 189*10d565efSmrg _FP_TO_INT_ROUND (D, 2, (r), X, (rsz), (rsg)) 190*10d565efSmrg # define FP_FROM_INT_D(X, r, rs, rt) _FP_FROM_INT (D, 2, X, (r), (rs), rt) 191*10d565efSmrg 192*10d565efSmrg # define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_2 (X) 193*10d565efSmrg # define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_2 (X) 194*10d565efSmrg 195*10d565efSmrg # define _FP_FRAC_HIGH_DW_D(X) _FP_FRAC_HIGH_4 (X) 196*10d565efSmrg 197*10d565efSmrg #else 198*10d565efSmrg 199*10d565efSmrg union _FP_UNION_D 200*10d565efSmrg { 201*10d565efSmrg DFtype flt; 202*10d565efSmrg struct _FP_STRUCT_LAYOUT 203*10d565efSmrg { 204*10d565efSmrg # if __BYTE_ORDER == __BIG_ENDIAN 205*10d565efSmrg unsigned sign : 1; 206*10d565efSmrg unsigned exp : _FP_EXPBITS_D; 207*10d565efSmrg _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0); 208*10d565efSmrg # else 209*10d565efSmrg _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0); 210*10d565efSmrg unsigned exp : _FP_EXPBITS_D; 211*10d565efSmrg unsigned sign : 1; 212*10d565efSmrg # endif 213*10d565efSmrg } bits __attribute__ ((packed)); 214*10d565efSmrg }; 215*10d565efSmrg 216*10d565efSmrg # define FP_DECL_D(X) _FP_DECL (1, X) 217*10d565efSmrg # define FP_UNPACK_RAW_D(X, val) _FP_UNPACK_RAW_1 (D, X, (val)) 218*10d565efSmrg # define FP_UNPACK_RAW_DP(X, val) _FP_UNPACK_RAW_1_P (D, X, (val)) 219*10d565efSmrg # define FP_PACK_RAW_D(val, X) _FP_PACK_RAW_1 (D, (val), X) 220*10d565efSmrg # define FP_PACK_RAW_DP(val, X) \ 221*10d565efSmrg do \ 222*10d565efSmrg { \ 223*10d565efSmrg if (!FP_INHIBIT_RESULTS) \ 224*10d565efSmrg _FP_PACK_RAW_1_P (D, (val), X); \ 225*10d565efSmrg } \ 226*10d565efSmrg while (0) 227*10d565efSmrg 228*10d565efSmrg # define FP_UNPACK_D(X, val) \ 229*10d565efSmrg do \ 230*10d565efSmrg { \ 231*10d565efSmrg _FP_UNPACK_RAW_1 (D, X, (val)); \ 232*10d565efSmrg _FP_UNPACK_CANONICAL (D, 1, X); \ 233*10d565efSmrg } \ 234*10d565efSmrg while (0) 235*10d565efSmrg 236*10d565efSmrg # define FP_UNPACK_DP(X, val) \ 237*10d565efSmrg do \ 238*10d565efSmrg { \ 239*10d565efSmrg _FP_UNPACK_RAW_1_P (D, X, (val)); \ 240*10d565efSmrg _FP_UNPACK_CANONICAL (D, 1, X); \ 241*10d565efSmrg } \ 242*10d565efSmrg while (0) 243*10d565efSmrg 244*10d565efSmrg # define FP_UNPACK_SEMIRAW_D(X, val) \ 245*10d565efSmrg do \ 246*10d565efSmrg { \ 247*10d565efSmrg _FP_UNPACK_RAW_1 (D, X, (val)); \ 248*10d565efSmrg _FP_UNPACK_SEMIRAW (D, 1, X); \ 249*10d565efSmrg } \ 250*10d565efSmrg while (0) 251*10d565efSmrg 252*10d565efSmrg # define FP_UNPACK_SEMIRAW_DP(X, val) \ 253*10d565efSmrg do \ 254*10d565efSmrg { \ 255*10d565efSmrg _FP_UNPACK_RAW_1_P (D, X, (val)); \ 256*10d565efSmrg _FP_UNPACK_SEMIRAW (D, 1, X); \ 257*10d565efSmrg } \ 258*10d565efSmrg while (0) 259*10d565efSmrg 260*10d565efSmrg # define FP_PACK_D(val, X) \ 261*10d565efSmrg do \ 262*10d565efSmrg { \ 263*10d565efSmrg _FP_PACK_CANONICAL (D, 1, X); \ 264*10d565efSmrg _FP_PACK_RAW_1 (D, (val), X); \ 265*10d565efSmrg } \ 266*10d565efSmrg while (0) 267*10d565efSmrg 268*10d565efSmrg # define FP_PACK_DP(val, X) \ 269*10d565efSmrg do \ 270*10d565efSmrg { \ 271*10d565efSmrg _FP_PACK_CANONICAL (D, 1, X); \ 272*10d565efSmrg if (!FP_INHIBIT_RESULTS) \ 273*10d565efSmrg _FP_PACK_RAW_1_P (D, (val), X); \ 274*10d565efSmrg } \ 275*10d565efSmrg while (0) 276*10d565efSmrg 277*10d565efSmrg # define FP_PACK_SEMIRAW_D(val, X) \ 278*10d565efSmrg do \ 279*10d565efSmrg { \ 280*10d565efSmrg _FP_PACK_SEMIRAW (D, 1, X); \ 281*10d565efSmrg _FP_PACK_RAW_1 (D, (val), X); \ 282*10d565efSmrg } \ 283*10d565efSmrg while (0) 284*10d565efSmrg 285*10d565efSmrg # define FP_PACK_SEMIRAW_DP(val, X) \ 286*10d565efSmrg do \ 287*10d565efSmrg { \ 288*10d565efSmrg _FP_PACK_SEMIRAW (D, 1, X); \ 289*10d565efSmrg if (!FP_INHIBIT_RESULTS) \ 290*10d565efSmrg _FP_PACK_RAW_1_P (D, (val), X); \ 291*10d565efSmrg } \ 292*10d565efSmrg while (0) 293*10d565efSmrg 294*10d565efSmrg # define FP_ISSIGNAN_D(X) _FP_ISSIGNAN (D, 1, X) 295*10d565efSmrg # define FP_NEG_D(R, X) _FP_NEG (D, 1, R, X) 296*10d565efSmrg # define FP_ADD_D(R, X, Y) _FP_ADD (D, 1, R, X, Y) 297*10d565efSmrg # define FP_SUB_D(R, X, Y) _FP_SUB (D, 1, R, X, Y) 298*10d565efSmrg # define FP_MUL_D(R, X, Y) _FP_MUL (D, 1, R, X, Y) 299*10d565efSmrg # define FP_DIV_D(R, X, Y) _FP_DIV (D, 1, R, X, Y) 300*10d565efSmrg # define FP_SQRT_D(R, X) _FP_SQRT (D, 1, R, X) 301*10d565efSmrg # define _FP_SQRT_MEAT_D(R, S, T, X, Q) _FP_SQRT_MEAT_1 (R, S, T, X, (Q)) 302*10d565efSmrg # define FP_FMA_D(R, X, Y, Z) _FP_FMA (D, 1, 2, R, X, Y, Z) 303*10d565efSmrg 304*10d565efSmrg /* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by 305*10d565efSmrg the target machine. */ 306*10d565efSmrg 307*10d565efSmrg # define FP_CMP_D(r, X, Y, un, ex) _FP_CMP (D, 1, (r), X, Y, (un), (ex)) 308*10d565efSmrg # define FP_CMP_EQ_D(r, X, Y, ex) _FP_CMP_EQ (D, 1, (r), X, Y, (ex)) 309*10d565efSmrg # define FP_CMP_UNORD_D(r, X, Y, ex) _FP_CMP_UNORD (D, 1, (r), X, Y, (ex)) 310*10d565efSmrg 311*10d565efSmrg # define FP_TO_INT_D(r, X, rsz, rsg) _FP_TO_INT (D, 1, (r), X, (rsz), (rsg)) 312*10d565efSmrg # define FP_TO_INT_ROUND_D(r, X, rsz, rsg) \ 313*10d565efSmrg _FP_TO_INT_ROUND (D, 1, (r), X, (rsz), (rsg)) 314*10d565efSmrg # define FP_FROM_INT_D(X, r, rs, rt) _FP_FROM_INT (D, 1, X, (r), (rs), rt) 315*10d565efSmrg 316*10d565efSmrg # define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_1 (X) 317*10d565efSmrg # define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_1 (X) 318*10d565efSmrg 319*10d565efSmrg # define _FP_FRAC_HIGH_DW_D(X) _FP_FRAC_HIGH_2 (X) 320*10d565efSmrg 321*10d565efSmrg #endif /* W_TYPE_SIZE < 64 */ 322*10d565efSmrg 323*10d565efSmrg #endif /* !SOFT_FP_DOUBLE_H */ 324