linux/arch/mips/math-emu/dp_fint.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_fint(int 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 == (1 << 31))
  30                        xm = ((unsigned) 1 << 31);      /* max neg can't be safely negated */
  31                else
  32                        xm = -x;
  33        } else {
  34                xm = x;
  35        }
  36
  37        /* normalize - result can never be inexact or overflow */
  38        xe = DP_FBITS;
  39        while ((xm >> DP_FBITS) == 0) {
  40                xm <<= 1;
  41                xe--;
  42        }
  43        return builddp(xs, xe + DP_EBIAS, xm & ~DP_HIDDEN_BIT);
  44}
  45