linux/arch/mips/math-emu/dp_flong.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 "ieee754dp.h"
  11
  12union ieee754dp ieee754dp_flong(s64 x)
  13{
  14        u64 xm;
  15        int xe;
  16        int xs;
  17
  18        ieee754_clearcx();
  19
  20        if (x == 0)
  21                return ieee754dp_zero(0);
  22        if (x == 1 || x == -1)
  23                return ieee754dp_one(x < 0);
  24        if (x == 10 || x == -10)
  25                return ieee754dp_ten(x < 0);
  26
  27        xs = (x < 0);
  28        if (xs) {
  29                if (x == (1ULL << 63))
  30                        xm = (1ULL << 63);      /* max neg can't be safely negated */
  31                else
  32                        xm = -x;
  33        } else {
  34                xm = x;
  35        }
  36
  37        /* normalize */
  38        xe = DP_FBITS + 3;
  39        if (xm >> (DP_FBITS + 1 + 3)) {
  40                /* shunt out overflow bits */
  41                while (xm >> (DP_FBITS + 1 + 3)) {
  42                        XDPSRSX1();
  43                }
  44        } else {
  45                /* normalize in grs extended double precision */
  46                while ((xm >> (DP_FBITS + 3)) == 0) {
  47                        xm <<= 1;
  48                        xe--;
  49                }
  50        }
  51
  52        return ieee754dp_format(xs, xe, xm);
  53}
  54