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 DP_EBIAS    1023
0018 #define DP_EMIN     (-1022)
0019 #define DP_EMAX     1023
0020 #define DP_FBITS    52
0021 #define DP_MBITS    52
0022 
0023 #define DP_MBIT(x)  ((u64)1 << (x))
0024 #define DP_HIDDEN_BIT   DP_MBIT(DP_FBITS)
0025 #define DP_SIGN_BIT DP_MBIT(63)
0026 
0027 #define DPSIGN(dp)  (dp.sign)
0028 #define DPBEXP(dp)  (dp.bexp)
0029 #define DPMANT(dp)  (dp.mant)
0030 
0031 static inline int ieee754dp_finite(union ieee754dp x)
0032 {
0033     return DPBEXP(x) != DP_EMAX + 1 + DP_EBIAS;
0034 }
0035 
0036 /* 3bit extended double precision sticky right shift */
0037 #define XDPSRS(v,rs)    \
0038     ((rs > (DP_FBITS+3))?1:((v) >> (rs)) | ((v) << (64-(rs)) != 0))
0039 
0040 #define XDPSRSX1() \
0041     (xe++, (xm = (xm >> 1) | (xm & 1)))
0042 
0043 #define XDPSRS1(v)  \
0044     (((v) >> 1) | ((v) & 1))
0045 
0046 /* 32bit * 32bit => 64bit unsigned integer multiplication */
0047 #define DPXMULT(x, y)   ((u64)(x) * (u64)y)
0048 
0049 /* convert denormal to normalized with extended exponent */
0050 #define DPDNORMx(m,e) \
0051     while ((m >> DP_FBITS) == 0) { m <<= 1; e--; }
0052 #define DPDNORMX    DPDNORMx(xm, xe)
0053 #define DPDNORMY    DPDNORMx(ym, ye)
0054 #define DPDNORMZ    DPDNORMx(zm, ze)
0055 
0056 static inline union ieee754dp builddp(int s, int bx, u64 m)
0057 {
0058     union ieee754dp r;
0059 
0060     assert((s) == 0 || (s) == 1);
0061     assert((bx) >= DP_EMIN - 1 + DP_EBIAS
0062            && (bx) <= DP_EMAX + 1 + DP_EBIAS);
0063     assert(((m) >> DP_FBITS) == 0);
0064 
0065     r.sign = s;
0066     r.bexp = bx;
0067     r.mant = m;
0068 
0069     return r;
0070 }
0071 
0072 extern union ieee754dp __cold ieee754dp_nanxcpt(union ieee754dp);
0073 extern union ieee754dp ieee754dp_format(int, int, u64);