Linux Audio

Check our new training course

Embedded Linux training

Mar 31-Apr 8, 2025
Register
Loading...
v4.17
 1/* IEEE754 floating point arithmetic
 2 * single precision
 3 */
 4/*
 5 * MIPS floating point support
 6 * Copyright (C) 1994-2000 Algorithmics Ltd.
 7 *
 
 
 8 *  This program is free software; you can distribute it and/or modify it
 9 *  under the terms of the GNU General Public License (Version 2) as
10 *  published by the Free Software Foundation.
11 *
12 *  This program is distributed in the hope it will be useful, but WITHOUT
13 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 *  for more details.
16 *
17 *  You should have received a copy of the GNU General Public License along
18 *  with this program; if not, write to the Free Software Foundation, Inc.,
19 *  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
 
20 */
21
 
22#include "ieee754sp.h"
23
24union ieee754sp ieee754sp_neg(union ieee754sp x)
25{
26	union ieee754sp y;
 
 
 
 
 
 
 
 
27
28	if (ieee754_csr.abs2008) {
29		y = x;
30		SPSIGN(y) = !SPSIGN(x);
31	} else {
32		unsigned int oldrm;
33
34		oldrm = ieee754_csr.rm;
35		ieee754_csr.rm = FPU_CSR_RD;
36		y = ieee754sp_sub(ieee754sp_zero(0), x);
37		ieee754_csr.rm = oldrm;
 
 
 
 
 
 
 
 
 
 
 
38	}
39	return y;
 
40}
41
42union ieee754sp ieee754sp_abs(union ieee754sp x)
 
43{
44	union ieee754sp y;
45
46	if (ieee754_csr.abs2008) {
47		y = x;
48		SPSIGN(y) = 0;
49	} else {
50		unsigned int oldrm;
51
52		oldrm = ieee754_csr.rm;
53		ieee754_csr.rm = FPU_CSR_RD;
54		if (SPSIGN(x))
55			y = ieee754sp_sub(ieee754sp_zero(0), x);
56		else
57			y = ieee754sp_add(ieee754sp_zero(0), x);
58		ieee754_csr.rm = oldrm;
59	}
60	return y;
 
61}
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
29int ieee754sp_finite(ieee754sp x)
30{
31	return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS;
32}
33
34ieee754sp ieee754sp_copysign(ieee754sp x, ieee754sp y)
35{
36	CLEARCX;
37	SPSIGN(x) = SPSIGN(y);
38	return x;
39}
40
41
42ieee754sp ieee754sp_neg(ieee754sp x)
43{
44	COMPXSP;
45
46	EXPLODEXSP;
47	CLEARCX;
48	FLUSHXSP;
49
50	/*
51	 * Invert the sign ALWAYS to prevent an endless recursion on
52	 * pow() in libc.
53	 */
54	/* quick fix up */
55	SPSIGN(x) ^= 1;
56
57	if (xc == IEEE754_CLASS_SNAN) {
58		ieee754sp y = ieee754sp_indef();
59		SETCX(IEEE754_INVALID_OPERATION);
60		SPSIGN(y) = SPSIGN(x);
61		return ieee754sp_nanxcpt(y, "neg");
62	}
63
64	return x;
65}
66
67
68ieee754sp ieee754sp_abs(ieee754sp x)
69{
70	COMPXSP;
71
72	EXPLODEXSP;
73	CLEARCX;
74	FLUSHXSP;
75
76	/* Clear sign ALWAYS, irrespective of NaN */
77	SPSIGN(x) = 0;
78
79	if (xc == IEEE754_CLASS_SNAN) {
80		SETCX(IEEE754_INVALID_OPERATION);
81		return ieee754sp_nanxcpt(ieee754sp_indef(), "abs");
 
 
 
82	}
83
84	return x;
85}