linux/arch/mips/math-emu/sp_fint.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/* IEEE754 floating point arithmetic
   3 * single precision
   4 */
   5/*
   6 * MIPS floating point support
   7 * Copyright (C) 1994-2000 Algorithmics Ltd.
   8 */
   9
  10#include "ieee754sp.h"
  11
  12union ieee754sp ieee754sp_fint(int x)
  13{
  14        unsigned int xm;
  15        int xe;
  16        int xs;
  17
  18        ieee754_clearcx();
  19
  20        if (x == 0)
  21                return ieee754sp_zero(0);
  22        if (x == 1 || x == -1)
  23                return ieee754sp_one(x < 0);
  24        if (x == 10 || x == -10)
  25                return ieee754sp_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        xe = SP_FBITS + 3;
  37
  38        if (xm >> (SP_FBITS + 1 + 3)) {
  39                /* shunt out overflow bits
  40                 */
  41                while (xm >> (SP_FBITS + 1 + 3)) {
  42                        SPXSRSX1();
  43                }
  44        } else {
  45                /* normalize in grs extended single precision
  46                 */
  47                while ((xm >> (SP_FBITS + 3)) == 0) {
  48                        xm <<= 1;
  49                        xe--;
  50                }
  51        }
  52        return ieee754sp_format(xs, xe, xm);
  53}
  54