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

sp_flong.c (960B)


      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_flong(s64 x)
     13{
     14	u64 xm;		/* <--- need 64-bit mantissa temp */
     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 == (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	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		while ((xm >> (SP_FBITS + 3)) == 0) {
     47			xm <<= 1;
     48			xe--;
     49		}
     50	}
     51	return ieee754sp_format(xs, xe, xm);
     52}