Linux Audio

Check our new training course

Loading...
v3.15
  1/* ieee754 floating point arithmetic
  2 * single and double precision
  3 *
  4 * BUGS
  5 * not much dp done
  6 * doesn't generate IEEE754_INEXACT
  7 *
  8 */
  9/*
 10 * MIPS floating point support
 11 * Copyright (C) 1994-2000 Algorithmics Ltd.
 12 *
 13 * ########################################################################
 14 *
 15 *  This program is free software; you can distribute it and/or modify it
 16 *  under the terms of the GNU General Public License (Version 2) as
 17 *  published by the Free Software Foundation.
 18 *
 19 *  This program is distributed in the hope it will be useful, but WITHOUT
 20 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 21 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 22 *  for more details.
 23 *
 24 *  You should have received a copy of the GNU General Public License along
 25 *  with this program; if not, write to the Free Software Foundation, Inc.,
 26 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
 27 *
 28 * ########################################################################
 29 */
 30
 31
 32#include "ieee754int.h"
 33#include "ieee754sp.h"
 34#include "ieee754dp.h"
 35
 36#define DP_EBIAS	1023
 37#define DP_EMIN		(-1022)
 38#define DP_EMAX		1023
 39
 40#define SP_EBIAS	127
 41#define SP_EMIN		(-126)
 42#define SP_EMAX		127
 43
 44/* special constants
 45*/
 46
 47
 48#if (defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN) || defined(__MIPSEL__)
 49#define SPSTR(s, b, m) {m, b, s}
 50#define DPSTR(s, b, mh, ml) {ml, mh, b, s}
 51#endif
 52
 53#ifdef __MIPSEB__
 54#define SPSTR(s, b, m) {s, b, m}
 55#define DPSTR(s, b, mh, ml) {s, b, mh, ml}
 56#endif
 57
 58const struct ieee754dp_konst __ieee754dp_spcvals[] = {
 59	DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 0), /* + zero   */
 60	DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 0), /* - zero   */
 61	DPSTR(0, DP_EBIAS, 0, 0),	/* + 1.0   */
 62	DPSTR(1, DP_EBIAS, 0, 0),	/* - 1.0   */
 63	DPSTR(0, 3 + DP_EBIAS, 0x40000, 0),	/* + 10.0   */
 64	DPSTR(1, 3 + DP_EBIAS, 0x40000, 0),	/* - 10.0   */
 65	DPSTR(0, DP_EMAX + 1 + DP_EBIAS, 0, 0), /* + infinity */
 66	DPSTR(1, DP_EMAX + 1 + DP_EBIAS, 0, 0), /* - infinity */
 67	DPSTR(0, DP_EMAX+1+DP_EBIAS, 0x7FFFF, 0xFFFFFFFF), /* + indef quiet Nan */
 68	DPSTR(0, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF),	/* + max */
 69	DPSTR(1, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF),	/* - max */
 70	DPSTR(0, DP_EMIN + DP_EBIAS, 0, 0),	/* + min normal */
 71	DPSTR(1, DP_EMIN + DP_EBIAS, 0, 0),	/* - min normal */
 72	DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 1), /* + min denormal */
 73	DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 1), /* - min denormal */
 74	DPSTR(0, 31 + DP_EBIAS, 0, 0),	/* + 1.0e31 */
 75	DPSTR(0, 63 + DP_EBIAS, 0, 0),	/* + 1.0e63 */
 76};
 77
 78const struct ieee754sp_konst __ieee754sp_spcvals[] = {
 79	SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 0),	/* + zero   */
 80	SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 0),	/* - zero   */
 81	SPSTR(0, SP_EBIAS, 0),	/* + 1.0   */
 82	SPSTR(1, SP_EBIAS, 0),	/* - 1.0   */
 83	SPSTR(0, 3 + SP_EBIAS, 0x200000),	/* + 10.0   */
 84	SPSTR(1, 3 + SP_EBIAS, 0x200000),	/* - 10.0   */
 85	SPSTR(0, SP_EMAX + 1 + SP_EBIAS, 0),	/* + infinity */
 86	SPSTR(1, SP_EMAX + 1 + SP_EBIAS, 0),	/* - infinity */
 87	SPSTR(0, SP_EMAX+1+SP_EBIAS, 0x3FFFFF),	    /* + indef quiet Nan  */
 88	SPSTR(0, SP_EMAX + SP_EBIAS, 0x7FFFFF), /* + max normal */
 89	SPSTR(1, SP_EMAX + SP_EBIAS, 0x7FFFFF), /* - max normal */
 90	SPSTR(0, SP_EMIN + SP_EBIAS, 0),	/* + min normal */
 91	SPSTR(1, SP_EMIN + SP_EBIAS, 0),	/* - min normal */
 92	SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 1),	/* + min denormal */
 93	SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 1),	/* - min denormal */
 94	SPSTR(0, 31 + SP_EBIAS, 0),	/* + 1.0e31 */
 95	SPSTR(0, 63 + SP_EBIAS, 0),	/* + 1.0e63 */
 96};
 97
 98
 99int ieee754si_xcpt(int r, const char *op, ...)
