1*e4b17023SJohn Marino /* Software floating-point emulation. 2*e4b17023SJohn Marino Definitions for IEEE Single Precision. 3*e4b17023SJohn Marino Copyright (C) 1997,1998,1999,2006,2012 Free Software Foundation, Inc. 4*e4b17023SJohn Marino This file is part of the GNU C Library. 5*e4b17023SJohn Marino Contributed by Richard Henderson (rth@cygnus.com), 6*e4b17023SJohn Marino Jakub Jelinek (jj@ultra.linux.cz), 7*e4b17023SJohn Marino David S. Miller (davem@redhat.com) and 8*e4b17023SJohn Marino Peter Maydell (pmaydell@chiark.greenend.org.uk). 9*e4b17023SJohn Marino 10*e4b17023SJohn Marino The GNU C Library is free software; you can redistribute it and/or 11*e4b17023SJohn Marino modify it under the terms of the GNU Lesser General Public 12*e4b17023SJohn Marino License as published by the Free Software Foundation; either 13*e4b17023SJohn Marino version 2.1 of the License, or (at your option) any later version. 14*e4b17023SJohn Marino 15*e4b17023SJohn Marino In addition to the permissions in the GNU Lesser General Public 16*e4b17023SJohn Marino License, the Free Software Foundation gives you unlimited 17*e4b17023SJohn Marino permission to link the compiled version of this file into 18*e4b17023SJohn Marino combinations with other programs, and to distribute those 19*e4b17023SJohn Marino combinations without any restriction coming from the use of this 20*e4b17023SJohn Marino file. (The Lesser General Public License restrictions do apply in 21*e4b17023SJohn Marino other respects; for example, they cover modification of the file, 22*e4b17023SJohn Marino and distribution when not linked into a combine executable.) 23*e4b17023SJohn Marino 24*e4b17023SJohn Marino The GNU C Library is distributed in the hope that it will be useful, 25*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of 26*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 27*e4b17023SJohn Marino Lesser General Public License for more details. 28*e4b17023SJohn Marino 29*e4b17023SJohn Marino You should have received a copy of the GNU Lesser General Public 30*e4b17023SJohn Marino License along with the GNU C Library; if not, see 31*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */ 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino #if _FP_W_TYPE_SIZE < 32 34*e4b17023SJohn Marino #error "Here's a nickel kid. Go buy yourself a real computer." 35*e4b17023SJohn Marino #endif 36*e4b17023SJohn Marino 37*e4b17023SJohn Marino #define _FP_FRACTBITS_S _FP_W_TYPE_SIZE 38*e4b17023SJohn Marino 39*e4b17023SJohn Marino #define _FP_FRACBITS_S 24 40*e4b17023SJohn Marino #define _FP_FRACXBITS_S (_FP_FRACTBITS_S - _FP_FRACBITS_S) 41*e4b17023SJohn Marino #define _FP_WFRACBITS_S (_FP_WORKBITS + _FP_FRACBITS_S) 42*e4b17023SJohn Marino #define _FP_WFRACXBITS_S (_FP_FRACTBITS_S - _FP_WFRACBITS_S) 43*e4b17023SJohn Marino #define _FP_EXPBITS_S 8 44*e4b17023SJohn Marino #define _FP_EXPBIAS_S 127 45*e4b17023SJohn Marino #define _FP_EXPMAX_S 255 46*e4b17023SJohn Marino #define _FP_QNANBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2)) 47*e4b17023SJohn Marino #define _FP_QNANBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS)) 48*e4b17023SJohn Marino #define _FP_IMPLBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1)) 49*e4b17023SJohn Marino #define _FP_IMPLBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS)) 50*e4b17023SJohn Marino #define _FP_OVERFLOW_S ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S)) 51*e4b17023SJohn Marino 52*e4b17023SJohn Marino /* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be 53*e4b17023SJohn Marino chosen by the target machine. */ 54*e4b17023SJohn Marino 55*e4b17023SJohn Marino typedef float SFtype __attribute__((mode(SF))); 56*e4b17023SJohn Marino 57*e4b17023SJohn Marino union _FP_UNION_S 58*e4b17023SJohn Marino { 59*e4b17023SJohn Marino SFtype flt; 60*e4b17023SJohn Marino struct _FP_STRUCT_LAYOUT { 61*e4b17023SJohn Marino #if __BYTE_ORDER == __BIG_ENDIAN 62*e4b17023SJohn Marino unsigned sign : 1; 63*e4b17023SJohn Marino unsigned exp : _FP_EXPBITS_S; 64*e4b17023SJohn Marino unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); 65*e4b17023SJohn Marino #else 66*e4b17023SJohn Marino unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); 67*e4b17023SJohn Marino unsigned exp : _FP_EXPBITS_S; 68*e4b17023SJohn Marino unsigned sign : 1; 69*e4b17023SJohn Marino #endif 70*e4b17023SJohn Marino } bits __attribute__((packed)); 71*e4b17023SJohn Marino }; 72*e4b17023SJohn Marino 73*e4b17023SJohn Marino #define FP_DECL_S(X) _FP_DECL(1,X) 74*e4b17023SJohn Marino #define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val) 75*e4b17023SJohn Marino #define FP_UNPACK_RAW_SP(X,val) _FP_UNPACK_RAW_1_P(S,X,val) 76*e4b17023SJohn Marino #define FP_PACK_RAW_S(val,X) _FP_PACK_RAW_1(S,val,X) 77*e4b17023SJohn Marino #define FP_PACK_RAW_SP(val,X) \ 78*e4b17023SJohn Marino do { \ 79*e4b17023SJohn Marino if (!FP_INHIBIT_RESULTS) \ 80*e4b17023SJohn Marino _FP_PACK_RAW_1_P(S,val,X); \ 81*e4b17023SJohn Marino } while (0) 82*e4b17023SJohn Marino 83*e4b17023SJohn Marino #define FP_UNPACK_S(X,val) \ 84*e4b17023SJohn Marino do { \ 85*e4b17023SJohn Marino _FP_UNPACK_RAW_1(S,X,val); \ 86*e4b17023SJohn Marino _FP_UNPACK_CANONICAL(S,1,X); \ 87*e4b17023SJohn Marino } while (0) 88*e4b17023SJohn Marino 89*e4b17023SJohn Marino #define FP_UNPACK_SP(X,val) \ 90*e4b17023SJohn Marino do { \ 91*e4b17023SJohn Marino _FP_UNPACK_RAW_1_P(S,X,val); \ 92*e4b17023SJohn Marino _FP_UNPACK_CANONICAL(S,1,X); \ 93*e4b17023SJohn Marino } while (0) 94*e4b17023SJohn Marino 95*e4b17023SJohn Marino #define FP_UNPACK_SEMIRAW_S(X,val) \ 96*e4b17023SJohn Marino do { \ 97*e4b17023SJohn Marino _FP_UNPACK_RAW_1(S,X,val); \ 98*e4b17023SJohn Marino _FP_UNPACK_SEMIRAW(S,1,X); \ 99*e4b17023SJohn Marino } while (0) 100*e4b17023SJohn Marino 101*e4b17023SJohn Marino #define FP_UNPACK_SEMIRAW_SP(X,val) \ 102*e4b17023SJohn Marino do { \ 103*e4b17023SJohn Marino _FP_UNPACK_RAW_1_P(S,X,val); \ 104*e4b17023SJohn Marino _FP_UNPACK_SEMIRAW(S,1,X); \ 105*e4b17023SJohn Marino } while (0) 106*e4b17023SJohn Marino 107*e4b17023SJohn Marino #define FP_PACK_S(val,X) \ 108*e4b17023SJohn Marino do { \ 109*e4b17023SJohn Marino _FP_PACK_CANONICAL(S,1,X); \ 110*e4b17023SJohn Marino _FP_PACK_RAW_1(S,val,X); \ 111*e4b17023SJohn Marino } while (0) 112*e4b17023SJohn Marino 113*e4b17023SJohn Marino #define FP_PACK_SP(val,X) \ 114*e4b17023SJohn Marino do { \ 115*e4b17023SJohn Marino _FP_PACK_CANONICAL(S,1,X); \ 116*e4b17023SJohn Marino if (!FP_INHIBIT_RESULTS) \ 117*e4b17023SJohn Marino _FP_PACK_RAW_1_P(S,val,X); \ 118*e4b17023SJohn Marino } while (0) 119*e4b17023SJohn Marino 120*e4b17023SJohn Marino #define FP_PACK_SEMIRAW_S(val,X) \ 121*e4b17023SJohn Marino do { \ 122*e4b17023SJohn Marino _FP_PACK_SEMIRAW(S,1,X); \ 123*e4b17023SJohn Marino _FP_PACK_RAW_1(S,val,X); \ 124*e4b17023SJohn Marino } while (0) 125*e4b17023SJohn Marino 126*e4b17023SJohn Marino #define FP_PACK_SEMIRAW_SP(val,X) \ 127*e4b17023SJohn Marino do { \ 128*e4b17023SJohn Marino _FP_PACK_SEMIRAW(S,1,X); \ 129*e4b17023SJohn Marino if (!FP_INHIBIT_RESULTS) \ 130*e4b17023SJohn Marino _FP_PACK_RAW_1_P(S,val,X); \ 131*e4b17023SJohn Marino } while (0) 132*e4b17023SJohn Marino 133*e4b17023SJohn Marino #define FP_ISSIGNAN_S(X) _FP_ISSIGNAN(S,1,X) 134*e4b17023SJohn Marino #define FP_NEG_S(R,X) _FP_NEG(S,1,R,X) 135*e4b17023SJohn Marino #define FP_ADD_S(R,X,Y) _FP_ADD(S,1,R,X,Y) 136*e4b17023SJohn Marino #define FP_SUB_S(R,X,Y) _FP_SUB(S,1,R,X,Y) 137*e4b17023SJohn Marino #define FP_MUL_S(R,X,Y) _FP_MUL(S,1,R,X,Y) 138*e4b17023SJohn Marino #define FP_DIV_S(R,X,Y) _FP_DIV(S,1,R,X,Y) 139*e4b17023SJohn Marino #define FP_SQRT_S(R,X) _FP_SQRT(S,1,R,X) 140*e4b17023SJohn Marino #define _FP_SQRT_MEAT_S(R,S,T,X,Q) _FP_SQRT_MEAT_1(R,S,T,X,Q) 141*e4b17023SJohn Marino 142*e4b17023SJohn Marino #define FP_CMP_S(r,X,Y,un) _FP_CMP(S,1,r,X,Y,un) 143*e4b17023SJohn Marino #define FP_CMP_EQ_S(r,X,Y) _FP_CMP_EQ(S,1,r,X,Y) 144*e4b17023SJohn Marino #define FP_CMP_UNORD_S(r,X,Y) _FP_CMP_UNORD(S,1,r,X,Y) 145*e4b17023SJohn Marino 146*e4b17023SJohn Marino #define FP_TO_INT_S(r,X,rsz,rsg) _FP_TO_INT(S,1,r,X,rsz,rsg) 147*e4b17023SJohn Marino #define FP_FROM_INT_S(X,r,rs,rt) _FP_FROM_INT(S,1,X,r,rs,rt) 148*e4b17023SJohn Marino 149*e4b17023SJohn Marino #define _FP_FRAC_HIGH_S(X) _FP_FRAC_HIGH_1(X) 150*e4b17023SJohn Marino #define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1(X) 151