Linux Audio

Check our new training course

In-person Linux kernel drivers training

Jun 16-20, 2025
Register
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
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}
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
12union ieee754sp ieee754sp_neg(union ieee754sp x)
 
 
 
 
 
13{
14	union ieee754sp y;
 
 
 
 
15
16	if (ieee754_csr.abs2008) {
17		y = x;
18		SPSIGN(y) = !SPSIGN(x);
19	} else {
20		unsigned int oldrm;
21
22		oldrm = ieee754_csr.rm;
23		ieee754_csr.rm = FPU_CSR_RD;
24		y = ieee754sp_sub(ieee754sp_zero(0), x);
25		ieee754_csr.rm = oldrm;
 
 
 
 
 
 
 
 
 
 
26	}
27	return y;
 
28}
29
30union ieee754sp ieee754sp_abs(union ieee754sp x)
 
31{
32	union ieee754sp y;
33
34	if (ieee754_csr.abs2008) {
35		y = x;
36		SPSIGN(y) = 0;
37	} else {
38		unsigned int oldrm;
39
40		oldrm = ieee754_csr.rm;
41		ieee754_csr.rm = FPU_CSR_RD;
42		if (SPSIGN(x))
43			y = ieee754sp_sub(ieee754sp_zero(0), x);
44		else
45			y = ieee754sp_add(ieee754sp_zero(0), x);
46		ieee754_csr.rm = oldrm;
47	}
48	return y;
 
49}