Linux Audio

Check our new training course

Loading...
v3.15
 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}
v3.5.6
 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}