^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 *)(¤t->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 */