root/arch/mips/math-emu/ieee754.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. ieee754_getrm
  2. ieee754_setrm
  3. ieee754_getcx
  4. ieee754_cxtest
  5. ieee754_getsx
  6. ieee754_clrsx
  7. ieee754_sxtest
  8. ieee754si_indef
  9. ieee754di_indef
  10. ieee754si_overflow
  11. ieee754di_overflow

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

/* [<][>][^][v][top][bottom][index][help] */