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)  * MIPS floating point support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (C) 1994-2000 Algorithmics Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *  Nov 7, 2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *  Modification to allow integration with Linux kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  *  Kevin D. Kissell, kevink@mips.com and Carsten Langgard, carstenl@mips.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *  Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #ifndef __ARCH_MIPS_MATH_EMU_IEEE754_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #define __ARCH_MIPS_MATH_EMU_IEEE754_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <asm/byteorder.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <asm/bitfield.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) union ieee754dp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 		__BITFIELD_FIELD(unsigned int sign:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 		__BITFIELD_FIELD(unsigned int bexp:11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 		__BITFIELD_FIELD(u64 mant:52,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 		;)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	u64 bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) union ieee754sp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 		__BITFIELD_FIELD(unsigned sign:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 		__BITFIELD_FIELD(unsigned bexp:8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 		__BITFIELD_FIELD(unsigned mant:23,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 		;)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	u32 bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  * single precision (often aka float)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) int ieee754sp_class(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) union ieee754sp ieee754sp_abs(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) union ieee754sp ieee754sp_neg(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) union ieee754sp ieee754sp_add(union ieee754sp x, union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) union ieee754sp ieee754sp_sub(union ieee754sp x, union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) union ieee754sp ieee754sp_mul(union ieee754sp x, union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) union ieee754sp ieee754sp_div(union ieee754sp x, union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) union ieee754sp ieee754sp_fint(int x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) union ieee754sp ieee754sp_flong(s64 x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) union ieee754sp ieee754sp_fdp(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) union ieee754sp ieee754sp_rint(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) int ieee754sp_tint(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) s64 ieee754sp_tlong(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) int ieee754sp_cmp(union ieee754sp x, union ieee754sp y, int cop, int sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) union ieee754sp ieee754sp_sqrt(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) union ieee754sp ieee754sp_maddf(union ieee754sp z, union ieee754sp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 				union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) union ieee754sp ieee754sp_msubf(union ieee754sp z, union ieee754sp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 				union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) union ieee754sp ieee754sp_madd(union ieee754sp z, union ieee754sp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 				union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) union ieee754sp ieee754sp_msub(union ieee754sp z, union ieee754sp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 				union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) union ieee754sp ieee754sp_nmadd(union ieee754sp z, union ieee754sp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 				union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) union ieee754sp ieee754sp_nmsub(union ieee754sp z, union ieee754sp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 				union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) int ieee754sp_2008class(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) union ieee754sp ieee754sp_fmin(union ieee754sp x, union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) union ieee754sp ieee754sp_fmax(union ieee754sp x, union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)  * double precision (often aka double)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) int ieee754dp_class(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) union ieee754dp ieee754dp_add(union ieee754dp x, union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) union ieee754dp ieee754dp_mul(union ieee754dp x, union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) union ieee754dp ieee754dp_abs(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) union ieee754dp ieee754dp_neg(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) union ieee754dp ieee754dp_fint(int x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) union ieee754dp ieee754dp_flong(s64 x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) union ieee754dp ieee754dp_fsp(union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) union ieee754dp ieee754dp_rint(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) int ieee754dp_tint(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) s64 ieee754dp_tlong(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) int ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cop, int sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) union ieee754dp ieee754dp_sqrt(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) union ieee754dp ieee754dp_maddf(union ieee754dp z, union ieee754dp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 				union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) union ieee754dp ieee754dp_msubf(union ieee754dp z, union ieee754dp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 				union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) union ieee754dp ieee754dp_madd(union ieee754dp z, union ieee754dp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 				union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) union ieee754dp ieee754dp_msub(union ieee754dp z, union ieee754dp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 				union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) union ieee754dp ieee754dp_nmadd(union ieee754dp z, union ieee754dp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 				union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) union ieee754dp ieee754dp_nmsub(union ieee754dp z, union ieee754dp x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 				union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) int ieee754dp_2008class(union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) union ieee754dp ieee754dp_fmax(union ieee754dp x, union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* 5 types of floating point number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	IEEE754_CLASS_NORM	= 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	IEEE754_CLASS_ZERO	= 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	IEEE754_CLASS_DNORM	= 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	IEEE754_CLASS_INF	= 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	IEEE754_CLASS_SNAN	= 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	IEEE754_CLASS_QNAN	= 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* exception numbers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define IEEE754_INEXACT			0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define IEEE754_UNDERFLOW		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define IEEE754_OVERFLOW		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define IEEE754_ZERO_DIVIDE		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define IEEE754_INVALID_OPERATION	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* cmp operators
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define IEEE754_CLT	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define IEEE754_CEQ	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define IEEE754_CGT	0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define IEEE754_CUN	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)  * The control status register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) struct _ieee754_csr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	__BITFIELD_FIELD(unsigned fcc:7,	/* condition[7:1] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	__BITFIELD_FIELD(unsigned nod:1,	/* set 1 for no denormals */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	__BITFIELD_FIELD(unsigned c:1,		/* condition[0] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	__BITFIELD_FIELD(unsigned pad0:3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	__BITFIELD_FIELD(unsigned abs2008:1,	/* IEEE 754-2008 ABS/NEG.fmt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	__BITFIELD_FIELD(unsigned nan2008:1,	/* IEEE 754-2008 NaN mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	__BITFIELD_FIELD(unsigned cx:6,		/* exceptions this operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	__BITFIELD_FIELD(unsigned mx:5,		/* exception enable  mask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	__BITFIELD_FIELD(unsigned sx:5,		/* exceptions total */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	__BITFIELD_FIELD(unsigned rm:2,		/* current rounding mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	;))))))))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define ieee754_csr (*(struct _ieee754_csr *)(&current->thread.fpu.fcr31))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) static inline unsigned int ieee754_getrm(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	return (ieee754_csr.rm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) static inline unsigned int ieee754_setrm(unsigned int rm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	return (ieee754_csr.rm = rm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)  * get current exceptions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) static inline unsigned int ieee754_getcx(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	return (ieee754_csr.cx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) /* test for current exception condition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) static inline int ieee754_cxtest(unsigned int n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	return (ieee754_csr.cx & n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)  * get sticky exceptions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) static inline unsigned int ieee754_getsx(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	return (ieee754_csr.sx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) /* clear sticky conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) static inline unsigned int ieee754_clrsx(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	return (ieee754_csr.sx = 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* test for sticky exception condition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static inline int ieee754_sxtest(unsigned int n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	return (ieee754_csr.sx & n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /* debugging */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) union ieee754sp ieee754sp_dump(char *s, union ieee754sp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) union ieee754dp ieee754dp_dump(char *s, union ieee754dp x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define IEEE754_SPCVAL_PZERO		0	/* +0.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) #define IEEE754_SPCVAL_NZERO		1	/* -0.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define IEEE754_SPCVAL_PONE		2	/* +1.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) #define IEEE754_SPCVAL_NONE		3	/* -1.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) #define IEEE754_SPCVAL_PTEN		4	/* +10.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) #define IEEE754_SPCVAL_NTEN		5	/* -10.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) #define IEEE754_SPCVAL_PINFINITY	6	/* +inf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) #define IEEE754_SPCVAL_NINFINITY	7	/* -inf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #define IEEE754_SPCVAL_INDEF_LEG	8	/* legacy quiet NaN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) #define IEEE754_SPCVAL_INDEF_2008	9	/* IEEE 754-2008 quiet NaN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define IEEE754_SPCVAL_PMAX		10	/* +max norm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #define IEEE754_SPCVAL_NMAX		11	/* -max norm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define IEEE754_SPCVAL_PMIN		12	/* +min norm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) #define IEEE754_SPCVAL_NMIN		13	/* -min norm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define IEEE754_SPCVAL_PMIND		14	/* +min denorm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define IEEE754_SPCVAL_NMIND		15	/* -min denorm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define IEEE754_SPCVAL_P1E31		16	/* + 1.0e31 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define IEEE754_SPCVAL_P1E63		17	/* + 1.0e63 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) extern const union ieee754dp __ieee754dp_spcvals[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) extern const union ieee754sp __ieee754sp_spcvals[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define ieee754dp_spcvals ((const union ieee754dp *)__ieee754dp_spcvals)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define ieee754sp_spcvals ((const union ieee754sp *)__ieee754sp_spcvals)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)  * Return infinity with given sign
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) #define ieee754dp_inf(sn)     (ieee754dp_spcvals[IEEE754_SPCVAL_PINFINITY+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #define ieee754dp_zero(sn)	(ieee754dp_spcvals[IEEE754_SPCVAL_PZERO+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #define ieee754dp_one(sn)	(ieee754dp_spcvals[IEEE754_SPCVAL_PONE+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) #define ieee754dp_ten(sn)	(ieee754dp_spcvals[IEEE754_SPCVAL_PTEN+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) #define ieee754dp_indef()	(ieee754dp_spcvals[IEEE754_SPCVAL_INDEF_LEG + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 						   ieee754_csr.nan2008])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define ieee754dp_max(sn)	(ieee754dp_spcvals[IEEE754_SPCVAL_PMAX+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #define ieee754dp_min(sn)	(ieee754dp_spcvals[IEEE754_SPCVAL_PMIN+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) #define ieee754dp_mind(sn)	(ieee754dp_spcvals[IEEE754_SPCVAL_PMIND+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define ieee754dp_1e31()	(ieee754dp_spcvals[IEEE754_SPCVAL_P1E31])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) #define ieee754dp_1e63()	(ieee754dp_spcvals[IEEE754_SPCVAL_P1E63])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) #define ieee754sp_inf(sn)     (ieee754sp_spcvals[IEEE754_SPCVAL_PINFINITY+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #define ieee754sp_zero(sn)	(ieee754sp_spcvals[IEEE754_SPCVAL_PZERO+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) #define ieee754sp_one(sn)	(ieee754sp_spcvals[IEEE754_SPCVAL_PONE+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) #define ieee754sp_ten(sn)	(ieee754sp_spcvals[IEEE754_SPCVAL_PTEN+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) #define ieee754sp_indef()	(ieee754sp_spcvals[IEEE754_SPCVAL_INDEF_LEG + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 						   ieee754_csr.nan2008])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #define ieee754sp_max(sn)	(ieee754sp_spcvals[IEEE754_SPCVAL_PMAX+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) #define ieee754sp_min(sn)	(ieee754sp_spcvals[IEEE754_SPCVAL_PMIN+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) #define ieee754sp_mind(sn)	(ieee754sp_spcvals[IEEE754_SPCVAL_PMIND+(sn)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define ieee754sp_1e31()	(ieee754sp_spcvals[IEEE754_SPCVAL_P1E31])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) #define ieee754sp_1e63()	(ieee754sp_spcvals[IEEE754_SPCVAL_P1E63])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)  * Indefinite integer value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) static inline int ieee754si_indef(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	return ieee754_csr.nan2008 ? 0 : INT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) static inline s64 ieee754di_indef(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	return ieee754_csr.nan2008 ? 0 : S64_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)  * Overflow integer value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static inline int ieee754si_overflow(int xs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	return ieee754_csr.nan2008 && xs ? INT_MIN : INT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static inline s64 ieee754di_overflow(int xs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	return ieee754_csr.nan2008 && xs ? S64_MIN : S64_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /* result types for xctx.rt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #define IEEE754_RT_SP	0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #define IEEE754_RT_DP	1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define IEEE754_RT_XP	2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #define IEEE754_RT_SI	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #define IEEE754_RT_DI	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /* compat */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #define ieee754dp_fix(x)	ieee754dp_tint(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #define ieee754sp_fix(x)	ieee754sp_tint(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #endif /* __ARCH_MIPS_MATH_EMU_IEEE754_H */