^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) * double precision 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)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "ieee754int.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define assert(expr) ((void)0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define SP_EBIAS 127
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define SP_EMIN (-126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define SP_EMAX 127
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define SP_FBITS 23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define SP_MBITS 23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define SP_MBIT(x) ((u32)1 << (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define SP_HIDDEN_BIT SP_MBIT(SP_FBITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define SP_SIGN_BIT SP_MBIT(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define SPSIGN(sp) (sp.sign)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define SPBEXP(sp) (sp.bexp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define SPMANT(sp) (sp.mant)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static inline int ieee754sp_finite(union ieee754sp x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* 64 bit right shift with rounding */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define XSPSRS64(v, rs) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) (((rs) >= 64) ? ((v) != 0) : ((v) >> (rs)) | ((v) << (64-(rs)) != 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* 3bit extended single precision sticky right shift */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define XSPSRS(v, rs) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ((rs > (SP_FBITS+3))?1:((v) >> (rs)) | ((v) << (32-(rs)) != 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define XSPSRS1(m) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ((m >> 1) | (m & 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define SPXSRSX1() \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) (xe++, (xm = XSPSRS1(xm)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define SPXSRSY1() \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) (ye++, (ym = XSPSRS1(ym)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* convert denormal to normalized with extended exponent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define SPDNORMx(m,e) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) while ((m >> SP_FBITS) == 0) { m <<= 1; e--; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define SPDNORMX SPDNORMx(xm, xe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define SPDNORMY SPDNORMx(ym, ye)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define SPDNORMZ SPDNORMx(zm, ze)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static inline union ieee754sp buildsp(int s, int bx, unsigned int m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) union ieee754sp r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) assert((s) == 0 || (s) == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) assert((bx) >= SP_EMIN - 1 + SP_EBIAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) && (bx) <= SP_EMAX + 1 + SP_EBIAS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) assert(((m) >> SP_FBITS) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) r.sign = s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) r.bexp = bx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) r.mant = m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) extern union ieee754sp __cold ieee754sp_nanxcpt(union ieee754sp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) extern union ieee754sp ieee754sp_format(int, int, unsigned);