| /* 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 |
| <http://www.gnu.org/licenses/>. */ |
| |
| #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 */ |