(root)/
gcc-13.2.0/
libgcc/
config/
aarch64/
sfp-machine.h
       1  /* Machine description for AArch64 architecture.
       2     Copyright (C) 2009-2023 Free Software Foundation, Inc.
       3     Contributed by ARM Ltd.
       4  
       5  This file is part of GCC.
       6  
       7  GCC is free software; you can redistribute it and/or modify it under
       8  the terms of the GNU General Public License as published by the Free
       9  Software Foundation; either version 3, or (at your option) any later
      10  version.
      11  
      12  GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13  WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15  for more details.
      16  
      17  Under Section 7 of GPL version 3, you are granted additional
      18  permissions described in the GCC Runtime Library Exception, version
      19  3.1, as published by the Free Software Foundation.
      20  
      21  You should have received a copy of the GNU General Public License and
      22  a copy of the GCC Runtime Library Exception along with this program;
      23  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      24  <http://www.gnu.org/licenses/>.  */
      25  
      26  #define _FP_W_TYPE_SIZE		64
      27  #define _FP_W_TYPE		unsigned long long
      28  #define _FP_WS_TYPE		signed long long
      29  #define _FP_I_TYPE		long long
      30  
      31  typedef int TItype __attribute__ ((mode (TI)));
      32  typedef unsigned int UTItype __attribute__ ((mode (TI)));
      33  #define TI_BITS (__CHAR_BIT__ * (int)sizeof(TItype))
      34  
      35  /* The type of the result of a floating point comparison.  This must
      36     match __libgcc_cmp_return__ in GCC for the target.  */
      37  typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
      38  #define CMPtype __gcc_CMPtype
      39  
      40  #define _FP_MUL_MEAT_Q(R,X,Y)				\
      41    _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
      42  
      43  #define _FP_DIV_MEAT_Q(R,X,Y)	_FP_DIV_MEAT_2_udiv(Q,R,X,Y)
      44  
      45  #define _FP_NANFRAC_H		((_FP_QNANBIT_H << 1) - 1)
      46  #define _FP_NANFRAC_B		((_FP_QNANBIT_B << 1) - 1)
      47  #define _FP_NANFRAC_S		((_FP_QNANBIT_S << 1) - 1)
      48  #define _FP_NANFRAC_D		((_FP_QNANBIT_D << 1) - 1)
      49  #define _FP_NANFRAC_Q		((_FP_QNANBIT_Q << 1) - 1), -1
      50  #define _FP_NANSIGN_H		0
      51  #define _FP_NANSIGN_B		0
      52  #define _FP_NANSIGN_S		0
      53  #define _FP_NANSIGN_D		0
      54  #define _FP_NANSIGN_Q		0
      55  
      56  #define _FP_KEEPNANFRACP 1
      57  #define _FP_QNANNEGATEDP 0
      58  
      59  /* This appears to be in line with the VFP conventions in the v7-a
      60     ARM-ARM. Need to check with the v8 version.  */
      61  #define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)			\
      62    do {								\
      63      if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)		\
      64  	&& !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))	\
      65        {								\
      66  	R##_s = Y##_s;						\
      67  	_FP_FRAC_COPY_##wc(R,Y);				\
      68        }								\
      69      else							\
      70        {								\
      71  	R##_s = X##_s;						\
      72  	_FP_FRAC_COPY_##wc(R,X);				\
      73        }								\
      74      R##_c = FP_CLS_NAN;						\
      75    } while (0)
      76  
      77  #define FP_EX_INVALID	0x01
      78  #define FP_EX_DIVZERO	0x02
      79  #define FP_EX_OVERFLOW	0x04
      80  #define FP_EX_UNDERFLOW	0x08
      81  #define FP_EX_INEXACT	0x10
      82  #define FP_EX_SHIFT 8
      83  #define FP_EX_ALL \
      84  	(FP_EX_INVALID | FP_EX_DIVZERO | FP_EX_OVERFLOW | FP_EX_UNDERFLOW \
      85  	 | FP_EX_INEXACT)
      86  
      87  #define _FP_TININESS_AFTER_ROUNDING 0
      88  
      89  void __sfp_handle_exceptions (int);
      90  
      91  #define FP_HANDLE_EXCEPTIONS			\
      92    do {						\
      93      if (__builtin_expect (_fex, 0))		\
      94        __sfp_handle_exceptions (_fex);		\
      95    } while (0)
      96  
      97  #define FP_TRAPPING_EXCEPTIONS ((_fpcr >> FP_EX_SHIFT) & FP_EX_ALL)
      98  
      99  #define FP_RND_NEAREST		0x000000
     100  #define FP_RND_PINF		0x400000
     101  #define FP_RND_MINF		0x800000
     102  #define FP_RND_ZERO		0xc00000
     103  #define FP_RND_MASK		0xc00000
     104  
     105  #define _FP_DECL_EX \
     106    unsigned long int _fpcr __attribute__ ((unused)) = FP_RND_NEAREST
     107  
     108  #define FP_INIT_ROUNDMODE			\
     109    do {						\
     110      __asm__ __volatile__ ("mrs	%0, fpcr"	\
     111  			  : "=r" (_fpcr));	\
     112    } while (0)
     113  
     114  #define FP_ROUNDMODE (_fpcr & FP_RND_MASK)
     115  
     116  #define	__LITTLE_ENDIAN	1234
     117  #define	__BIG_ENDIAN	4321
     118  
     119  #if defined __AARCH64EB__
     120  # define __BYTE_ORDER __BIG_ENDIAN
     121  #else
     122  # define __BYTE_ORDER __LITTLE_ENDIAN
     123  #endif
     124  
     125  
     126  /* Define ALIASNAME as a strong alias for NAME.  */
     127  # define strong_alias(name, aliasname) _strong_alias(name, aliasname)
     128  # define _strong_alias(name, aliasname) \
     129    extern __typeof (name) aliasname __attribute__ ((alias (#name)));