11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* IEEE754 floating point arithmetic 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * single precision 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MIPS floating point support 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1994-2000 Algorithmics Ltd. 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ######################################################################## 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can distribute it and/or modify it 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * under the terms of the GNU General Public License (Version 2) as 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation. 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope it will be useful, but WITHOUT 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for more details. 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License along 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * with this program; if not, write to the Free Software Foundation, Inc., 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ######################################################################## 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ieee754sp.h" 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsieee754sp ieee754sp_flong(s64 x) 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 31ecf52d3c895c8bc069b9ae07c18acf39d846c2efAtsushi Nemoto u64 xm; /* <--- need 64-bit mantissa temp */ 32ecf52d3c895c8bc069b9ae07c18acf39d846c2efAtsushi Nemoto int xe; 33ecf52d3c895c8bc069b9ae07c18acf39d846c2efAtsushi Nemoto int xs; 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds CLEARCX; 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (x == 0) 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ieee754sp_zero(0); 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (x == 1 || x == -1) 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ieee754sp_one(x < 0); 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (x == 10 || x == -10) 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ieee754sp_ten(x < 0); 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xs = (x < 0); 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (xs) { 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (x == (1ULL << 63)) 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xm = (1ULL << 63); /* max neg can't be safely negated */ 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xm = -x; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xm = x; 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xe = SP_MBITS + 3; 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (xm >> (SP_MBITS + 1 + 3)) { 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* shunt out overflow bits 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (xm >> (SP_MBITS + 1 + 3)) { 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SPXSRSX1(); 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* normalize in grs extended single precision */ 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while ((xm >> (SP_MBITS + 3)) == 0) { 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xm <<= 1; 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds xe--; 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SPNORMRET1(xs, xe, xm, "sp_flong", x); 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsieee754sp ieee754sp_fulong(u64 u) 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((s64) u < 0) 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ieee754sp_add(ieee754sp_1e63(), 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ieee754sp_flong(u & ~(1ULL << 63))); 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ieee754sp_flong(u); 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 79