1 // SPDX-License-Identifier: GPL-2.0-only 2 /* IEEE754 floating point arithmetic 3 * double precision: common utilities 4 */ 5 /* 6 * MIPS floating point support 7 * Copyright (C) 1994-2000 Algorithmics Ltd. 8 */ 9 10 #include "ieee754sp.h" 11 #include "ieee754dp.h" 12 13 static inline union ieee754dp ieee754dp_nan_fsp(int xs, u64 xm) 14 { 15 return builddp(xs, DP_EMAX + 1 + DP_EBIAS, 16 xm << (DP_FBITS - SP_FBITS)); 17 } 18 19 union ieee754dp ieee754dp_fsp(union ieee754sp x) 20 { 21 COMPXSP; 22 23 EXPLODEXSP; 24 25 ieee754_clearcx(); 26 27 FLUSHXSP; 28 29 switch (xc) { 30 case IEEE754_CLASS_SNAN: 31 return ieee754dp_nanxcpt(ieee754dp_nan_fsp(xs, xm)); 32 33 case IEEE754_CLASS_QNAN: 34 return ieee754dp_nan_fsp(xs, xm); 35 36 case IEEE754_CLASS_INF: 37 return ieee754dp_inf(xs); 38 39 case IEEE754_CLASS_ZERO: 40 return ieee754dp_zero(xs); 41 42 case IEEE754_CLASS_DNORM: 43 /* normalize */ 44 while ((xm >> SP_FBITS) == 0) { 45 xm <<= 1; 46 xe--; 47 } 48 break; 49 50 case IEEE754_CLASS_NORM: 51 break; 52 } 53 54 /* 55 * Can't possibly overflow,underflow, or need rounding 56 */ 57 58 /* drop the hidden bit */ 59 xm &= ~SP_HIDDEN_BIT; 60 61 return builddp(xs, xe + DP_EBIAS, 62 (u64) xm << (DP_FBITS - SP_FBITS)); 63 } 64