Linux Audio

Check our new training course

Loading...
v3.1
 
 1/* IEEE754 floating point arithmetic
 2 * single precision
 3 */
 4/*
 5 * MIPS floating point support
 6 * Copyright (C) 1994-2000 Algorithmics Ltd.
 7 *
 8 * ########################################################################
 9 *
10 *  This program is free software; you can distribute it and/or modify it
11 *  under the terms of the GNU General Public License (Version 2) as
12 *  published by the Free Software Foundation.
13 *
14 *  This program is distributed in the hope it will be useful, but WITHOUT
15 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 *  for more details.
18 *
19 *  You should have received a copy of the GNU General Public License along
20 *  with this program; if not, write to the Free Software Foundation, Inc.,
21 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
22 *
23 * ########################################################################
24 */
25
26
27#include "ieee754sp.h"
 
 
 
 
 
 
 
28
29ieee754sp ieee754sp_fdp(ieee754dp x)
30{
 
 
 
31	COMPXDP;
32	ieee754sp nan;
33
34	EXPLODEXDP;
35
36	CLEARCX;
37
38	FLUSHXDP;
39
40	switch (xc) {
41	case IEEE754_CLASS_SNAN:
42		SETCX(IEEE754_INVALID_OPERATION);
43		return ieee754sp_nanxcpt(ieee754sp_indef(), "fdp");
 
 
44	case IEEE754_CLASS_QNAN:
45		nan = buildsp(xs, SP_EMAX + 1 + SP_EBIAS, (u32)
46				(xm >> (DP_MBITS - SP_MBITS)));
47		if (!ieee754sp_isnan(nan))
48			nan = ieee754sp_indef();
49		return ieee754sp_nanxcpt(nan, "fdp", x);
 
 
 
50	case IEEE754_CLASS_INF:
51		return ieee754sp_inf(xs);
 
52	case IEEE754_CLASS_ZERO:
53		return ieee754sp_zero(xs);
 
54	case IEEE754_CLASS_DNORM:
55		/* can't possibly be sp representable */
56		SETCX(IEEE754_UNDERFLOW);
57		SETCX(IEEE754_INEXACT);
58		if ((ieee754_csr.rm == IEEE754_RU && !xs) ||
59				(ieee754_csr.rm == IEEE754_RD && xs))
60			return ieee754sp_xcpt(ieee754sp_mind(xs), "fdp", x);
61		return ieee754sp_xcpt(ieee754sp_zero(xs), "fdp", x);
 
62	case IEEE754_CLASS_NORM:
63		break;
64	}
65
66	{
67		u32 rm;
68
69		/* convert from DP_MBITS to SP_MBITS+3 with sticky right shift
70		 */
71		rm = (xm >> (DP_MBITS - (SP_MBITS + 3))) |
72		    ((xm << (64 - (DP_MBITS - (SP_MBITS + 3)))) != 0);
73
74		SPNORMRET1(xs, xe, rm, "fdp", x);
75	}
76}
v5.4
 1// SPDX-License-Identifier: GPL-2.0-only
 2/* IEEE754 floating point arithmetic
 3 * single precision
 4 */
 5/*
 6 * MIPS floating point support
 7 * Copyright (C) 1994-2000 Algorithmics Ltd.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 8 */
 9
 
10#include "ieee754sp.h"
11#include "ieee754dp.h"
12
13static inline union ieee754sp ieee754sp_nan_fdp(int xs, u64 xm)
14{
15	return buildsp(xs, SP_EMAX + 1 + SP_EBIAS,
16		       xm >> (DP_FBITS - SP_FBITS));
17}
18
19union ieee754sp ieee754sp_fdp(union ieee754dp x)
20{
21	union ieee754sp y;
22	u32 rm;
23
24	COMPXDP;
25	COMPYSP;
26
27	EXPLODEXDP;
28
29	ieee754_clearcx();
30
31	FLUSHXDP;
32
33	switch (xc) {
34	case IEEE754_CLASS_SNAN:
35		x = ieee754dp_nanxcpt(x);
36		EXPLODEXDP;
37		/* fall through */
38
39	case IEEE754_CLASS_QNAN:
40		y = ieee754sp_nan_fdp(xs, xm);
41		if (!ieee754_csr.nan2008) {
42			EXPLODEYSP;
43			if (!ieee754_class_nan(yc))
44				y = ieee754sp_indef();
45		}
46		return y;
47
48	case IEEE754_CLASS_INF:
49		return ieee754sp_inf(xs);
50
51	case IEEE754_CLASS_ZERO:
52		return ieee754sp_zero(xs);
53
54	case IEEE754_CLASS_DNORM:
55		/* can't possibly be sp representable */
56		ieee754_setcx(IEEE754_UNDERFLOW);
57		ieee754_setcx(IEEE754_INEXACT);
58		if ((ieee754_csr.rm == FPU_CSR_RU && !xs) ||
59				(ieee754_csr.rm == FPU_CSR_RD && xs))
60			return ieee754sp_mind(xs);
61		return ieee754sp_zero(xs);
62
63	case IEEE754_CLASS_NORM:
64		break;
65	}
66
67	/*
68	 * Convert from DP_FBITS to SP_FBITS+3 with sticky right shift.
69	 */
70	rm = (xm >> (DP_FBITS - (SP_FBITS + 3))) |
71	     ((xm << (64 - (DP_FBITS - (SP_FBITS + 3)))) != 0);
 
 
72
73	return ieee754sp_format(xs, xe, rm);
 
74}