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_fsp.c (1135B)


      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 "ieee754sp.h"
     11#include "ieee754dp.h"
     12
     13static inline union ieee754dp ieee754dp_nan_fsp(int xs, u64 xm)
     14{
     15	return builddp(xs, DP_EMAX + 1 + DP_EBIAS,
     16		       xm << (DP_FBITS - SP_FBITS));
     17}
     18
     19union ieee754dp ieee754dp_fsp(union ieee754sp x)
     20{
     21	COMPXSP;
     22
     23	EXPLODEXSP;
     24
     25	ieee754_clearcx();
     26
     27	FLUSHXSP;
     28
     29	switch (xc) {
     30	case IEEE754_CLASS_SNAN:
     31		return ieee754dp_nanxcpt(ieee754dp_nan_fsp(xs, xm));
     32
     33	case IEEE754_CLASS_QNAN:
     34		return ieee754dp_nan_fsp(xs, xm);
     35
     36	case IEEE754_CLASS_INF:
     37		return ieee754dp_inf(xs);
     38
     39	case IEEE754_CLASS_ZERO:
     40		return ieee754dp_zero(xs);
     41
     42	case IEEE754_CLASS_DNORM:
     43		/* normalize */
     44		while ((xm >> SP_FBITS) == 0) {
     45			xm <<= 1;
     46			xe--;
     47		}
     48		break;
     49
     50	case IEEE754_CLASS_NORM:
     51		break;
     52	}
     53
     54	/*
     55	 * Can't possibly overflow,underflow, or need rounding
     56	 */
     57
     58	/* drop the hidden bit */
     59	xm &= ~SP_HIDDEN_BIT;
     60
     61	return builddp(xs, xe + DP_EBIAS,
     62		       (u64) xm << (DP_FBITS - SP_FBITS));
     63}