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