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