1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* IEEE754 floating point arithmetic 3*4882a593Smuzhiyun * double precision: common utilities 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * MIPS floating point support 7*4882a593Smuzhiyun * Copyright (C) 1994-2000 Algorithmics Ltd. 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include "ieee754dp.h" 11*4882a593Smuzhiyun ieee754dp_flong(s64 x)12*4882a593Smuzhiyununion ieee754dp ieee754dp_flong(s64 x) 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun u64 xm; 15*4882a593Smuzhiyun int xe; 16*4882a593Smuzhiyun int xs; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun ieee754_clearcx(); 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun if (x == 0) 21*4882a593Smuzhiyun return ieee754dp_zero(0); 22*4882a593Smuzhiyun if (x == 1 || x == -1) 23*4882a593Smuzhiyun return ieee754dp_one(x < 0); 24*4882a593Smuzhiyun if (x == 10 || x == -10) 25*4882a593Smuzhiyun return ieee754dp_ten(x < 0); 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun xs = (x < 0); 28*4882a593Smuzhiyun if (xs) { 29*4882a593Smuzhiyun if (x == (1ULL << 63)) 30*4882a593Smuzhiyun xm = (1ULL << 63); /* max neg can't be safely negated */ 31*4882a593Smuzhiyun else 32*4882a593Smuzhiyun xm = -x; 33*4882a593Smuzhiyun } else { 34*4882a593Smuzhiyun xm = x; 35*4882a593Smuzhiyun } 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* normalize */ 38*4882a593Smuzhiyun xe = DP_FBITS + 3; 39*4882a593Smuzhiyun if (xm >> (DP_FBITS + 1 + 3)) { 40*4882a593Smuzhiyun /* shunt out overflow bits */ 41*4882a593Smuzhiyun while (xm >> (DP_FBITS + 1 + 3)) { 42*4882a593Smuzhiyun XDPSRSX1(); 43*4882a593Smuzhiyun } 44*4882a593Smuzhiyun } else { 45*4882a593Smuzhiyun /* normalize in grs extended double precision */ 46*4882a593Smuzhiyun while ((xm >> (DP_FBITS + 3)) == 0) { 47*4882a593Smuzhiyun xm <<= 1; 48*4882a593Smuzhiyun xe--; 49*4882a593Smuzhiyun } 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun return ieee754dp_format(xs, xe, xm); 53*4882a593Smuzhiyun } 54