1*9d5a6349SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 21da177e4SLinus Torvalds /* IEEE754 floating point arithmetic 31da177e4SLinus Torvalds * single precision 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 "ieee754sp.h" 111da177e4SLinus Torvalds ieee754sp_fint(int x)122209bcb1SRalf Baechleunion ieee754sp ieee754sp_fint(int x) 131da177e4SLinus Torvalds { 14a58f85b5SAleksandar Markovic unsigned int 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 ieee754sp_zero(0); 221da177e4SLinus Torvalds if (x == 1 || x == -1) 231da177e4SLinus Torvalds return ieee754sp_one(x < 0); 241da177e4SLinus Torvalds if (x == 10 || x == -10) 251da177e4SLinus Torvalds return ieee754sp_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 } 36ad8fb553SRalf Baechle xe = SP_FBITS + 3; 371da177e4SLinus Torvalds 38ad8fb553SRalf Baechle if (xm >> (SP_FBITS + 1 + 3)) { 391da177e4SLinus Torvalds /* shunt out overflow bits 401da177e4SLinus Torvalds */ 41ad8fb553SRalf Baechle while (xm >> (SP_FBITS + 1 + 3)) { 421da177e4SLinus Torvalds SPXSRSX1(); 431da177e4SLinus Torvalds } 441da177e4SLinus Torvalds } else { 451da177e4SLinus Torvalds /* normalize in grs extended single precision 461da177e4SLinus Torvalds */ 47ad8fb553SRalf Baechle while ((xm >> (SP_FBITS + 3)) == 0) { 481da177e4SLinus Torvalds xm <<= 1; 491da177e4SLinus Torvalds xe--; 501da177e4SLinus Torvalds } 511da177e4SLinus Torvalds } 5290efba36SRalf Baechle return ieee754sp_format(xs, xe, xm); 531da177e4SLinus Torvalds } 54