Blame sysdeps/riscv/sfp-machine.h

Packit 6c4009
/* RISC-V softfloat definitions
Packit 6c4009
   Copyright (C) 2017-2018 Free Software Foundation, Inc.
Packit 6c4009
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library.  If not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <fenv.h>
Packit 6c4009
#include <fpu_control.h>
Packit 6c4009
Packit 6c4009
#if __riscv_xlen == 32
Packit 6c4009
Packit 6c4009
# error "rv32i-based targets are not supported"
Packit 6c4009
Packit 6c4009
#else
Packit 6c4009
Packit 6c4009
# define _FP_W_TYPE_SIZE		64
Packit 6c4009
# define _FP_W_TYPE		unsigned long long
Packit 6c4009
# define _FP_WS_TYPE		signed long long
Packit 6c4009
# define _FP_I_TYPE		long long
Packit 6c4009
Packit 6c4009
# define _FP_MUL_MEAT_S(R, X, Y)					\
Packit 6c4009
  _FP_MUL_MEAT_1_imm (_FP_WFRACBITS_S, R, X, Y)
Packit 6c4009
# define _FP_MUL_MEAT_D(R, X, Y)					\
Packit 6c4009
  _FP_MUL_MEAT_1_wide (_FP_WFRACBITS_D, R, X, Y, umul_ppmm)
Packit 6c4009
# define _FP_MUL_MEAT_Q(R, X, Y)					\
Packit 6c4009
  _FP_MUL_MEAT_2_wide_3mul (_FP_WFRACBITS_Q, R, X, Y, umul_ppmm)
Packit 6c4009
Packit 6c4009
# define _FP_MUL_MEAT_DW_S(R, X, Y)					\
Packit 6c4009
  _FP_MUL_MEAT_DW_1_imm (_FP_WFRACBITS_S, R, X, Y)
Packit 6c4009
# define _FP_MUL_MEAT_DW_D(R, X, Y)					\
Packit 6c4009
  _FP_MUL_MEAT_DW_1_wide (_FP_WFRACBITS_D, R, X, Y, umul_ppmm)
Packit 6c4009
# define _FP_MUL_MEAT_DW_Q(R, X, Y)					\
Packit 6c4009
  _FP_MUL_MEAT_DW_2_wide_3mul (_FP_WFRACBITS_Q, R, X, Y, umul_ppmm)
Packit 6c4009
Packit 6c4009
# define _FP_DIV_MEAT_S(R, X, Y)	_FP_DIV_MEAT_1_imm (S, R, X, Y, _FP_DIV_HELP_imm)
Packit 6c4009
# define _FP_DIV_MEAT_D(R, X, Y)	_FP_DIV_MEAT_1_udiv_norm (D, R, X, Y)
Packit 6c4009
# define _FP_DIV_MEAT_Q(R, X, Y)	_FP_DIV_MEAT_2_udiv (Q, R, X, Y)
Packit 6c4009
Packit 6c4009
# define _FP_NANFRAC_S		_FP_QNANBIT_S
Packit 6c4009
# define _FP_NANFRAC_D		_FP_QNANBIT_D
Packit 6c4009
# define _FP_NANFRAC_Q		_FP_QNANBIT_Q, 0
Packit 6c4009
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#define _FP_NANSIGN_S		0
Packit 6c4009
#define _FP_NANSIGN_D		0
Packit 6c4009
#define _FP_NANSIGN_Q		0
Packit 6c4009
Packit 6c4009
#define _FP_KEEPNANFRACP 0
Packit 6c4009
#define _FP_QNANNEGATEDP 0
Packit 6c4009
Packit 6c4009
#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)	\
Packit 6c4009
  do {						\
Packit 6c4009
    R##_s = _FP_NANSIGN_##fs;			\
Packit 6c4009
    _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);	\
Packit 6c4009
    R##_c = FP_CLS_NAN;				\
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
#define _FP_DECL_EX		int _frm __attribute__ ((unused));
Packit 6c4009
#define FP_ROUNDMODE		_frm
Packit 6c4009
Packit 6c4009
#define FP_RND_NEAREST		FE_TONEAREST
Packit 6c4009
#define FP_RND_ZERO		FE_TOWARDZERO
Packit 6c4009
#define FP_RND_PINF		FE_UPWARD
Packit 6c4009
#define FP_RND_MINF		FE_DOWNWARD
Packit 6c4009
Packit 6c4009
#define FP_EX_INVALID		FE_INVALID
Packit 6c4009
#define FP_EX_OVERFLOW		FE_OVERFLOW
Packit 6c4009
#define FP_EX_UNDERFLOW		FE_UNDERFLOW
Packit 6c4009
#define FP_EX_DIVZERO		FE_DIVBYZERO
Packit 6c4009
#define FP_EX_INEXACT		FE_INEXACT
Packit 6c4009
Packit 6c4009
#define _FP_TININESS_AFTER_ROUNDING 1
Packit 6c4009
Packit 6c4009
#ifdef __riscv_flen
Packit 6c4009
# define FP_INIT_ROUNDMODE			\
Packit 6c4009
do {						\
Packit 6c4009
  __asm__ volatile ("frrm %0" : "=r" (_frm));	\
Packit 6c4009
} while (0)
Packit 6c4009
Packit 6c4009
# define FP_HANDLE_EXCEPTIONS					\
Packit 6c4009
do {								\
Packit 6c4009
  if (__builtin_expect (_fex, 0))				\
Packit 6c4009
    __asm__ volatile ("csrs fflags, %0" : : "rK" (_fex));	\
Packit 6c4009
} while (0)
Packit 6c4009
#else
Packit 6c4009
# define FP_INIT_ROUNDMODE	_frm = FP_RND_NEAREST
Packit 6c4009
#endif