1*404b540aSrobert /* Software floating-point emulation. 2*404b540aSrobert Definitions for IEEE Quad Precision. 3*404b540aSrobert Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc. 4*404b540aSrobert This file is part of the GNU C Library. 5*404b540aSrobert Contributed by Richard Henderson (rth@cygnus.com), 6*404b540aSrobert Jakub Jelinek (jj@ultra.linux.cz), 7*404b540aSrobert David S. Miller (davem@redhat.com) and 8*404b540aSrobert Peter Maydell (pmaydell@chiark.greenend.org.uk). 9*404b540aSrobert 10*404b540aSrobert The GNU C Library is free software; you can redistribute it and/or 11*404b540aSrobert modify it under the terms of the GNU Lesser General Public 12*404b540aSrobert License as published by the Free Software Foundation; either 13*404b540aSrobert version 2.1 of the License, or (at your option) any later version. 14*404b540aSrobert 15*404b540aSrobert In addition to the permissions in the GNU Lesser General Public 16*404b540aSrobert License, the Free Software Foundation gives you unlimited 17*404b540aSrobert permission to link the compiled version of this file into 18*404b540aSrobert combinations with other programs, and to distribute those 19*404b540aSrobert combinations without any restriction coming from the use of this 20*404b540aSrobert file. (The Lesser General Public License restrictions do apply in 21*404b540aSrobert other respects; for example, they cover modification of the file, 22*404b540aSrobert and distribution when not linked into a combine executable.) 23*404b540aSrobert 24*404b540aSrobert The GNU C Library is distributed in the hope that it will be useful, 25*404b540aSrobert but WITHOUT ANY WARRANTY; without even the implied warranty of 26*404b540aSrobert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 27*404b540aSrobert Lesser General Public License for more details. 28*404b540aSrobert 29*404b540aSrobert You should have received a copy of the GNU Lesser General Public 30*404b540aSrobert License along with the GNU C Library; if not, write to the Free 31*404b540aSrobert Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 32*404b540aSrobert MA 02110-1301, USA. */ 33*404b540aSrobert 34*404b540aSrobert #if _FP_W_TYPE_SIZE < 32 35*404b540aSrobert #error "Here's a nickel, kid. Go buy yourself a real computer." 36*404b540aSrobert #endif 37*404b540aSrobert 38*404b540aSrobert #if _FP_W_TYPE_SIZE < 64 39*404b540aSrobert #define _FP_FRACTBITS_Q (4*_FP_W_TYPE_SIZE) 40*404b540aSrobert #else 41*404b540aSrobert #define _FP_FRACTBITS_Q (2*_FP_W_TYPE_SIZE) 42*404b540aSrobert #endif 43*404b540aSrobert 44*404b540aSrobert #define _FP_FRACBITS_Q 113 45*404b540aSrobert #define _FP_FRACXBITS_Q (_FP_FRACTBITS_Q - _FP_FRACBITS_Q) 46*404b540aSrobert #define _FP_WFRACBITS_Q (_FP_WORKBITS + _FP_FRACBITS_Q) 47*404b540aSrobert #define _FP_WFRACXBITS_Q (_FP_FRACTBITS_Q - _FP_WFRACBITS_Q) 48*404b540aSrobert #define _FP_EXPBITS_Q 15 49*404b540aSrobert #define _FP_EXPBIAS_Q 16383 50*404b540aSrobert #define _FP_EXPMAX_Q 32767 51*404b540aSrobert 52*404b540aSrobert #define _FP_QNANBIT_Q \ 53*404b540aSrobert ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2) % _FP_W_TYPE_SIZE) 54*404b540aSrobert #define _FP_QNANBIT_SH_Q \ 55*404b540aSrobert ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE) 56*404b540aSrobert #define _FP_IMPLBIT_Q \ 57*404b540aSrobert ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1) % _FP_W_TYPE_SIZE) 58*404b540aSrobert #define _FP_IMPLBIT_SH_Q \ 59*404b540aSrobert ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE) 60*404b540aSrobert #define _FP_OVERFLOW_Q \ 61*404b540aSrobert ((_FP_W_TYPE)1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE)) 62*404b540aSrobert 63*404b540aSrobert typedef float TFtype __attribute__((mode(TF))); 64*404b540aSrobert 65*404b540aSrobert #if _FP_W_TYPE_SIZE < 64 66*404b540aSrobert 67*404b540aSrobert union _FP_UNION_Q 68*404b540aSrobert { 69*404b540aSrobert TFtype flt; 70*404b540aSrobert struct 71*404b540aSrobert { 72*404b540aSrobert #if __BYTE_ORDER == __BIG_ENDIAN 73*404b540aSrobert unsigned sign : 1; 74*404b540aSrobert unsigned exp : _FP_EXPBITS_Q; 75*404b540aSrobert unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3); 76*404b540aSrobert unsigned long frac2 : _FP_W_TYPE_SIZE; 77*404b540aSrobert unsigned long frac1 : _FP_W_TYPE_SIZE; 78*404b540aSrobert unsigned long frac0 : _FP_W_TYPE_SIZE; 79*404b540aSrobert #else 80*404b540aSrobert unsigned long frac0 : _FP_W_TYPE_SIZE; 81*404b540aSrobert unsigned long frac1 : _FP_W_TYPE_SIZE; 82*404b540aSrobert unsigned long frac2 : _FP_W_TYPE_SIZE; 83*404b540aSrobert unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3); 84*404b540aSrobert unsigned exp : _FP_EXPBITS_Q; 85*404b540aSrobert unsigned sign : 1; 86*404b540aSrobert #endif /* not bigendian */ 87*404b540aSrobert } bits __attribute__((packed)); 88*404b540aSrobert }; 89*404b540aSrobert 90*404b540aSrobert 91*404b540aSrobert #define FP_DECL_Q(X) _FP_DECL(4,X) 92*404b540aSrobert #define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_4(Q,X,val) 93*404b540aSrobert #define FP_UNPACK_RAW_QP(X,val) _FP_UNPACK_RAW_4_P(Q,X,val) 94*404b540aSrobert #define FP_PACK_RAW_Q(val,X) _FP_PACK_RAW_4(Q,val,X) 95*404b540aSrobert #define FP_PACK_RAW_QP(val,X) \ 96*404b540aSrobert do { \ 97*404b540aSrobert if (!FP_INHIBIT_RESULTS) \ 98*404b540aSrobert _FP_PACK_RAW_4_P(Q,val,X); \ 99*404b540aSrobert } while (0) 100*404b540aSrobert 101*404b540aSrobert #define FP_UNPACK_Q(X,val) \ 102*404b540aSrobert do { \ 103*404b540aSrobert _FP_UNPACK_RAW_4(Q,X,val); \ 104*404b540aSrobert _FP_UNPACK_CANONICAL(Q,4,X); \ 105*404b540aSrobert } while (0) 106*404b540aSrobert 107*404b540aSrobert #define FP_UNPACK_QP(X,val) \ 108*404b540aSrobert do { \ 109*404b540aSrobert _FP_UNPACK_RAW_4_P(Q,X,val); \ 110*404b540aSrobert _FP_UNPACK_CANONICAL(Q,4,X); \ 111*404b540aSrobert } while (0) 112*404b540aSrobert 113*404b540aSrobert #define FP_UNPACK_SEMIRAW_Q(X,val) \ 114*404b540aSrobert do { \ 115*404b540aSrobert _FP_UNPACK_RAW_4(Q,X,val); \ 116*404b540aSrobert _FP_UNPACK_SEMIRAW(Q,4,X); \ 117*404b540aSrobert } while (0) 118*404b540aSrobert 119*404b540aSrobert #define FP_UNPACK_SEMIRAW_QP(X,val) \ 120*404b540aSrobert do { \ 121*404b540aSrobert _FP_UNPACK_RAW_4_P(Q,X,val); \ 122*404b540aSrobert _FP_UNPACK_SEMIRAW(Q,4,X); \ 123*404b540aSrobert } while (0) 124*404b540aSrobert 125*404b540aSrobert #define FP_PACK_Q(val,X) \ 126*404b540aSrobert do { \ 127*404b540aSrobert _FP_PACK_CANONICAL(Q,4,X); \ 128*404b540aSrobert _FP_PACK_RAW_4(Q,val,X); \ 129*404b540aSrobert } while (0) 130*404b540aSrobert 131*404b540aSrobert #define FP_PACK_QP(val,X) \ 132*404b540aSrobert do { \ 133*404b540aSrobert _FP_PACK_CANONICAL(Q,4,X); \ 134*404b540aSrobert if (!FP_INHIBIT_RESULTS) \ 135*404b540aSrobert _FP_PACK_RAW_4_P(Q,val,X); \ 136*404b540aSrobert } while (0) 137*404b540aSrobert 138*404b540aSrobert #define FP_PACK_SEMIRAW_Q(val,X) \ 139*404b540aSrobert do { \ 140*404b540aSrobert _FP_PACK_SEMIRAW(Q,4,X); \ 141*404b540aSrobert _FP_PACK_RAW_4(Q,val,X); \ 142*404b540aSrobert } while (0) 143*404b540aSrobert 144*404b540aSrobert #define FP_PACK_SEMIRAW_QP(val,X) \ 145*404b540aSrobert do { \ 146*404b540aSrobert _FP_PACK_SEMIRAW(Q,4,X); \ 147*404b540aSrobert if (!FP_INHIBIT_RESULTS) \ 148*404b540aSrobert _FP_PACK_RAW_4_P(Q,val,X); \ 149*404b540aSrobert } while (0) 150*404b540aSrobert 151*404b540aSrobert #define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,4,X) 152*404b540aSrobert #define FP_NEG_Q(R,X) _FP_NEG(Q,4,R,X) 153*404b540aSrobert #define FP_ADD_Q(R,X,Y) _FP_ADD(Q,4,R,X,Y) 154*404b540aSrobert #define FP_SUB_Q(R,X,Y) _FP_SUB(Q,4,R,X,Y) 155*404b540aSrobert #define FP_MUL_Q(R,X,Y) _FP_MUL(Q,4,R,X,Y) 156*404b540aSrobert #define FP_DIV_Q(R,X,Y) _FP_DIV(Q,4,R,X,Y) 157*404b540aSrobert #define FP_SQRT_Q(R,X) _FP_SQRT(Q,4,R,X) 158*404b540aSrobert #define _FP_SQRT_MEAT_Q(R,S,T,X,Q) _FP_SQRT_MEAT_4(R,S,T,X,Q) 159*404b540aSrobert 160*404b540aSrobert #define FP_CMP_Q(r,X,Y,un) _FP_CMP(Q,4,r,X,Y,un) 161*404b540aSrobert #define FP_CMP_EQ_Q(r,X,Y) _FP_CMP_EQ(Q,4,r,X,Y) 162*404b540aSrobert #define FP_CMP_UNORD_Q(r,X,Y) _FP_CMP_UNORD(Q,4,r,X,Y) 163*404b540aSrobert 164*404b540aSrobert #define FP_TO_INT_Q(r,X,rsz,rsg) _FP_TO_INT(Q,4,r,X,rsz,rsg) 165*404b540aSrobert #define FP_FROM_INT_Q(X,r,rs,rt) _FP_FROM_INT(Q,4,X,r,rs,rt) 166*404b540aSrobert 167*404b540aSrobert #define _FP_FRAC_HIGH_Q(X) _FP_FRAC_HIGH_4(X) 168*404b540aSrobert #define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_4(X) 169*404b540aSrobert 170*404b540aSrobert #else /* not _FP_W_TYPE_SIZE < 64 */ 171*404b540aSrobert union _FP_UNION_Q 172*404b540aSrobert { 173*404b540aSrobert TFtype flt /* __attribute__((mode(TF))) */ ; 174*404b540aSrobert struct { 175*404b540aSrobert _FP_W_TYPE a, b; 176*404b540aSrobert } longs; 177*404b540aSrobert struct { 178*404b540aSrobert #if __BYTE_ORDER == __BIG_ENDIAN 179*404b540aSrobert unsigned sign : 1; 180*404b540aSrobert unsigned exp : _FP_EXPBITS_Q; 181*404b540aSrobert _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE; 182*404b540aSrobert _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE; 183*404b540aSrobert #else 184*404b540aSrobert _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE; 185*404b540aSrobert _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE; 186*404b540aSrobert unsigned exp : _FP_EXPBITS_Q; 187*404b540aSrobert unsigned sign : 1; 188*404b540aSrobert #endif 189*404b540aSrobert } bits; 190*404b540aSrobert }; 191*404b540aSrobert 192*404b540aSrobert #define FP_DECL_Q(X) _FP_DECL(2,X) 193*404b540aSrobert #define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_2(Q,X,val) 194*404b540aSrobert #define FP_UNPACK_RAW_QP(X,val) _FP_UNPACK_RAW_2_P(Q,X,val) 195*404b540aSrobert #define FP_PACK_RAW_Q(val,X) _FP_PACK_RAW_2(Q,val,X) 196*404b540aSrobert #define FP_PACK_RAW_QP(val,X) \ 197*404b540aSrobert do { \ 198*404b540aSrobert if (!FP_INHIBIT_RESULTS) \ 199*404b540aSrobert _FP_PACK_RAW_2_P(Q,val,X); \ 200*404b540aSrobert } while (0) 201*404b540aSrobert 202*404b540aSrobert #define FP_UNPACK_Q(X,val) \ 203*404b540aSrobert do { \ 204*404b540aSrobert _FP_UNPACK_RAW_2(Q,X,val); \ 205*404b540aSrobert _FP_UNPACK_CANONICAL(Q,2,X); \ 206*404b540aSrobert } while (0) 207*404b540aSrobert 208*404b540aSrobert #define FP_UNPACK_QP(X,val) \ 209*404b540aSrobert do { \ 210*404b540aSrobert _FP_UNPACK_RAW_2_P(Q,X,val); \ 211*404b540aSrobert _FP_UNPACK_CANONICAL(Q,2,X); \ 212*404b540aSrobert } while (0) 213*404b540aSrobert 214*404b540aSrobert #define FP_UNPACK_SEMIRAW_Q(X,val) \ 215*404b540aSrobert do { \ 216*404b540aSrobert _FP_UNPACK_RAW_2(Q,X,val); \ 217*404b540aSrobert _FP_UNPACK_SEMIRAW(Q,2,X); \ 218*404b540aSrobert } while (0) 219*404b540aSrobert 220*404b540aSrobert #define FP_UNPACK_SEMIRAW_QP(X,val) \ 221*404b540aSrobert do { \ 222*404b540aSrobert _FP_UNPACK_RAW_2_P(Q,X,val); \ 223*404b540aSrobert _FP_UNPACK_SEMIRAW(Q,2,X); \ 224*404b540aSrobert } while (0) 225*404b540aSrobert 226*404b540aSrobert #define FP_PACK_Q(val,X) \ 227*404b540aSrobert do { \ 228*404b540aSrobert _FP_PACK_CANONICAL(Q,2,X); \ 229*404b540aSrobert _FP_PACK_RAW_2(Q,val,X); \ 230*404b540aSrobert } while (0) 231*404b540aSrobert 232*404b540aSrobert #define FP_PACK_QP(val,X) \ 233*404b540aSrobert do { \ 234*404b540aSrobert _FP_PACK_CANONICAL(Q,2,X); \ 235*404b540aSrobert if (!FP_INHIBIT_RESULTS) \ 236*404b540aSrobert _FP_PACK_RAW_2_P(Q,val,X); \ 237*404b540aSrobert } while (0) 238*404b540aSrobert 239*404b540aSrobert #define FP_PACK_SEMIRAW_Q(val,X) \ 240*404b540aSrobert do { \ 241*404b540aSrobert _FP_PACK_SEMIRAW(Q,2,X); \ 242*404b540aSrobert _FP_PACK_RAW_2(Q,val,X); \ 243*404b540aSrobert } while (0) 244*404b540aSrobert 245*404b540aSrobert #define FP_PACK_SEMIRAW_QP(val,X) \ 246*404b540aSrobert do { \ 247*404b540aSrobert _FP_PACK_SEMIRAW(Q,2,X); \ 248*404b540aSrobert if (!FP_INHIBIT_RESULTS) \ 249*404b540aSrobert _FP_PACK_RAW_2_P(Q,val,X); \ 250*404b540aSrobert } while (0) 251*404b540aSrobert 252*404b540aSrobert #define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,2,X) 253*404b540aSrobert #define FP_NEG_Q(R,X) _FP_NEG(Q,2,R,X) 254*404b540aSrobert #define FP_ADD_Q(R,X,Y) _FP_ADD(Q,2,R,X,Y) 255*404b540aSrobert #define FP_SUB_Q(R,X,Y) _FP_SUB(Q,2,R,X,Y) 256*404b540aSrobert #define FP_MUL_Q(R,X,Y) _FP_MUL(Q,2,R,X,Y) 257*404b540aSrobert #define FP_DIV_Q(R,X,Y) _FP_DIV(Q,2,R,X,Y) 258*404b540aSrobert #define FP_SQRT_Q(R,X) _FP_SQRT(Q,2,R,X) 259*404b540aSrobert #define _FP_SQRT_MEAT_Q(R,S,T,X,Q) _FP_SQRT_MEAT_2(R,S,T,X,Q) 260*404b540aSrobert 261*404b540aSrobert #define FP_CMP_Q(r,X,Y,un) _FP_CMP(Q,2,r,X,Y,un) 262*404b540aSrobert #define FP_CMP_EQ_Q(r,X,Y) _FP_CMP_EQ(Q,2,r,X,Y) 263*404b540aSrobert #define FP_CMP_UNORD_Q(r,X,Y) _FP_CMP_UNORD(Q,2,r,X,Y) 264*404b540aSrobert 265*404b540aSrobert #define FP_TO_INT_Q(r,X,rsz,rsg) _FP_TO_INT(Q,2,r,X,rsz,rsg) 266*404b540aSrobert #define FP_FROM_INT_Q(X,r,rs,rt) _FP_FROM_INT(Q,2,X,r,rs,rt) 267*404b540aSrobert 268*404b540aSrobert #define _FP_FRAC_HIGH_Q(X) _FP_FRAC_HIGH_2(X) 269*404b540aSrobert #define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_2(X) 270*404b540aSrobert 271*404b540aSrobert #endif /* not _FP_W_TYPE_SIZE < 64 */ 272