1169689Skan/* Software floating-point emulation. 2169689Skan Definitions for IEEE Single Precision. 3169689Skan Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc. 4169689Skan This file is part of the GNU C Library. 5169689Skan Contributed by Richard Henderson (rth@cygnus.com), 6169689Skan Jakub Jelinek (jj@ultra.linux.cz), 7169689Skan David S. Miller (davem@redhat.com) and 8169689Skan Peter Maydell (pmaydell@chiark.greenend.org.uk). 9169689Skan 10169689Skan The GNU C Library is free software; you can redistribute it and/or 11169689Skan modify it under the terms of the GNU Lesser General Public 12169689Skan License as published by the Free Software Foundation; either 13169689Skan version 2.1 of the License, or (at your option) any later version. 14169689Skan 15169689Skan In addition to the permissions in the GNU Lesser General Public 16169689Skan License, the Free Software Foundation gives you unlimited 17169689Skan permission to link the compiled version of this file into 18169689Skan combinations with other programs, and to distribute those 19169689Skan combinations without any restriction coming from the use of this 20169689Skan file. (The Lesser General Public License restrictions do apply in 21169689Skan other respects; for example, they cover modification of the file, 22169689Skan and distribution when not linked into a combine executable.) 23169689Skan 24169689Skan The GNU C Library is distributed in the hope that it will be useful, 25169689Skan but WITHOUT ANY WARRANTY; without even the implied warranty of 26169689Skan MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 27169689Skan Lesser General Public License for more details. 28169689Skan 29169689Skan You should have received a copy of the GNU Lesser General Public 30169689Skan License along with the GNU C Library; if not, write to the Free 31169689Skan Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 32169689Skan MA 02110-1301, USA. */ 33169689Skan 34169689Skan#if _FP_W_TYPE_SIZE < 32 35169689Skan#error "Here's a nickel kid. Go buy yourself a real computer." 36169689Skan#endif 37169689Skan 38169689Skan#define _FP_FRACTBITS_S _FP_W_TYPE_SIZE 39169689Skan 40169689Skan#define _FP_FRACBITS_S 24 41169689Skan#define _FP_FRACXBITS_S (_FP_FRACTBITS_S - _FP_FRACBITS_S) 42169689Skan#define _FP_WFRACBITS_S (_FP_WORKBITS + _FP_FRACBITS_S) 43169689Skan#define _FP_WFRACXBITS_S (_FP_FRACTBITS_S - _FP_WFRACBITS_S) 44169689Skan#define _FP_EXPBITS_S 8 45169689Skan#define _FP_EXPBIAS_S 127 46169689Skan#define _FP_EXPMAX_S 255 47169689Skan#define _FP_QNANBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2)) 48169689Skan#define _FP_QNANBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS)) 49169689Skan#define _FP_IMPLBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1)) 50169689Skan#define _FP_IMPLBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS)) 51169689Skan#define _FP_OVERFLOW_S ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S)) 52169689Skan 53169689Skan/* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be 54169689Skan chosen by the target machine. */ 55169689Skan 56169689Skantypedef float SFtype __attribute__((mode(SF))); 57169689Skan 58169689Skanunion _FP_UNION_S 59169689Skan{ 60169689Skan SFtype flt; 61169689Skan struct { 62169689Skan#if __BYTE_ORDER == __BIG_ENDIAN 63169689Skan unsigned sign : 1; 64169689Skan unsigned exp : _FP_EXPBITS_S; 65169689Skan unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); 66169689Skan#else 67169689Skan unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); 68169689Skan unsigned exp : _FP_EXPBITS_S; 69169689Skan unsigned sign : 1; 70169689Skan#endif 71169689Skan } bits __attribute__((packed)); 72169689Skan}; 73169689Skan 74169689Skan#define FP_DECL_S(X) _FP_DECL(1,X) 75169689Skan#define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val) 76169689Skan#define FP_UNPACK_RAW_SP(X,val) _FP_UNPACK_RAW_1_P(S,X,val) 77169689Skan#define FP_PACK_RAW_S(val,X) _FP_PACK_RAW_1(S,val,X) 78169689Skan#define FP_PACK_RAW_SP(val,X) \ 79169689Skan do { \ 80169689Skan if (!FP_INHIBIT_RESULTS) \ 81169689Skan _FP_PACK_RAW_1_P(S,val,X); \ 82169689Skan } while (0) 83169689Skan 84169689Skan#define FP_UNPACK_S(X,val) \ 85169689Skan do { \ 86169689Skan _FP_UNPACK_RAW_1(S,X,val); \ 87169689Skan _FP_UNPACK_CANONICAL(S,1,X); \ 88169689Skan } while (0) 89169689Skan 90169689Skan#define FP_UNPACK_SP(X,val) \ 91169689Skan do { \ 92169689Skan _FP_UNPACK_RAW_1_P(S,X,val); \ 93169689Skan _FP_UNPACK_CANONICAL(S,1,X); \ 94169689Skan } while (0) 95169689Skan 96169689Skan#define FP_UNPACK_SEMIRAW_S(X,val) \ 97169689Skan do { \ 98169689Skan _FP_UNPACK_RAW_1(S,X,val); \ 99169689Skan _FP_UNPACK_SEMIRAW(S,1,X); \ 100169689Skan } while (0) 101169689Skan 102169689Skan#define FP_UNPACK_SEMIRAW_SP(X,val) \ 103169689Skan do { \ 104169689Skan _FP_UNPACK_RAW_1_P(S,X,val); \ 105169689Skan _FP_UNPACK_SEMIRAW(S,1,X); \ 106169689Skan } while (0) 107169689Skan 108169689Skan#define FP_PACK_S(val,X) \ 109169689Skan do { \ 110169689Skan _FP_PACK_CANONICAL(S,1,X); \ 111169689Skan _FP_PACK_RAW_1(S,val,X); \ 112169689Skan } while (0) 113169689Skan 114169689Skan#define FP_PACK_SP(val,X) \ 115169689Skan do { \ 116169689Skan _FP_PACK_CANONICAL(S,1,X); \ 117169689Skan if (!FP_INHIBIT_RESULTS) \ 118169689Skan _FP_PACK_RAW_1_P(S,val,X); \ 119169689Skan } while (0) 120169689Skan 121169689Skan#define FP_PACK_SEMIRAW_S(val,X) \ 122169689Skan do { \ 123169689Skan _FP_PACK_SEMIRAW(S,1,X); \ 124169689Skan _FP_PACK_RAW_1(S,val,X); \ 125169689Skan } while (0) 126169689Skan 127169689Skan#define FP_PACK_SEMIRAW_SP(val,X) \ 128169689Skan do { \ 129169689Skan _FP_PACK_SEMIRAW(S,1,X); \ 130169689Skan if (!FP_INHIBIT_RESULTS) \ 131169689Skan _FP_PACK_RAW_1_P(S,val,X); \ 132169689Skan } while (0) 133169689Skan 134169689Skan#define FP_ISSIGNAN_S(X) _FP_ISSIGNAN(S,1,X) 135169689Skan#define FP_NEG_S(R,X) _FP_NEG(S,1,R,X) 136169689Skan#define FP_ADD_S(R,X,Y) _FP_ADD(S,1,R,X,Y) 137169689Skan#define FP_SUB_S(R,X,Y) _FP_SUB(S,1,R,X,Y) 138169689Skan#define FP_MUL_S(R,X,Y) _FP_MUL(S,1,R,X,Y) 139169689Skan#define FP_DIV_S(R,X,Y) _FP_DIV(S,1,R,X,Y) 140169689Skan#define FP_SQRT_S(R,X) _FP_SQRT(S,1,R,X) 141169689Skan#define _FP_SQRT_MEAT_S(R,S,T,X,Q) _FP_SQRT_MEAT_1(R,S,T,X,Q) 142169689Skan 143169689Skan#define FP_CMP_S(r,X,Y,un) _FP_CMP(S,1,r,X,Y,un) 144169689Skan#define FP_CMP_EQ_S(r,X,Y) _FP_CMP_EQ(S,1,r,X,Y) 145169689Skan#define FP_CMP_UNORD_S(r,X,Y) _FP_CMP_UNORD(S,1,r,X,Y) 146169689Skan 147169689Skan#define FP_TO_INT_S(r,X,rsz,rsg) _FP_TO_INT(S,1,r,X,rsz,rsg) 148169689Skan#define FP_FROM_INT_S(X,r,rs,rt) _FP_FROM_INT(S,1,X,r,rs,rt) 149169689Skan 150169689Skan#define _FP_FRAC_HIGH_S(X) _FP_FRAC_HIGH_1(X) 151169689Skan#define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1(X) 152