cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dp_flong.c (955B)


      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}