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_fint.c (820B)


      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}