Linux Audio

Check our new training course

Loading...
v4.17
 
  1/*
  2 * IEEE754 floating point
  3 * common internal header file
  4 */
  5/*
  6 * MIPS floating point support
  7 * Copyright (C) 1994-2000 Algorithmics Ltd.
  8 *
  9 *  This program is free software; you can distribute it and/or modify it
 10 *  under the terms of the GNU General Public License (Version 2) as
 11 *  published by the Free Software Foundation.
 12 *
 13 *  This program is distributed in the hope it will be useful, but WITHOUT
 14 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 15 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 16 *  for more details.
 17 *
 18 *  You should have received a copy of the GNU General Public License along
 19 *  with this program; if not, write to the Free Software Foundation, Inc.,
 20 *  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 21 */
 22#ifndef __IEEE754INT_H
 23#define __IEEE754INT_H
 24
 25#include "ieee754.h"
 26
 27#define CLPAIR(x, y)	((x)*6+(y))
 28
 29enum maddf_flags {
 30	MADDF_NEGATE_PRODUCT	= 1 << 0,
 
 31};
 32
 33static inline void ieee754_clearcx(void)
 34{
 35	ieee754_csr.cx = 0;
 36}
 37
 38static inline void ieee754_setcx(const unsigned int flags)
 39{
 40	ieee754_csr.cx |= flags;
 41	ieee754_csr.sx |= flags;
 42}
 43
 44static inline int ieee754_setandtestcx(const unsigned int x)
 45{
 46	ieee754_setcx(x);
 47
 48	return ieee754_csr.mx & x;
 49}
 50
 51static inline int ieee754_class_nan(int xc)
 52{
 53	return xc >= IEEE754_CLASS_SNAN;
 54}
 55
 56#define COMPXSP \
 57	unsigned int xm; int xe; int xs __maybe_unused; int xc
 58
 59#define COMPYSP \
 60	unsigned int ym; int ye; int ys; int yc
 61
 62#define COMPZSP \
 63	unsigned int zm; int ze; int zs; int zc
 64
 65#define EXPLODESP(v, vc, vs, ve, vm)					\
 66{									\
 67	vs = SPSIGN(v);							\
 68	ve = SPBEXP(v);							\
 69	vm = SPMANT(v);							\
 70	if (ve == SP_EMAX+1+SP_EBIAS) {					\
 71		if (vm == 0)						\
 72			vc = IEEE754_CLASS_INF;				\
 73		else if (ieee754_csr.nan2008 ^ !(vm & SP_MBIT(SP_FBITS - 1))) \
 74			vc = IEEE754_CLASS_QNAN;			\
 75		else							\
 76			vc = IEEE754_CLASS_SNAN;			\
 77	} else if (ve == SP_EMIN-1+SP_EBIAS) {				\
 78		if (vm) {						\
 79			ve = SP_EMIN;					\
 80			vc = IEEE754_CLASS_DNORM;			\
 81		} else							\
 82			vc = IEEE754_CLASS_ZERO;			\
 83	} else {							\
 84		ve -= SP_EBIAS;						\
 85		vm |= SP_HIDDEN_BIT;					\
 86		vc = IEEE754_CLASS_NORM;				\
 87	}								\
 88}
 89#define EXPLODEXSP EXPLODESP(x, xc, xs, xe, xm)
 90#define EXPLODEYSP EXPLODESP(y, yc, ys, ye, ym)
 91#define EXPLODEZSP EXPLODESP(z, zc, zs, ze, zm)
 92
 93
 94#define COMPXDP \
 95	u64 xm; int xe; int xs __maybe_unused; int xc
 96
 97#define COMPYDP \
 98	u64 ym; int ye; int ys; int yc
 99
