root/arch/mips/math-emu/dp_flong.c

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

DEFINITIONS

This source file includes following definitions.
  1. ieee754dp_flong

   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 
  12 union 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 }

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