/* Copyright (C) 2007-2017 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. Under Section 7 of GPL version 3, you are granted additional permissions described in the GCC Runtime Library Exception, version 3.1, as published by the Free Software Foundation. You should have received a copy of the GNU General Public License and a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ #ifndef _BID_GCC_INTRINSICS_H #define _BID_GCC_INTRINSICS_H #ifdef IN_LIBGCC2 #include "tconfig.h" #include "coretypes.h" #include "tm.h" #include "libgcc_tm.h" #ifdef __LIBGCC_HAS_XF_MODE__ #define LIBGCC2_HAS_XF_MODE 1 #else #define LIBGCC2_HAS_XF_MODE 0 #endif #ifdef __LIBGCC_HAS_TF_MODE__ #define LIBGCC2_HAS_TF_MODE 1 #else #define LIBGCC2_HAS_TF_MODE 0 #endif #ifndef BID_HAS_XF_MODE #define BID_HAS_XF_MODE LIBGCC2_HAS_XF_MODE #endif #ifndef BID_HAS_TF_MODE #define BID_HAS_TF_MODE LIBGCC2_HAS_TF_MODE #endif /* Some handy typedefs. */ typedef float SFtype __attribute__ ((mode (SF))); typedef float DFtype __attribute__ ((mode (DF))); #if LIBGCC2_HAS_XF_MODE typedef float XFtype __attribute__ ((mode (XF))); #endif /* LIBGCC2_HAS_XF_MODE */ #if LIBGCC2_HAS_TF_MODE typedef float TFtype __attribute__ ((mode (TF))); #endif /* LIBGCC2_HAS_XF_MODE */ typedef int SItype __attribute__ ((mode (SI))); typedef int DItype __attribute__ ((mode (DI))); typedef unsigned int USItype __attribute__ ((mode (SI))); typedef unsigned int UDItype __attribute__ ((mode (DI))); /* The type of the result of a decimal float comparison. This must match `word_mode' in GCC for the target. */ typedef int CMPtype __attribute__ ((mode (word))); typedef int SINT8 __attribute__ ((mode (QI))); typedef unsigned int UINT8 __attribute__ ((mode (QI))); typedef USItype UINT32; typedef SItype SINT32; typedef UDItype UINT64; typedef DItype SINT64; /* It has to be identical to the one defined in bid_functions.h. */ typedef __attribute__ ((aligned(16))) struct { UINT64 w[2]; } UINT128; #else /* if not IN_LIBGCC2 */ #ifndef BID_HAS_XF_MODE #define BID_HAS_XF_MODE 1 #endif #ifndef BID_HAS_TF_MODE #if defined __i386__ #define BID_HAS_TF_MODE 0 #else #define BID_HAS_TF_MODE 1 #endif #endif #ifndef SFtype #define SFtype float #endif #ifndef DFtype #define DFtype double #endif #if BID_HAS_XF_MODE #ifndef XFtype #define XFtype long double #endif #endif /* IN_LIBGCC2 */ #if BID_HAS_TF_MODE #ifndef TFtype #define TFtype __float128 #endif #endif #ifndef SItype #define SItype SINT32 #endif #ifndef DItype #define DItype SINT64 #endif #ifndef USItype #define USItype UINT32 #endif #ifndef UDItype #define UDItype UINT64 #endif #ifndef CMPtype #define CMPtype long #endif #endif /* IN_LIBGCC2 */ #if BID_HAS_GCC_DECIMAL_INTRINSICS /* Prototypes for gcc instrinsics */ extern _Decimal64 __bid_adddd3 (_Decimal64, _Decimal64); extern _Decimal64 __bid_subdd3 (_Decimal64, _Decimal64); extern _Decimal32 __bid_addsd3 (_Decimal32, _Decimal32); extern _Decimal32 __bid_subsd3 (_Decimal32, _Decimal32); extern _Decimal128 __bid_addtd3 (_Decimal128, _Decimal128); extern _Decimal128 __bid_subtd3 (_Decimal128, _Decimal128); extern DFtype __bid_truncdddf (_Decimal64); extern DItype __bid_fixdddi (_Decimal64); extern _Decimal32 __bid_truncddsd2 (_Decimal64); extern SFtype __bid_truncddsf (_Decimal64); extern SItype __bid_fixddsi (_Decimal64); extern _Decimal128 __bid_extendddtd2 (_Decimal64); #if BID_HAS_TF_MODE extern TFtype __bid_extendddtf (_Decimal64); #endif extern UDItype __bid_fixunsdddi (_Decimal64); extern USItype __bid_fixunsddsi (_Decimal64); #if BID_HAS_XF_MODE extern XFtype __bid_extendddxf (_Decimal64); #endif extern _Decimal64 __bid_extenddfdd (DFtype); extern _Decimal32 __bid_truncdfsd (DFtype); extern _Decimal128 __bid_extenddftd (DFtype); extern _Decimal64 __bid_floatdidd (DItype); extern _Decimal32 __bid_floatdisd (DItype); extern _Decimal128 __bid_floatditd (DItype); extern _Decimal64 __bid_divdd3 (_Decimal64, _Decimal64); extern _Decimal32 __bid_divsd3 (_Decimal32, _Decimal32); extern _Decimal128 __bid_divtd3 (_Decimal128, _Decimal128); extern CMPtype __bid_eqdd2 (_Decimal64, _Decimal64); extern CMPtype __bid_eqsd2 (_Decimal32, _Decimal32); extern CMPtype __bid_eqtd2 (_Decimal128, _Decimal128); extern CMPtype __bid_gedd2 (_Decimal64, _Decimal64); extern CMPtype __bid_gesd2 (_Decimal32, _Decimal32); extern CMPtype __bid_getd2 (_Decimal128, _Decimal128); extern CMPtype __bid_gtdd2 (_Decimal64, _Decimal64); extern CMPtype __bid_gtsd2 (_Decimal32, _Decimal32); extern CMPtype __bid_gttd2 (_Decimal128, _Decimal128); extern CMPtype __bid_ledd2 (_Decimal64, _Decimal64); extern CMPtype __bid_lesd2 (_Decimal32, _Decimal32); extern CMPtype __bid_letd2 (_Decimal128, _Decimal128); extern CMPtype __bid_ltdd2 (_Decimal64, _Decimal64); extern CMPtype __bid_ltsd2 (_Decimal32, _Decimal32); extern CMPtype __bid_lttd2 (_Decimal128, _Decimal128); extern CMPtype __bid_nedd2 (_Decimal64, _Decimal64); extern CMPtype __bid_nesd2 (_Decimal32, _Decimal32); extern CMPtype __bid_netd2 (_Decimal128, _Decimal128); extern CMPtype __bid_unorddd2 (_Decimal64, _Decimal64); extern CMPtype __bid_unordsd2 (_Decimal32, _Decimal32); extern CMPtype __bid_unordtd2 (_Decimal128, _Decimal128); extern _Decimal64 __bid_muldd3 (_Decimal64, _Decimal64); extern _Decimal32 __bid_mulsd3 (_Decimal32, _Decimal32); extern _Decimal128 __bid_multd3 (_Decimal128, _Decimal128); extern _Decimal64 __bid_extendsddd2 (_Decimal32); extern DFtype __bid_extendsddf (_Decimal32); extern DItype __bid_fixsddi (_Decimal32); extern SFtype __bid_truncsdsf (_Decimal32); extern SItype __bid_fixsdsi (_Decimal32); extern _Decimal128 __bid_extendsdtd2 (_Decimal32); #if BID_HAS_TF_MODE extern TFtype __bid_extendsdtf (_Decimal32); #endif extern UDItype __bid_fixunssddi (_Decimal32); extern USItype __bid_fixunssdsi (_Decimal32); #if BID_HAS_XF_MODE extern XFtype __bid_extendsdxf (_Decimal32); #endif extern _Decimal64 __bid_extendsfdd (SFtype); extern _Decimal32 __bid_extendsfsd (SFtype); extern _Decimal128 __bid_extendsftd (SFtype); extern _Decimal64 __bid_floatsidd (SItype); extern _Decimal32 __bid_floatsisd (SItype); extern _Decimal128 __bid_floatsitd (SItype); extern _Decimal64 __bid_trunctddd2 (_Decimal128); extern DFtype __bid_trunctddf (_Decimal128); extern DItype __bid_fixtddi (_Decimal128); extern _Decimal32 __bid_trunctdsd2 (_Decimal128); extern SFtype __bid_trunctdsf (_Decimal128); extern SItype __bid_fixtdsi (_Decimal128); #if BID_HAS_TF_MODE extern TFtype __bid_trunctdtf (_Decimal128); #endif extern UDItype __bid_fixunstddi (_Decimal128); extern USItype __bid_fixunstdsi (_Decimal128); #if BID_HAS_XF_MODE extern XFtype __bid_trunctdxf (_Decimal128); #endif #if BID_HAS_TF_MODE extern _Decimal64 __bid_trunctfdd (TFtype); extern _Decimal32 __bid_trunctfsd (TFtype); extern _Decimal128 __bid_extendtftd (TFtype); #endif extern _Decimal64 __bid_floatunsdidd (UDItype); extern _Decimal32 __bid_floatunsdisd (UDItype); extern _Decimal128 __bid_floatunsditd (UDItype); extern _Decimal64 __bid_floatunssidd (USItype); extern _Decimal32 __bid_floatunssisd (USItype); extern _Decimal128 __bid_floatunssitd (USItype); #if BID_HAS_XF_MODE extern _Decimal64 __bid_truncxfdd (XFtype); extern _Decimal32 __bid_truncxfsd (XFtype); extern _Decimal128 __bid_extendxftd (XFtype); #endif extern int isinfd32 (_Decimal32); extern int isinfd64 (_Decimal64); extern int isinfd128 (_Decimal128); #endif /* BID_HAS_GCC_DECIMAL_INTRINSICS */ extern void __dfp_set_round (int); extern int __dfp_get_round (void); extern void __dfp_clear_except (void); extern int __dfp_test_except (int); extern void __dfp_raise_except (int); #if BID_HAS_GCC_DECIMAL_INTRINSICS /* Used by gcc intrinsics. We have to define them after UINT128 is defined. */ union decimal32 { _Decimal32 d; UINT32 i; }; union decimal64 { _Decimal64 d; UINT64 i; }; union decimal128 { _Decimal128 d; UINT128 i; }; #if BID_HAS_TF_MODE union float128 { TFtype f; UINT128 i; }; #endif #endif /* BID_HAS_GCC_DECIMAL_INTRINSICS */ #endif /* _BID_GCC_INTRINSICS_H */