1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * IEEE754 floating point 3*1da177e4SLinus Torvalds * double precision internal header file 4*1da177e4SLinus Torvalds */ 5*1da177e4SLinus Torvalds /* 6*1da177e4SLinus Torvalds * MIPS floating point support 7*1da177e4SLinus Torvalds * Copyright (C) 1994-2000 Algorithmics Ltd. 8*1da177e4SLinus Torvalds * http://www.algor.co.uk 9*1da177e4SLinus Torvalds * 10*1da177e4SLinus Torvalds * ######################################################################## 11*1da177e4SLinus Torvalds * 12*1da177e4SLinus Torvalds * This program is free software; you can distribute it and/or modify it 13*1da177e4SLinus Torvalds * under the terms of the GNU General Public License (Version 2) as 14*1da177e4SLinus Torvalds * published by the Free Software Foundation. 15*1da177e4SLinus Torvalds * 16*1da177e4SLinus Torvalds * This program is distributed in the hope it will be useful, but WITHOUT 17*1da177e4SLinus Torvalds * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 18*1da177e4SLinus Torvalds * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 19*1da177e4SLinus Torvalds * for more details. 20*1da177e4SLinus Torvalds * 21*1da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License along 22*1da177e4SLinus Torvalds * with this program; if not, write to the Free Software Foundation, Inc., 23*1da177e4SLinus Torvalds * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. 24*1da177e4SLinus Torvalds * 25*1da177e4SLinus Torvalds * ######################################################################## 26*1da177e4SLinus Torvalds */ 27*1da177e4SLinus Torvalds 28*1da177e4SLinus Torvalds 29*1da177e4SLinus Torvalds #include "ieee754int.h" 30*1da177e4SLinus Torvalds 31*1da177e4SLinus Torvalds #define assert(expr) ((void)0) 32*1da177e4SLinus Torvalds 33*1da177e4SLinus Torvalds /* 3bit extended single precision sticky right shift */ 34*1da177e4SLinus Torvalds #define SPXSRSXn(rs) \ 35*1da177e4SLinus Torvalds (xe += rs, \ 36*1da177e4SLinus Torvalds xm = (rs > (SP_MBITS+3))?1:((xm) >> (rs)) | ((xm) << (32-(rs)) != 0)) 37*1da177e4SLinus Torvalds 38*1da177e4SLinus Torvalds #define SPXSRSX1() \ 39*1da177e4SLinus Torvalds (xe++, (xm = (xm >> 1) | (xm & 1))) 40*1da177e4SLinus Torvalds 41*1da177e4SLinus Torvalds #define SPXSRSYn(rs) \ 42*1da177e4SLinus Torvalds (ye+=rs, \ 43*1da177e4SLinus Torvalds ym = (rs > (SP_MBITS+3))?1:((ym) >> (rs)) | ((ym) << (32-(rs)) != 0)) 44*1da177e4SLinus Torvalds 45*1da177e4SLinus Torvalds #define SPXSRSY1() \ 46*1da177e4SLinus Torvalds (ye++, (ym = (ym >> 1) | (ym & 1))) 47*1da177e4SLinus Torvalds 48*1da177e4SLinus Torvalds /* convert denormal to normalized with extended exponent */ 49*1da177e4SLinus Torvalds #define SPDNORMx(m,e) \ 50*1da177e4SLinus Torvalds while( (m >> SP_MBITS) == 0) { m <<= 1; e--; } 51*1da177e4SLinus Torvalds #define SPDNORMX SPDNORMx(xm,xe) 52*1da177e4SLinus Torvalds #define SPDNORMY SPDNORMx(ym,ye) 53*1da177e4SLinus Torvalds 54*1da177e4SLinus Torvalds static __inline ieee754sp buildsp(int s, int bx, unsigned m) 55*1da177e4SLinus Torvalds { 56*1da177e4SLinus Torvalds ieee754sp r; 57*1da177e4SLinus Torvalds 58*1da177e4SLinus Torvalds assert((s) == 0 || (s) == 1); 59*1da177e4SLinus Torvalds assert((bx) >= SP_EMIN - 1 + SP_EBIAS 60*1da177e4SLinus Torvalds && (bx) <= SP_EMAX + 1 + SP_EBIAS); 61*1da177e4SLinus Torvalds assert(((m) >> SP_MBITS) == 0); 62*1da177e4SLinus Torvalds 63*1da177e4SLinus Torvalds r.parts.sign = s; 64*1da177e4SLinus Torvalds r.parts.bexp = bx; 65*1da177e4SLinus Torvalds r.parts.mant = m; 66*1da177e4SLinus Torvalds 67*1da177e4SLinus Torvalds return r; 68*1da177e4SLinus Torvalds } 69*1da177e4SLinus Torvalds 70*1da177e4SLinus Torvalds extern int ieee754sp_isnan(ieee754sp); 71*1da177e4SLinus Torvalds extern int ieee754sp_issnan(ieee754sp); 72*1da177e4SLinus Torvalds extern int ieee754si_xcpt(int, const char *, ...); 73*1da177e4SLinus Torvalds extern s64 ieee754di_xcpt(s64, const char *, ...); 74*1da177e4SLinus Torvalds extern ieee754sp ieee754sp_xcpt(ieee754sp, const char *, ...); 75*1da177e4SLinus Torvalds extern ieee754sp ieee754sp_nanxcpt(ieee754sp, const char *, ...); 76*1da177e4SLinus Torvalds extern ieee754sp ieee754sp_bestnan(ieee754sp, ieee754sp); 77*1da177e4SLinus Torvalds extern ieee754sp ieee754sp_format(int, int, unsigned); 78*1da177e4SLinus Torvalds 79*1da177e4SLinus Torvalds 80*1da177e4SLinus Torvalds #define SPNORMRET2(s,e,m,name,a0,a1) \ 81*1da177e4SLinus Torvalds { \ 82*1da177e4SLinus Torvalds ieee754sp V = ieee754sp_format(s,e,m); \ 83*1da177e4SLinus Torvalds if(TSTX()) \ 84*1da177e4SLinus Torvalds return ieee754sp_xcpt(V,name,a0,a1); \ 85*1da177e4SLinus Torvalds else \ 86*1da177e4SLinus Torvalds return V; \ 87*1da177e4SLinus Torvalds } 88*1da177e4SLinus Torvalds 89*1da177e4SLinus Torvalds #define SPNORMRET1(s,e,m,name,a0) SPNORMRET2(s,e,m,name,a0,a0) 90