Blame soft-fp/soft-fp.h

Packit Service 82fcde
/* Software floating-point emulation.
Packit Service 82fcde
   Copyright (C) 1997-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
   Contributed by Richard Henderson (rth@cygnus.com),
Packit Service 82fcde
		  Jakub Jelinek (jj@ultra.linux.cz),
Packit Service 82fcde
		  David S. Miller (davem@redhat.com) and
Packit Service 82fcde
		  Peter Maydell (pmaydell@chiark.greenend.org.uk).
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   In addition to the permissions in the GNU Lesser General Public
Packit Service 82fcde
   License, the Free Software Foundation gives you unlimited
Packit Service 82fcde
   permission to link the compiled version of this file into
Packit Service 82fcde
   combinations with other programs, and to distribute those
Packit Service 82fcde
   combinations without any restriction coming from the use of this
Packit Service 82fcde
   file.  (The Lesser General Public License restrictions do apply in
Packit Service 82fcde
   other respects; for example, they cover modification of the file,
Packit Service 82fcde
   and distribution when not linked into a combine executable.)
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef SOFT_FP_H
Packit Service 82fcde
#define SOFT_FP_H	1
Packit Service 82fcde
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
# include <sfp-machine.h>
Packit Service 82fcde
#elif defined __KERNEL__
Packit Service 82fcde
/* The Linux kernel uses asm/ names for architecture-specific
Packit Service 82fcde
   files.  */
Packit Service 82fcde
# include <asm/sfp-machine.h>
Packit Service 82fcde
#else
Packit Service 82fcde
# include "sfp-machine.h"
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Allow sfp-machine to have its own byte order definitions.  */
Packit Service 82fcde
#ifndef __BYTE_ORDER
Packit Service 82fcde
# ifdef _LIBC
Packit Service 82fcde
#  include <endian.h>
Packit Service 82fcde
# else
Packit Service 82fcde
#  error "endianness not defined by sfp-machine.h"
Packit Service 82fcde
# endif
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* For unreachable default cases in switch statements over bitwise OR
Packit Service 82fcde
   of FP_CLS_* values.  */
Packit Service 82fcde
#if (defined __GNUC__							\
Packit Service 82fcde
     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)))
Packit Service 82fcde
# define _FP_UNREACHABLE	__builtin_unreachable ()
Packit Service 82fcde
#else
Packit Service 82fcde
# define _FP_UNREACHABLE	abort ()
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#if ((defined __GNUC__							\
Packit Service 82fcde
      && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))	\
Packit Service 82fcde
     || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L))
Packit Service 82fcde
# define _FP_STATIC_ASSERT(expr, msg)		\
Packit Service 82fcde
  _Static_assert ((expr), msg)
Packit Service 82fcde
#else
Packit Service 82fcde
# define _FP_STATIC_ASSERT(expr, msg)					\
Packit Service 82fcde
  extern int (*__Static_assert_function (void))				\