100{
101	struct ieee754xctx ax;
102
103	if (!TSTX())
104		return r;
105	ax.op = op;
106	ax.rt = IEEE754_RT_SI;
107	ax.rv.si = r;
108	va_start(ax.ap, op);
109	ieee754_xcpt(&ax);
110	va_end(ax.ap);
111	return ax.rv.si;
112}
113
114s64 ieee754di_xcpt(s64 r, const char *op, ...)
115{
116	struct ieee754xctx ax;
117
118	if (!TSTX())
119		return r;
120	ax.op = op;
121	ax.rt = IEEE754_RT_DI;
122	ax.rv.di = r;
123	va_start(ax.ap, op);
124	ieee754_xcpt(&ax);
125	va_end(ax.ap);
126	return ax.rv.di;
127}
v3.1
  1/* ieee754 floating point arithmetic
  2 * single and double precision
  3 *
  4 * BUGS
  5 * not much dp done
  6 * doesn't generate IEEE754_INEXACT
  7 *
  8 */
  9/*
 10 * MIPS floating point support
 11 * Copyright (C) 1994-2000 Algorithmics Ltd.
 12 *
 13 * ########################################################################
 14 *
 15 *  This program is free software; you can distribute it and/or modify it
 16 *  under the terms of the GNU General Public License (Version 2) as
 17 *  published by the Free Software Foundation.
 18 *
 19 *  This program is distributed in the hope it will be useful, but WITHOUT
 20 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 21 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 22 *  for more details.
 23 *
 24 *  You should have received a copy of the GNU General Public License along
 25 *  with this program; if not, write to the Free Software Foundation, Inc.,
 26 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
 27 *
 28 * ########################################################################
 29 */
 30
 31
 32#include "ieee754int.h"
 33#include "ieee754sp.h"
 34#include "ieee754dp.h"
 35
 36#define DP_EBIAS	1023
 37#define DP_EMIN		(-1022)
 38#define DP_EMAX		1023
 39
 40#define SP_EBIAS	127
 41#define SP_EMIN		(-126)
 42#define SP_EMAX		127
 43
 44/* special constants
 45*/
 46
 47
 48#if (defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN) || defined(__MIPSEL__)
 49#define SPSTR(s, b, m) {m, b, s}
 50#define DPSTR(s, b, mh, ml) {ml, mh, b, s}
 51#endif
 52
 53#ifdef __MIPSEB__
 54#define SPSTR(s, b, m) {s, b, m}
 55#define DPSTR(s, b, mh, ml) {s, b, mh, ml}
 56#endif
 57
 58const struct ieee754dp_konst __ieee754dp_spcvals[] = {
 59	DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 0),	/* + zero   */
 60	DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 0),	/* - zero   */
 61	DPSTR(0, DP_EBIAS, 0, 0),	/* + 1.0   */
 62	DPSTR(1, DP_EBIAS, 0, 0),	/* - 1.0   */
 63	DPSTR(0, 3 + DP_EBIAS, 0x40000, 0),	/* + 10.0   */
 64	DPSTR(1, 3 + DP_EBIAS, 0x40000, 0),	/* - 10.0   */
 65	DPSTR(0, DP_EMAX + 1 + DP_EBIAS, 0, 0),	/* + infinity */
 66	DPSTR(1, DP_EMAX + 1 + DP_EBIAS, 0, 0),	/* - infinity */
 67	DPSTR(0, DP_EMAX+1+DP_EBIAS, 0x7FFFF, 0xFFFFFFFF), /* + indef quiet Nan */
 68	DPSTR(0, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF),	/* + max */
 69	DPSTR(1, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF),	/* - max */
 70	DPSTR(0, DP_EMIN + DP_EBIAS, 0, 0),	/* + min normal */
 71	DPSTR(1, DP_EMIN + DP_EBIAS, 0, 0),	/* - min normal */
 72	DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 1),	/* + min denormal */
 73	DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 1),	/* - min denormal */
 74	DPSTR(0, 31 + DP_EBIAS, 0, 0),	/* + 1.0e31 */
 75	DPSTR(0, 63 + DP_EBIAS, 0, 0),	/* + 1.0e63 */
 76};
 77
 78const struct ieee754sp_konst __ieee754sp_spcvals[] = {
 79	SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 0),	/* + zero   */
 80	SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 0),	/* - zero   */
 81	SPSTR(0, SP_EBIAS, 0),	/* + 1.0   */
 82	SPSTR(1, SP_EBIAS, 0),	/* - 1.0   */
 83	SPSTR(0, 3 + SP_EBIAS, 0x200000),	/* + 10.0   */
 84	SPSTR(1, 3 + SP_EBIAS, 0x200000),	/* - 10.0   */
 85	SPSTR(0, SP_EMAX + 1 + SP_EBIAS, 0),	/* + infinity */
 86	SPSTR(1, SP_EMAX + 1 + SP_EBIAS, 0),	/* - infinity */
 87	SPSTR(0, SP_EMAX+1+SP_EBIAS, 0x3FFFFF),     /* + indef quiet Nan  */
 88	SPSTR(0, SP_EMAX + SP_EBIAS, 0x7FFFFF),	/* + max normal */
 89	SPSTR(1, SP_EMAX + SP_EBIAS, 0x7FFFFF),	/* - max normal */
 90	SPSTR(0, SP_EMIN + SP_EBIAS, 0),	/* + min normal */
 91	SPSTR(1, SP_EMIN + SP_EBIAS, 0),	/* - min normal */
 92	SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 1),	/* + min denormal */
 93	SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 1),	/* - min denormal */
 94	SPSTR(0, 31 + SP_EBIAS, 0),	/* + 1.0e31 */
 95	SPSTR(0, 63 + SP_EBIAS, 0),	/* + 1.0e63 */
 96};
 97
 98
 99int ieee754si_xcpt(int r, const char *op, ...)
100{
101	struct ieee754xctx ax;
102
103	if (!TSTX())
104		return r;
105	ax.op = op;
106	ax.rt = IEEE754_RT_SI;
107	ax.rv.si = r;
108	va_start(ax.ap, op);
109	ieee754_xcpt(&ax);
110	va_end(ax.ap);
111	return ax.rv.si;
112}
113
114s64 ieee754di_xcpt(s64 r, const char *op, ...)
115{
116	struct ieee754xctx ax;
117
118	if (!TSTX())
119		return r;
120	ax.op = op;
121	ax.rt = IEEE754_RT_DI;
122	ax.rv.di = r;
123	va_start(ax.ap, op);
124	ieee754_xcpt(&ax);
125	va_end(ax.ap);
126	return ax.rv.di;
127}