Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * IEEE754 floating point
0004  * double precision internal header file
0005  */
0006 /*
0007  * MIPS floating point support
0008  * Copyright (C) 1994-2000 Algorithmics Ltd.
0009  */
0010 
0011 #include <linux/compiler.h>
0012 
0013 #include "ieee754int.h"
0014 
0015 #define assert(expr) ((void)0)
0016 
0017 #define SP_EBIAS    127
0018 #define SP_EMIN     (-126)
0019 #define SP_EMAX     127
0020 #define SP_FBITS    23
0021 #define SP_MBITS    23
0022 
0023 #define SP_MBIT(x)  ((u32)1 << (x))
0024 #define SP_HIDDEN_BIT   SP_MBIT(SP_FBITS)
0025 #define SP_SIGN_BIT SP_MBIT(31)
0026 
0027 #define SPSIGN(sp)  (sp.sign)
0028 #define SPBEXP(sp)  (sp.bexp)
0029 #define SPMANT(sp)  (sp.mant)
0030 
0031 static inline int ieee754sp_finite(union ieee754sp x)
0032 {
0033     return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS;
0034 }
0035 
0036 /* 64 bit right shift with rounding */
0037 #define XSPSRS64(v, rs)                     \
0038     (((rs) >= 64) ? ((v) != 0) : ((v) >> (rs)) | ((v) << (64-(rs)) != 0))
0039 
0040 /* 3bit extended single precision sticky right shift */
0041 #define XSPSRS(v, rs)                       \
0042     ((rs > (SP_FBITS+3))?1:((v) >> (rs)) | ((v) << (32-(rs)) != 0))
0043 
0044 #define XSPSRS1(m) \
0045     ((m >> 1) | (m & 1))
0046 
0047 #define SPXSRSX1() \
0048     (xe++, (xm = XSPSRS1(xm)))
0049 
0050 #define SPXSRSY1() \
0051     (ye++, (ym = XSPSRS1(ym)))
0052 
0053 /* convert denormal to normalized with extended exponent */
0054 #define SPDNORMx(m,e) \
0055     while ((m >> SP_FBITS) == 0) { m <<= 1; e--; }
0056 #define SPDNORMX    SPDNORMx(xm, xe)
0057 #define SPDNORMY    SPDNORMx(ym, ye)
0058 #define SPDNORMZ    SPDNORMx(zm, ze)
0059 
0060 static inline union ieee754sp buildsp(int s, int bx, unsigned int m)
0061 {
0062     union ieee754sp r;
0063 
0064     assert((s) == 0 || (s) == 1);
0065     assert((bx) >= SP_EMIN - 1 + SP_EBIAS
0066            && (bx) <= SP_EMAX + 1 + SP_EBIAS);
0067     assert(((m) >> SP_FBITS) == 0);
0068 
0069     r.sign = s;
0070     r.bexp = bx;
0071     r.mant = m;
0072 
0073     return r;
0074 }
0075 
0076 extern union ieee754sp __cold ieee754sp_nanxcpt(union ieee754sp);
0077 extern union ieee754sp ieee754sp_format(int, int, unsigned);