File: /usr/src/linux/arch/mips/math-emu/sp_tlong.c
1 /* IEEE754 floating point arithmetic
2 * single precision
3 */
4 /*
5 * MIPS floating point support
6 * Copyright (C) 1994-2000 Algorithmics Ltd. All rights reserved.
7 * http://www.algor.co.uk
8 *
9 * ########################################################################
10 *
11 * This program is free software; you can distribute it and/or modify it
12 * under the terms of the GNU General Public License (Version 2) as
13 * published by the Free Software Foundation.
14 *
15 * This program is distributed in the hope it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 * for more details.
19 *
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
23 *
24 * ########################################################################
25 */
26
27
28 #include "ieee754sp.h"
29
30 long long ieee754sp_tlong(ieee754sp x)
31 {
32 COMPXDP; /* <-- need 64-bit mantissa tmp */
33
34 CLEARCX;
35
36 EXPLODEXSP;
37
38 switch (xc) {
39 case IEEE754_CLASS_SNAN:
40 case IEEE754_CLASS_QNAN:
41 SETCX(IEEE754_INVALID_OPERATION);
42 return ieee754di_xcpt(ieee754di_indef(), "sp_tlong", x);
43 case IEEE754_CLASS_INF:
44 SETCX(IEEE754_OVERFLOW);
45 return ieee754di_xcpt(ieee754di_indef(), "sp_tlong", x);
46 case IEEE754_CLASS_ZERO:
47 return 0;
48 case IEEE754_CLASS_DNORM: /* much to small */
49 SETCX(IEEE754_UNDERFLOW);
50 return ieee754di_xcpt(0, "sp_tlong", x);
51 case IEEE754_CLASS_NORM:
52 break;
53 }
54 if (xe >= 63) {
55 SETCX(IEEE754_OVERFLOW);
56 return ieee754di_xcpt(ieee754di_indef(), "sp_tlong", x);
57 }
58 if (xe < 0) {
59 SETCX(IEEE754_UNDERFLOW);
60 return ieee754di_xcpt(0, "sp_tlong", x);
61 }
62 /* oh gawd */
63 if (xe > SP_MBITS) {
64 xm <<= xe - SP_MBITS;
65 } else if (xe < SP_MBITS) {
66 /* XXX no rounding
67 */
68 xm >>= SP_MBITS - xe;
69 }
70 if (xs)
71 return -xm;
72 else
73 return xm;
74 }
75
76
77 unsigned long long ieee754sp_tulong(ieee754sp x)
78 {
79 ieee754sp hb = ieee754sp_1e63();
80
81 /* what if x < 0 ?? */
82 if (ieee754sp_lt(x, hb))
83 return (unsigned long long) ieee754sp_tlong(x);
84
85 return (unsigned long long) ieee754sp_tlong(ieee754sp_sub(x, hb)) |
86 (1ULL << 63);
87 }
88