Packit Service 82fcde
    [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* In the Linux kernel, some architectures have a single function that
Packit Service 82fcde
   uses different kinds of unpacking and packing depending on the
Packit Service 82fcde
   instruction being emulated, meaning it is not readily visible to
Packit Service 82fcde
   the compiler that variables from _FP_DECL and _FP_FRAC_DECL_*
Packit Service 82fcde
   macros are only used in cases where they were initialized.  */
Packit Service 82fcde
#ifdef __KERNEL__
Packit Service 82fcde
# define _FP_ZERO_INIT		= 0
Packit Service 82fcde
#else
Packit Service 82fcde
# define _FP_ZERO_INIT
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#define _FP_WORKBITS		3
Packit Service 82fcde
#define _FP_WORK_LSB		((_FP_W_TYPE) 1 << 3)
Packit Service 82fcde
#define _FP_WORK_ROUND		((_FP_W_TYPE) 1 << 2)
Packit Service 82fcde
#define _FP_WORK_GUARD		((_FP_W_TYPE) 1 << 1)
Packit Service 82fcde
#define _FP_WORK_STICKY		((_FP_W_TYPE) 1 << 0)
Packit Service 82fcde
Packit Service 82fcde
#ifndef FP_RND_NEAREST
Packit Service 82fcde
# define FP_RND_NEAREST		0
Packit Service 82fcde
# define FP_RND_ZERO		1
Packit Service 82fcde
# define FP_RND_PINF		2
Packit Service 82fcde
# define FP_RND_MINF		3
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifndef FP_ROUNDMODE
Packit Service 82fcde
# define FP_ROUNDMODE		FP_RND_NEAREST
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* By default don't care about exceptions.  */
Packit Service 82fcde
#ifndef FP_EX_INVALID
Packit Service 82fcde
# define FP_EX_INVALID		0
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifndef FP_EX_OVERFLOW
Packit Service 82fcde
# define FP_EX_OVERFLOW		0
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifndef FP_EX_UNDERFLOW
Packit Service 82fcde
# define FP_EX_UNDERFLOW	0
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifndef FP_EX_DIVZERO
Packit Service 82fcde
# define FP_EX_DIVZERO		0
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifndef FP_EX_INEXACT
Packit Service 82fcde
# define FP_EX_INEXACT		0
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifndef FP_EX_DENORM
Packit Service 82fcde
# define FP_EX_DENORM		0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Sub-exceptions of "invalid".  */
Packit Service 82fcde
/* Signaling NaN operand.  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_SNAN
Packit Service 82fcde
# define FP_EX_INVALID_SNAN	0
Packit Service 82fcde
#endif
Packit Service 82fcde
/* Inf * 0.  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_IMZ
Packit Service 82fcde
# define FP_EX_INVALID_IMZ	0
Packit Service 82fcde
#endif
Packit Service 82fcde
/* fma (Inf, 0, c).  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_IMZ_FMA
Packit Service 82fcde
# define FP_EX_INVALID_IMZ_FMA	0
Packit Service 82fcde
#endif
Packit Service 82fcde
/* Inf - Inf.  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_ISI
Packit Service 82fcde
# define FP_EX_INVALID_ISI	0
Packit Service 82fcde
#endif
Packit Service 82fcde
/* 0 / 0.  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_ZDZ
Packit Service 82fcde
# define FP_EX_INVALID_ZDZ	0
Packit Service 82fcde
#endif
Packit Service 82fcde
/* Inf / Inf.  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_IDI
Packit Service 82fcde
# define FP_EX_INVALID_IDI	0
Packit Service 82fcde
#endif
Packit Service 82fcde
/* sqrt (negative).  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_SQRT
Packit Service 82fcde
# define FP_EX_INVALID_SQRT	0
Packit Service 82fcde
#endif
Packit Service 82fcde
/* Invalid conversion to integer.  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_CVI
Packit Service 82fcde
# define FP_EX_INVALID_CVI	0
Packit Service 82fcde
#endif
Packit Service 82fcde
/* Invalid comparison.  */
Packit Service 82fcde
#ifndef FP_EX_INVALID_VC
Packit Service 82fcde
# define FP_EX_INVALID_VC	0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* _FP_STRUCT_LAYOUT may be defined as an attribute to determine the
Packit Service 82fcde
   struct layout variant used for structures where bit-fields are used
Packit Service 82fcde
   to access specific parts of binary floating-point numbers.  This is
Packit Service 82fcde
   required for systems where the default ABI uses struct layout with
Packit Service 82fcde
   differences in how consecutive bit-fields are laid out from the
Packit Service 82fcde
   default expected by soft-fp.  */
Packit Service 82fcde
#ifndef _FP_STRUCT_LAYOUT
Packit Service 82fcde
# define _FP_STRUCT_LAYOUT
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifdef _FP_DECL_EX
Packit Service 82fcde
# define FP_DECL_EX					\
Packit Service 82fcde
  int _fex = 0;						\
Packit Service 82fcde
  _FP_DECL_EX
Packit Service 82fcde
#else
Packit Service 82fcde
# define FP_DECL_EX int _fex = 0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Initialize any machine-specific state used in FP_ROUNDMODE,
Packit Service 82fcde
   FP_TRAPPING_EXCEPTIONS or FP_HANDLE_EXCEPTIONS.  */
Packit Service 82fcde
#ifndef FP_INIT_ROUNDMODE
Packit Service 82fcde
# define FP_INIT_ROUNDMODE do {} while (0)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Initialize any machine-specific state used in
Packit Service 82fcde
   FP_TRAPPING_EXCEPTIONS or FP_HANDLE_EXCEPTIONS.  */
Packit Service 82fcde
#ifndef FP_INIT_TRAPPING_EXCEPTIONS
Packit Service 82fcde
# define FP_INIT_TRAPPING_EXCEPTIONS FP_INIT_ROUNDMODE
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Initialize any machine-specific state used in
Packit Service 82fcde
   FP_HANDLE_EXCEPTIONS.  */
Packit Service 82fcde
#ifndef FP_INIT_EXCEPTIONS
Packit Service 82fcde
# define FP_INIT_EXCEPTIONS FP_INIT_TRAPPING_EXCEPTIONS
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifndef FP_HANDLE_EXCEPTIONS
Packit Service 82fcde
# define FP_HANDLE_EXCEPTIONS do {} while (0)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Whether to flush subnormal inputs to zero with the same sign.  */
Packit Service 82fcde
#ifndef FP_DENORM_ZERO
Packit Service 82fcde
# define FP_DENORM_ZERO 0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifndef FP_INHIBIT_RESULTS
Packit Service 82fcde
/* By default we write the results always.
Packit Service 82fcde
   sfp-machine may override this and e.g.
Packit Service 82fcde
   check if some exceptions are unmasked
Packit Service 82fcde
   and inhibit it in such a case.  */
Packit Service 82fcde
# define FP_INHIBIT_RESULTS 0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#define FP_SET_EXCEPTION(ex)				\
Packit Service 82fcde
  _fex |= (ex)
Packit Service 82fcde
Packit Service 82fcde
#define FP_CUR_EXCEPTIONS				\
Packit Service 82fcde
  (_fex)
Packit Service 82fcde
Packit Service 82fcde
#ifndef FP_TRAPPING_EXCEPTIONS
Packit Service 82fcde
# define FP_TRAPPING_EXCEPTIONS 0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* A file using soft-fp may define FP_NO_EXCEPTIONS before including
Packit Service 82fcde
   soft-fp.h to indicate that, although a macro used there could raise
Packit Service 82fcde
   exceptions, or do rounding and potentially thereby raise
Packit Service 82fcde
   exceptions, for some arguments, for the particular arguments used
Packit Service 82fcde
   in that file no exceptions or rounding can occur.  Such a file
Packit Service 82fcde
   should not itself use macros relating to handling exceptions and
Packit Service 82fcde
   rounding modes; this is only for indirect uses (in particular, in
Packit Service 82fcde
   _FP_FROM_INT and the macros it calls).  */
Packit Service 82fcde
#ifdef FP_NO_EXCEPTIONS
Packit Service 82fcde
Packit Service 82fcde
# undef FP_SET_EXCEPTION
Packit Service 82fcde
# define FP_SET_EXCEPTION(ex) do {} while (0)
Packit Service 82fcde
Packit Service 82fcde
# undef FP_CUR_EXCEPTIONS
Packit Service 82fcde
# define FP_CUR_EXCEPTIONS 0
Packit Service 82fcde
Packit Service 82fcde
# undef FP_TRAPPING_EXCEPTIONS
Packit Service 82fcde
# define FP_TRAPPING_EXCEPTIONS 0
Packit Service 82fcde
Packit Service 82fcde
# undef FP_ROUNDMODE
Packit Service 82fcde
# define FP_ROUNDMODE FP_RND_ZERO
Packit Service 82fcde
Packit Service 82fcde
# undef _FP_TININESS_AFTER_ROUNDING
Packit Service 82fcde
# define _FP_TININESS_AFTER_ROUNDING 0
Packit Service 82fcde
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* A file using soft-fp may define FP_NO_EXACT_UNDERFLOW before
Packit Service 82fcde
   including soft-fp.h to indicate that, although a macro used there
Packit Service 82fcde
   could allow for the case of exact underflow requiring the underflow
Packit Service 82fcde
   exception to be raised if traps are enabled, for the particular
Packit Service 82fcde
   arguments used in that file no exact underflow can occur.  */
Packit Service 82fcde
#ifdef FP_NO_EXACT_UNDERFLOW
Packit Service 82fcde
# undef FP_TRAPPING_EXCEPTIONS
Packit Service 82fcde
# define FP_TRAPPING_EXCEPTIONS 0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#define _FP_ROUND_NEAREST(wc, X)				\
Packit Service 82fcde
  do								\
Packit Service 82fcde
    {								\
Packit Service 82fcde
      if ((_FP_FRAC_LOW_##wc (X) & 15) != _FP_WORK_ROUND)	\
Packit Service 82fcde
	_FP_FRAC_ADDI_##wc (X, _FP_WORK_ROUND);			\
Packit Service 82fcde
    }								\
Packit Service 82fcde
  while (0)
Packit Service 82fcde
Packit Service 82fcde
#define _FP_ROUND_ZERO(wc, X)		(void) 0
Packit Service 82fcde
Packit Service 82fcde
#define _FP_ROUND_PINF(wc, X)				\
Packit Service 82fcde
  do							\
Packit Service 82fcde
    {							\
Packit Service 82fcde
      if (!X##_s && (_FP_FRAC_LOW_##wc (X) & 7))	\
Packit Service 82fcde
	_FP_FRAC_ADDI_##wc (X, _FP_WORK_LSB);		\
Packit Service 82fcde
    }							\
Packit Service 82fcde
  while (0)
Packit Service 82fcde
Packit Service 82fcde
#define _FP_ROUND_MINF(wc, X)			\
Packit Service 82fcde
  do						\
Packit Service 82fcde
    {						\
Packit Service 82fcde
      if (X##_s && (_FP_FRAC_LOW_##wc (X) & 7))	\
Packit Service 82fcde
	_FP_FRAC_ADDI_##wc (X, _FP_WORK_LSB);	\
Packit Service 82fcde
    }						\
Packit Service 82fcde
  while (0)
Packit Service 82fcde
Packit Service 82fcde
#define _FP_ROUND(wc, X)			\
Packit Service 82fcde
  do						\
Packit Service 82fcde
    {						\
Packit Service 82fcde
      if (_FP_FRAC_LOW_##wc (X) & 7)		\
Packit Service 82fcde
	{					\
Packit Service 82fcde
	  FP_SET_EXCEPTION (FP_EX_INEXACT);	\
Packit Service 82fcde
	  switch (FP_ROUNDMODE)			\
Packit Service 82fcde
	    {					\
Packit Service 82fcde
	    case FP_RND_NEAREST:		\
Packit Service 82fcde
	      _FP_ROUND_NEAREST (wc, X);	\
Packit Service 82fcde
	      break;				\
Packit Service 82fcde
	    case FP_RND_ZERO:			\
Packit Service 82fcde
	      _FP_ROUND_ZERO (wc, X);		\
Packit Service 82fcde
	      break;				\
Packit Service 82fcde
	    case FP_RND_PINF:			\
Packit Service 82fcde
	      _FP_ROUND_PINF (wc, X);		\
Packit Service 82fcde
	      break;				\
Packit Service 82fcde
	    case FP_RND_MINF:			\
Packit Service 82fcde
	      _FP_ROUND_MINF (wc, X);		\
Packit Service 82fcde
	      break;				\
Packit Service 82fcde
	    }					\
Packit Service 82fcde
	}					\
Packit Service 82fcde
    }						\
Packit Service 82fcde
  while (0)
Packit Service 82fcde
Packit Service 82fcde
#define FP_CLS_NORMAL		0
Packit Service 82fcde
#define FP_CLS_ZERO		1
Packit Service 82fcde
#define FP_CLS_INF		2
Packit Service 82fcde
#define FP_CLS_NAN		3
Packit Service 82fcde
Packit Service 82fcde
#define _FP_CLS_COMBINE(x, y)	(((x) << 2) | (y))
Packit Service 82fcde
Packit Service 82fcde
#include "op-1.h"
Packit Service 82fcde
#include "op-2.h"
Packit Service 82fcde
#include "op-4.h"
Packit Service 82fcde
#include "op-8.h"
Packit Service 82fcde
#include "op-common.h"
Packit Service 82fcde
Packit Service 82fcde
/* Sigh.  Silly things longlong.h needs.  */
Packit Service 82fcde
#define UWtype		_FP_W_TYPE
Packit Service 82fcde
#define W_TYPE_SIZE	_FP_W_TYPE_SIZE
Packit Service 82fcde
Packit Service 82fcde
typedef int QItype __attribute__ ((mode (QI)));
Packit Service 82fcde
typedef int SItype __attribute__ ((mode (SI)));
Packit Service 82fcde
typedef int DItype __attribute__ ((mode (DI)));
Packit Service 82fcde
typedef unsigned int UQItype __attribute__ ((mode (QI)));
Packit Service 82fcde
typedef unsigned int USItype __attribute__ ((mode (SI)));
Packit Service 82fcde
typedef unsigned int UDItype __attribute__ ((mode (DI)));
Packit Service 82fcde
#if _FP_W_TYPE_SIZE == 32
Packit Service 82fcde
typedef unsigned int UHWtype __attribute__ ((mode (HI)));
Packit Service 82fcde
#elif _FP_W_TYPE_SIZE == 64
Packit Service 82fcde
typedef USItype UHWtype;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifndef CMPtype
Packit Service 82fcde
# define CMPtype	int
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#define SI_BITS		(__CHAR_BIT__ * (int) sizeof (SItype))
Packit Service 82fcde
#define DI_BITS		(__CHAR_BIT__ * (int) sizeof (DItype))
Packit Service 82fcde
Packit Service 82fcde
#ifndef umul_ppmm
Packit Service 82fcde
# ifdef _LIBC
Packit Service 82fcde
#  include <stdlib/longlong.h>
Packit Service 82fcde
# else
Packit Service 82fcde
#  include "longlong.h"
Packit Service 82fcde
# endif
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#endif /* !SOFT_FP_H */