sp_flong.c (960B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* IEEE754 floating point arithmetic 3 * single precision 4 */ 5/* 6 * MIPS floating point support 7 * Copyright (C) 1994-2000 Algorithmics Ltd. 8 */ 9 10#include "ieee754sp.h" 11 12union ieee754sp ieee754sp_flong(s64 x) 13{ 14 u64 xm; /* <--- need 64-bit mantissa temp */ 15 int xe; 16 int xs; 17 18 ieee754_clearcx(); 19 20 if (x == 0) 21 return ieee754sp_zero(0); 22 if (x == 1 || x == -1) 23 return ieee754sp_one(x < 0); 24 if (x == 10 || x == -10) 25 return ieee754sp_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 xe = SP_FBITS + 3; 37 38 if (xm >> (SP_FBITS + 1 + 3)) { 39 /* shunt out overflow bits 40 */ 41 while (xm >> (SP_FBITS + 1 + 3)) { 42 SPXSRSX1(); 43 } 44 } else { 45 /* normalize in grs extended single precision */ 46 while ((xm >> (SP_FBITS + 3)) == 0) { 47 xm <<= 1; 48 xe--; 49 } 50 } 51 return ieee754sp_format(xs, xe, xm); 52}