1*9d5a6349SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 21da177e4SLinus Torvalds /* IEEE754 floating point arithmetic 31da177e4SLinus Torvalds * double precision: common utilities 41da177e4SLinus Torvalds */ 51da177e4SLinus Torvalds /* 61da177e4SLinus Torvalds * MIPS floating point support 71da177e4SLinus Torvalds * Copyright (C) 1994-2000 Algorithmics Ltd. 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include "ieee754dp.h" 111da177e4SLinus Torvalds ieee754dp_fint(int x)122209bcb1SRalf Baechleunion ieee754dp ieee754dp_fint(int x) 131da177e4SLinus Torvalds { 14ecf52d3cSAtsushi Nemoto u64 xm; 15ecf52d3cSAtsushi Nemoto int xe; 16ecf52d3cSAtsushi Nemoto int xs; 171da177e4SLinus Torvalds 189e8bad1fSRalf Baechle ieee754_clearcx(); 191da177e4SLinus Torvalds 201da177e4SLinus Torvalds if (x == 0) 211da177e4SLinus Torvalds return ieee754dp_zero(0); 221da177e4SLinus Torvalds if (x == 1 || x == -1) 231da177e4SLinus Torvalds return ieee754dp_one(x < 0); 241da177e4SLinus Torvalds if (x == 10 || x == -10) 251da177e4SLinus Torvalds return ieee754dp_ten(x < 0); 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds xs = (x < 0); 281da177e4SLinus Torvalds if (xs) { 291da177e4SLinus Torvalds if (x == (1 << 31)) 301da177e4SLinus Torvalds xm = ((unsigned) 1 << 31); /* max neg can't be safely negated */ 311da177e4SLinus Torvalds else 321da177e4SLinus Torvalds xm = -x; 331da177e4SLinus Torvalds } else { 341da177e4SLinus Torvalds xm = x; 351da177e4SLinus Torvalds } 361da177e4SLinus Torvalds 371da177e4SLinus Torvalds /* normalize - result can never be inexact or overflow */ 38ad8fb553SRalf Baechle xe = DP_FBITS; 39ad8fb553SRalf Baechle while ((xm >> DP_FBITS) == 0) { 401da177e4SLinus Torvalds xm <<= 1; 411da177e4SLinus Torvalds xe--; 421da177e4SLinus Torvalds } 431da177e4SLinus Torvalds return builddp(xs, xe + DP_EBIAS, xm & ~DP_HIDDEN_BIT); 441da177e4SLinus Torvalds } 45