Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * IEEE754 floating point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * common internal header file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * MIPS floating point support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * Copyright (C) 1994-2000 Algorithmics Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #ifndef __IEEE754INT_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #define __IEEE754INT_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "ieee754.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #define CLPAIR(x, y)	((x)*6+(y))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) enum maddf_flags {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	MADDF_NEGATE_PRODUCT	= 1 << 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	MADDF_NEGATE_ADDITION	= 1 << 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) static inline void ieee754_clearcx(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	ieee754_csr.cx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) static inline void ieee754_setcx(const unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	ieee754_csr.cx |= flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	ieee754_csr.sx |= flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) static inline int ieee754_setandtestcx(const unsigned int x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	ieee754_setcx(x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	return ieee754_csr.mx & x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) static inline int ieee754_class_nan(int xc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	return xc >= IEEE754_CLASS_SNAN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define COMPXSP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	unsigned int xm; int xe; int xs __maybe_unused; int xc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) #define COMPYSP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	unsigned int ym; int ye; int ys; int yc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) #define COMPZSP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	unsigned int zm; int ze; int zs; int zc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) #define EXPLODESP(v, vc, vs, ve, vm)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) {									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	vs = SPSIGN(v);							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	ve = SPBEXP(v);							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	vm = SPMANT(v);							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	if (ve == SP_EMAX+1+SP_EBIAS) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 		if (vm == 0)						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 			vc = IEEE754_CLASS_INF;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		else if (ieee754_csr.nan2008 ^ !(vm & SP_MBIT(SP_FBITS - 1))) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 			vc = IEEE754_CLASS_QNAN;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		else							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 			vc = IEEE754_CLASS_SNAN;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	} else if (ve == SP_EMIN-1+SP_EBIAS) {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 		if (vm) {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 			ve = SP_EMIN;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 			vc = IEEE754_CLASS_DNORM;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		} else							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 			vc = IEEE754_CLASS_ZERO;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	} else {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		ve -= SP_EBIAS;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 		vm |= SP_HIDDEN_BIT;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		vc = IEEE754_CLASS_NORM;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	}								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) #define EXPLODEXSP EXPLODESP(x, xc, xs, xe, xm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) #define EXPLODEYSP EXPLODESP(y, yc, ys, ye, ym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) #define EXPLODEZSP EXPLODESP(z, zc, zs, ze, zm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) #define COMPXDP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	u64 xm; int xe; int xs __maybe_unused; int xc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) #define COMPYDP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	u64 ym; int ye; int ys; int yc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) #define COMPZDP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	u64 zm; int ze; int zs; int zc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) #define EXPLODEDP(v, vc, vs, ve, vm)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) {									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	vm = DPMANT(v);							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	vs = DPSIGN(v);							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	ve = DPBEXP(v);							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	if (ve == DP_EMAX+1+DP_EBIAS) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		if (vm == 0)						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 			vc = IEEE754_CLASS_INF;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		else if (ieee754_csr.nan2008 ^ !(vm & DP_MBIT(DP_FBITS - 1))) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 			vc = IEEE754_CLASS_QNAN;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 		else							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 			vc = IEEE754_CLASS_SNAN;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	} else if (ve == DP_EMIN-1+DP_EBIAS) {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		if (vm) {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 			ve = DP_EMIN;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 			vc = IEEE754_CLASS_DNORM;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		} else							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 			vc = IEEE754_CLASS_ZERO;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	} else {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 		ve -= DP_EBIAS;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		vm |= DP_HIDDEN_BIT;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		vc = IEEE754_CLASS_NORM;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	}								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define EXPLODEXDP EXPLODEDP(x, xc, xs, xe, xm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define EXPLODEYDP EXPLODEDP(y, yc, ys, ye, ym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define EXPLODEZDP EXPLODEDP(z, zc, zs, ze, zm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define FLUSHDP(v, vc, vs, ve, vm)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	if (vc==IEEE754_CLASS_DNORM) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 		if (ieee754_csr.nod) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 			ieee754_setcx(IEEE754_INEXACT);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 			vc = IEEE754_CLASS_ZERO;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 			ve = DP_EMIN-1+DP_EBIAS;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 			vm = 0;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 			v = ieee754dp_zero(vs);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 		}							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define FLUSHSP(v, vc, vs, ve, vm)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	if (vc==IEEE754_CLASS_DNORM) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 		if (ieee754_csr.nod) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 			ieee754_setcx(IEEE754_INEXACT);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 			vc = IEEE754_CLASS_ZERO;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 			ve = SP_EMIN-1+SP_EBIAS;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 			vm = 0;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 			v = ieee754sp_zero(vs);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		}							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define FLUSHXDP FLUSHDP(x, xc, xs, xe, xm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define FLUSHYDP FLUSHDP(y, yc, ys, ye, ym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define FLUSHZDP FLUSHDP(z, zc, zs, ze, zm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define FLUSHXSP FLUSHSP(x, xc, xs, xe, xm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define FLUSHYSP FLUSHSP(y, yc, ys, ye, ym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define FLUSHZSP FLUSHSP(z, zc, zs, ze, zm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #endif /* __IEEE754INT_H  */