root/arch/mips/math-emu/dp_flong.c
// SPDX-License-Identifier: GPL-2.0-only
/* IEEE754 floating point arithmetic
 * double precision: common utilities
 */
/*
 * MIPS floating point support
 * Copyright (C) 1994-2000 Algorithmics Ltd.
 */

#include "ieee754dp.h"

union ieee754dp ieee754dp_flong(s64 x)
{
        u64 xm;
        int xe;
        int xs;

        ieee754_clearcx();

        if (x == 0)
                return ieee754dp_zero(0);
        if (x == 1 || x == -1)
                return ieee754dp_one(x < 0);
        if (x == 10 || x == -10)
                return ieee754dp_ten(x < 0);

        xs = (x < 0);
        if (xs) {
                if (x == (1ULL << 63))
                        xm = (1ULL << 63);      /* max neg can't be safely negated */
                else
                        xm = -x;
        } else {
                xm = x;
        }

        /* normalize */
        xe = DP_FBITS + 3;
        if (xm >> (DP_FBITS + 1 + 3)) {
                /* shunt out overflow bits */
                while (xm >> (DP_FBITS + 1 + 3)) {
                        XDPSRSX1();
                }
        } else {
                /* normalize in grs extended double precision */
                while ((xm >> (DP_FBITS + 3)) == 0) {
                        xm <<= 1;
                        xe--;
                }
        }

        return ieee754dp_format(xs, xe, xm);
}