100#define COMPZDP \
101	u64 zm; int ze; int zs; int zc
102
103#define EXPLODEDP(v, vc, vs, ve, vm)					\
104{									\
105	vm = DPMANT(v);							\
106	vs = DPSIGN(v);							\
107	ve = DPBEXP(v);							\
108	if (ve == DP_EMAX+1+DP_EBIAS) {					\
109		if (vm == 0)						\
110			vc = IEEE754_CLASS_INF;				\
111		else if (ieee754_csr.nan2008 ^ !(vm & DP_MBIT(DP_FBITS - 1))) \
112			vc = IEEE754_CLASS_QNAN;			\
113		else							\
114			vc = IEEE754_CLASS_SNAN;			\
115	} else if (ve == DP_EMIN-1+DP_EBIAS) {				\
116		if (vm) {						\
117			ve = DP_EMIN;					\
118			vc = IEEE754_CLASS_DNORM;			\
119		} else							\
120			vc = IEEE754_CLASS_ZERO;			\
121	} else {							\
122		ve -= DP_EBIAS;						\
123		vm |= DP_HIDDEN_BIT;					\
124		vc = IEEE754_CLASS_NORM;				\
125	}								\
126}
127#define EXPLODEXDP EXPLODEDP(x, xc, xs, xe, xm)
128#define EXPLODEYDP EXPLODEDP(y, yc, ys, ye, ym)
129#define EXPLODEZDP EXPLODEDP(z, zc, zs, ze, zm)
130
131#define FLUSHDP(v, vc, vs, ve, vm)					\
132	if (vc==IEEE754_CLASS_DNORM) {					\
133		if (ieee754_csr.nod) {					\
134			ieee754_setcx(IEEE754_INEXACT);			\
135			vc = IEEE754_CLASS_ZERO;			\
136			ve = DP_EMIN-1+DP_EBIAS;			\
137			vm = 0;						\
138			v = ieee754dp_zero(vs);				\
139		}							\
140	}
141
142#define FLUSHSP(v, vc, vs, ve, vm)					\
143	if (vc==IEEE754_CLASS_DNORM) {					\
144		if (ieee754_csr.nod) {					\
145			ieee754_setcx(IEEE754_INEXACT);			\
146			vc = IEEE754_CLASS_ZERO;			\
147			ve = SP_EMIN-1+SP_EBIAS;			\
148			vm = 0;						\
149			v = ieee754sp_zero(vs);				\
150		}							\
151	}
152
153#define FLUSHXDP FLUSHDP(x, xc, xs, xe, xm)
154#define FLUSHYDP FLUSHDP(y, yc, ys, ye, ym)
155#define FLUSHZDP FLUSHDP(z, zc, zs, ze, zm)
156#define FLUSHXSP FLUSHSP(x, xc, xs, xe, xm)
157#define FLUSHYSP FLUSHSP(y, yc, ys, ye, ym)
158#define FLUSHZSP FLUSHSP(z, zc, zs, ze, zm)
159
160#endif /* __IEEE754INT_H  */
v6.2
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * IEEE754 floating point
  4 * common internal header file
  5 */
  6/*
  7 * MIPS floating point support
  8 * Copyright (C) 1994-2000 Algorithmics Ltd.
 
 
 
 
 
 
 
 
 
 
 
 
 
  9 */
 10#ifndef __IEEE754INT_H
 11#define __IEEE754INT_H
 12
 13#include "ieee754.h"
 14
 15#define CLPAIR(x, y)	((x)*6+(y))
 16
 17enum maddf_flags {
 18	MADDF_NEGATE_PRODUCT	= 1 << 0,
 19	MADDF_NEGATE_ADDITION	= 1 << 1,
 20};
 21
 22static inline void ieee754_clearcx(void)
 23{
 24	ieee754_csr.cx = 0;
 25}
 26
 27static inline void ieee754_setcx(const unsigned int flags)
 28{
 29	ieee754_csr.cx |= flags;
 30	ieee754_csr.sx |= flags;
 31}
 32
 33static inline int ieee754_setandtestcx(const unsigned int x)
 34{
 35	ieee754_setcx(x);
 36
 37	return ieee754_csr.mx & x;
 38}
 39
 40static inline int ieee754_class_nan(int xc)
 41{
 42	return xc >= IEEE754_CLASS_SNAN;
 43}
 44
 45#define COMPXSP \
 46	unsigned int xm; int xe; int xs __maybe_unused; int xc
 47
 48#define COMPYSP \
 49	unsigned int ym; int ye; int ys; int yc
 50
 51#define COMPZSP \
 52	unsigned int zm; int ze; int zs; int zc
 53
 54#define EXPLODESP(v, vc, vs, ve, vm)					\
 55{									\
 56	vs = SPSIGN(v);							\
 57	ve = SPBEXP(v);							\
 58	vm = SPMANT(v);							\
 59	if (ve == SP_EMAX+1+SP_EBIAS) {					\
 60		if (vm == 0)						\
 61			vc = IEEE754_CLASS_INF;				\
 62		else if (ieee754_csr.nan2008 ^ !(vm & SP_MBIT(SP_FBITS - 1))) \
 63			vc = IEEE754_CLASS_QNAN;			\
 64		else							\
 65			vc = IEEE754_CLASS_SNAN;			\
 66	} else if (ve == SP_EMIN-1+SP_EBIAS) {				\
 67		if (vm) {						\
 68			ve = SP_EMIN;					\
 69			vc = IEEE754_CLASS_DNORM;			\
 70		} else							\
 71			vc = IEEE754_CLASS_ZERO;			\
 72	} else {							\
 73		ve -= SP_EBIAS;						\
 74		vm |= SP_HIDDEN_BIT;					\
 75		vc = IEEE754_CLASS_NORM;				\
 76	}								\
 77}
 78#define EXPLODEXSP EXPLODESP(x, xc, xs, xe, xm)
 79#define EXPLODEYSP EXPLODESP(y, yc, ys, ye, ym)
 80#define EXPLODEZSP EXPLODESP(z, zc, zs, ze, zm)
 81
 82
 83#define COMPXDP \
 84	u64 xm; int xe; int xs __maybe_unused; int xc
 85
 86#define COMPYDP \
 87	u64 ym; int ye; int ys; int yc
 88
 89#define COMPZDP \
 90	u64 zm; int ze; int zs; int zc
 91
 92#define EXPLODEDP(v, vc, vs, ve, vm)					\
 93{									\
 94	vm = DPMANT(v);							\
 95	vs = DPSIGN(v);							\
 96	ve = DPBEXP(v);							\
 97	if (ve == DP_EMAX+1+DP_EBIAS) {					\
 98		if (vm == 0)						\
 99			vc = IEEE754_CLASS_INF;				\
100		else if (ieee754_csr.nan2008 ^ !(vm & DP_MBIT(DP_FBITS - 1))) \
101			vc = IEEE754_CLASS_QNAN;			\
102		else							\
103			vc = IEEE754_CLASS_SNAN;			\
104	} else if (ve == DP_EMIN-1+DP_EBIAS) {				\
105		if (vm) {						\
106			ve = DP_EMIN;					\
107			vc = IEEE754_CLASS_DNORM;			\
108		} else							\
109			vc = IEEE754_CLASS_ZERO;			\
110	} else {							\
111		ve -= DP_EBIAS;						\
112		vm |= DP_HIDDEN_BIT;					\
113		vc = IEEE754_CLASS_NORM;				\
114	}								\
115}
116#define EXPLODEXDP EXPLODEDP(x, xc, xs, xe, xm)
117#define EXPLODEYDP EXPLODEDP(y, yc, ys, ye, ym)
118#define EXPLODEZDP EXPLODEDP(z, zc, zs, ze, zm)
119
120#define FLUSHDP(v, vc, vs, ve, vm)					\
121	if (vc==IEEE754_CLASS_DNORM) {					\
122		if (ieee754_csr.nod) {					\
123			ieee754_setcx(IEEE754_INEXACT);			\
124			vc = IEEE754_CLASS_ZERO;			\
125			ve = DP_EMIN-1+DP_EBIAS;			\
126			vm = 0;						\
127			v = ieee754dp_zero(vs);				\
128		}							\
129	}
130
131#define FLUSHSP(v, vc, vs, ve, vm)					\
132	if (vc==IEEE754_CLASS_DNORM) {					\
133		if (ieee754_csr.nod) {					\
134			ieee754_setcx(IEEE754_INEXACT);			\
135			vc = IEEE754_CLASS_ZERO;			\
136			ve = SP_EMIN-1+SP_EBIAS;			\
137			vm = 0;						\
138			v = ieee754sp_zero(vs);				\
139		}							\
140	}
141
142#define FLUSHXDP FLUSHDP(x, xc, xs, xe, xm)
143#define FLUSHYDP FLUSHDP(y, yc, ys, ye, ym)
144#define FLUSHZDP FLUSHDP(z, zc, zs, ze, zm)
145#define FLUSHXSP FLUSHSP(x, xc, xs, xe, xm)
146#define FLUSHYSP FLUSHSP(y, yc, ys, ye, ym)
147#define FLUSHZSP FLUSHSP(z, zc, zs, ze, zm)
148
149#endif /* __IEEE754INT_H  */