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

soft-fp.h (5183B)


      1/* Software floating-point emulation.
      2   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
      3   This file is part of the GNU C Library.
      4   Contributed by Richard Henderson (rth@cygnus.com),
      5		  Jakub Jelinek (jj@ultra.linux.cz),
      6		  David S. Miller (davem@redhat.com) and
      7		  Peter Maydell (pmaydell@chiark.greenend.org.uk).
      8
      9   The GNU C Library is free software; you can redistribute it and/or
     10   modify it under the terms of the GNU Library General Public License as
     11   published by the Free Software Foundation; either version 2 of the
     12   License, or (at your option) any later version.
     13
     14   The GNU C Library is distributed in the hope that it will be useful,
     15   but WITHOUT ANY WARRANTY; without even the implied warranty of
     16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     17   Library General Public License for more details.
     18
     19   You should have received a copy of the GNU Library General Public
     20   License along with the GNU C Library; see the file COPYING.LIB.  If
     21   not, write to the Free Software Foundation, Inc.,
     22   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     23
     24#ifndef __MATH_EMU_SOFT_FP_H__
     25#define __MATH_EMU_SOFT_FP_H__
     26
     27#include <asm/sfp-machine.h>
     28
     29/* Allow sfp-machine to have its own byte order definitions. */
     30#ifndef __BYTE_ORDER
     31#include <endian.h>
     32#endif
     33
     34#define _FP_WORKBITS		3
     35#define _FP_WORK_LSB		((_FP_W_TYPE)1 << 3)
     36#define _FP_WORK_ROUND		((_FP_W_TYPE)1 << 2)
     37#define _FP_WORK_GUARD		((_FP_W_TYPE)1 << 1)
     38#define _FP_WORK_STICKY		((_FP_W_TYPE)1 << 0)
     39
     40#ifndef FP_RND_NEAREST
     41# define FP_RND_NEAREST		0
     42# define FP_RND_ZERO		1
     43# define FP_RND_PINF		2
     44# define FP_RND_MINF		3
     45#ifndef FP_ROUNDMODE
     46# define FP_ROUNDMODE		FP_RND_NEAREST
     47#endif
     48#endif
     49
     50/* By default don't care about exceptions. */
     51#ifndef FP_EX_INVALID
     52#define FP_EX_INVALID		0
     53#endif
     54#ifndef FP_EX_INVALID_SNAN
     55#define FP_EX_INVALID_SNAN	0
     56#endif
     57/* inf - inf */
     58#ifndef FP_EX_INVALID_ISI
     59#define FP_EX_INVALID_ISI	0
     60#endif
     61/* inf / inf */
     62#ifndef FP_EX_INVALID_IDI
     63#define FP_EX_INVALID_IDI	0
     64#endif
     65/* 0 / 0 */
     66#ifndef FP_EX_INVALID_ZDZ
     67#define FP_EX_INVALID_ZDZ	0
     68#endif
     69/* inf * 0 */
     70#ifndef FP_EX_INVALID_IMZ
     71#define FP_EX_INVALID_IMZ	0
     72#endif
     73#ifndef FP_EX_OVERFLOW
     74#define FP_EX_OVERFLOW		0
     75#endif
     76#ifndef FP_EX_UNDERFLOW
     77#define FP_EX_UNDERFLOW		
     78#endif
     79#ifndef FP_EX_DIVZERO
     80#define FP_EX_DIVZERO		0
     81#endif
     82#ifndef FP_EX_INEXACT
     83#define FP_EX_INEXACT		0
     84#endif
     85#ifndef FP_EX_DENORM
     86#define FP_EX_DENORM		0
     87#endif
     88
     89#ifdef _FP_DECL_EX
     90#define FP_DECL_EX					\
     91  int _fex = 0;						\
     92  _FP_DECL_EX
     93#else
     94#define FP_DECL_EX int _fex = 0
     95#endif
     96  
     97#ifndef FP_INIT_ROUNDMODE
     98#define FP_INIT_ROUNDMODE do {} while (0)
     99#endif
    100
    101#ifndef FP_HANDLE_EXCEPTIONS
    102#define FP_HANDLE_EXCEPTIONS do {} while (0)
    103#endif
    104
    105/* By default we never flush denormal input operands to signed zero. */
    106#ifndef FP_DENORM_ZERO
    107#define FP_DENORM_ZERO 0
    108#endif
    109
    110#ifndef FP_INHIBIT_RESULTS
    111/* By default we write the results always.
    112 * sfp-machine may override this and e.g.
    113 * check if some exceptions are unmasked
    114 * and inhibit it in such a case.
    115 */
    116#define FP_INHIBIT_RESULTS 0
    117#endif
    118
    119#ifndef FP_TRAPPING_EXCEPTIONS
    120#define FP_TRAPPING_EXCEPTIONS 0
    121#endif
    122
    123#define FP_SET_EXCEPTION(ex)				\
    124  _fex |= (ex)
    125  
    126#define FP_UNSET_EXCEPTION(ex)				\
    127  _fex &= ~(ex)
    128
    129#define FP_CUR_EXCEPTIONS				\
    130  (_fex)
    131
    132#define FP_CLEAR_EXCEPTIONS				\
    133  _fex = 0
    134
    135#define _FP_ROUND_NEAREST(wc, X)			\
    136do {							\
    137    if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND)	\
    138      _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);		\
    139} while (0)
    140
    141#define _FP_ROUND_ZERO(wc, X)		(void)0
    142
    143#define _FP_ROUND_PINF(wc, X)				\
    144do {							\
    145    if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7))		\
    146      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);		\
    147} while (0)
    148
    149#define _FP_ROUND_MINF(wc, X)				\
    150do {							\
    151    if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7))		\
    152      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);		\
    153} while (0)
    154
    155#define _FP_ROUND(wc, X)			\
    156do {						\
    157	if (_FP_FRAC_LOW_##wc(X) & 7)		\
    158	  FP_SET_EXCEPTION(FP_EX_INEXACT);	\
    159	switch (FP_ROUNDMODE)			\
    160	{					\
    161	  case FP_RND_NEAREST:			\
    162	    _FP_ROUND_NEAREST(wc,X);		\
    163	    break;				\
    164	  case FP_RND_ZERO:			\
    165	    _FP_ROUND_ZERO(wc,X);		\
    166	    break;				\
    167	  case FP_RND_PINF:			\
    168	    _FP_ROUND_PINF(wc,X);		\
    169	    break;				\
    170	  case FP_RND_MINF:			\
    171	    _FP_ROUND_MINF(wc,X);		\
    172	    break;				\
    173	}					\
    174} while (0)
    175
    176#define FP_CLS_NORMAL		0
    177#define FP_CLS_ZERO		1
    178#define FP_CLS_INF		2
    179#define FP_CLS_NAN		3
    180
    181#define _FP_CLS_COMBINE(x,y)	(((x) << 2) | (y))
    182
    183#include <math-emu/op-1.h>
    184#include <math-emu/op-2.h>
    185#include <math-emu/op-4.h>
    186#include <math-emu/op-8.h>
    187#include <math-emu/op-common.h>
    188
    189/* Sigh.  Silly things longlong.h needs.  */
    190#define UWtype		_FP_W_TYPE
    191#define W_TYPE_SIZE	_FP_W_TYPE_SIZE
    192
    193typedef int SItype __attribute__((mode(SI)));
    194typedef int DItype __attribute__((mode(DI)));
    195typedef unsigned int USItype __attribute__((mode(SI)));
    196typedef unsigned int UDItype __attribute__((mode(DI)));
    197#if _FP_W_TYPE_SIZE == 32
    198typedef unsigned int UHWtype __attribute__((mode(HI)));
    199#elif _FP_W_TYPE_SIZE == 64
    200typedef USItype UHWtype;
    201#endif
    202
    203#ifndef umul_ppmm
    204#include <stdlib/longlong.h>
    205#endif
    206
    207#endif /* __MATH_EMU_SOFT_FP_H__ */