linux/arch/mips/math-emu/dp_fsp.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/* IEEE754 floating point arithmetic
   3 * double precision: common utilities
   4 */
   5/*
   6 * MIPS floating point support
   7 * Copyright (C) 1994-2000 Algorithmics Ltd.
   8 */
   9
  10#include "ieee754sp.h"
  11#include "ieee754dp.h"
  12
  13static inline union ieee754dp ieee754dp_nan_fsp(int xs, u64 xm)
  14{
  15        return builddp(xs, DP_EMAX + 1 + DP_EBIAS,
  16                       xm << (DP_FBITS - SP_FBITS));
  17}
  18
  19union ieee754dp ieee754dp_fsp(union ieee754sp x)
  20{
  21        COMPXSP;
  22
  23        EXPLODEXSP;
  24
  25        ieee754_clearcx();
  26
  27        FLUSHXSP;
  28
  29        switch (xc) {
  30        case IEEE754_CLASS_SNAN:
  31                return ieee754dp_nanxcpt(ieee754dp_nan_fsp(xs, xm));
  32
  33        case IEEE754_CLASS_QNAN:
  34                return ieee754dp_nan_fsp(xs, xm);
  35
  36        case IEEE754_CLASS_INF:
  37                return ieee754dp_inf(xs);
  38
  39        case IEEE754_CLASS_ZERO:
  40                return ieee754dp_zero(xs);
  41
  42        case IEEE754_CLASS_DNORM:
  43                /* normalize */
  44                while ((xm >> SP_FBITS) == 0) {
  45                        xm <<= 1;
  46                        xe--;
  47                }
  48                break;
  49
  50        case IEEE754_CLASS_NORM:
  51                break;
  52        }
  53
  54        /*
  55         * Can't possibly overflow,underflow, or need rounding
  56         */
  57
  58        /* drop the hidden bit */
  59        xm &= ~SP_HIDDEN_BIT;
  60
  61        return builddp(xs, xe + DP_EBIAS,
  62                       (u64) xm << (DP_FBITS - SP_FBITS));
  63}
  64