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 "ieee754dp.h" 11 12 union ieee754dp ieee754dp_flong(s64 x) 13 { 14 u64 xm; 15 int xe; 16 int xs; 17 18 ieee754_clearcx(); 19 20 if (x == 0) 21 return ieee754dp_zero(0); 22 if (x == 1 || x == -1) 23 return ieee754dp_one(x < 0); 24 if (x == 10 || x == -10) 25 return ieee754dp_ten(x < 0); 26 27 xs = (x < 0); 28 if (xs) { 29 if (x == (1ULL << 63)) 30 xm = (1ULL << 63); /* max neg can't be safely negated */ 31 else 32 xm = -x; 33 } else { 34 xm = x; 35 } 36 37 /* normalize */ 38 xe = DP_FBITS + 3; 39 if (xm >> (DP_FBITS + 1 + 3)) { 40 /* shunt out overflow bits */ 41 while (xm >> (DP_FBITS + 1 + 3)) { 42 XDPSRSX1(); 43 } 44 } else { 45 /* normalize in grs extended double precision */ 46 while ((xm >> (DP_FBITS + 3)) == 0) { 47 xm <<= 1; 48 xe--; 49 } 50 } 51 52 return ieee754dp_format(xs, xe, xm); 53 } 54