1/* Copyright (C) 2007-2022 Free Software Foundation, Inc. 2 3This file is part of GCC. 4 5GCC is free software; you can redistribute it and/or modify it under 6the terms of the GNU General Public License as published by the Free 7Software Foundation; either version 3, or (at your option) any later 8version. 9 10GCC is distributed in the hope that it will be useful, but WITHOUT ANY 11WARRANTY; without even the implied warranty of MERCHANTABILITY or 12FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13for more details. 14 15Under Section 7 of GPL version 3, you are granted additional 16permissions described in the GCC Runtime Library Exception, version 173.1, as published by the Free Software Foundation. 18 19You should have received a copy of the GNU General Public License and 20a copy of the GCC Runtime Library Exception along with this program; 21see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 22<http://www.gnu.org/licenses/>. */ 23 24#ifndef _BID_GCC_INTRINSICS_H 25#define _BID_GCC_INTRINSICS_H 26 27#ifdef IN_LIBGCC2 28 29#include "tconfig.h" 30#include "coretypes.h" 31#include "tm.h" 32#include "libgcc_tm.h" 33 34#ifdef __LIBGCC_HAS_XF_MODE__ 35#define LIBGCC2_HAS_XF_MODE 1 36#else 37#define LIBGCC2_HAS_XF_MODE 0 38#endif 39 40#ifdef __LIBGCC_HAS_TF_MODE__ 41#define LIBGCC2_HAS_TF_MODE 1 42#else 43#define LIBGCC2_HAS_TF_MODE 0 44#endif 45 46#ifndef BID_HAS_XF_MODE 47#define BID_HAS_XF_MODE LIBGCC2_HAS_XF_MODE 48#endif 49 50#ifndef BID_HAS_TF_MODE 51#define BID_HAS_TF_MODE LIBGCC2_HAS_TF_MODE 52#endif 53 54/* Some handy typedefs. */ 55 56typedef float SFtype __attribute__ ((mode (SF))); 57typedef float DFtype __attribute__ ((mode (DF))); 58#if LIBGCC2_HAS_XF_MODE 59typedef float XFtype __attribute__ ((mode (XF))); 60#endif /* LIBGCC2_HAS_XF_MODE */ 61#if LIBGCC2_HAS_TF_MODE 62typedef float TFtype __attribute__ ((mode (TF))); 63#endif /* LIBGCC2_HAS_XF_MODE */ 64 65typedef int SItype __attribute__ ((mode (SI))); 66typedef int DItype __attribute__ ((mode (DI))); 67typedef unsigned int USItype __attribute__ ((mode (SI))); 68typedef unsigned int UDItype __attribute__ ((mode (DI))); 69 70/* The type of the result of a decimal float comparison. This must 71 match `word_mode' in GCC for the target. */ 72 73typedef int CMPtype __attribute__ ((mode (word))); 74 75typedef int SINT8 __attribute__ ((mode (QI))); 76typedef unsigned int UINT8 __attribute__ ((mode (QI))); 77typedef USItype UINT32; 78typedef SItype SINT32; 79typedef UDItype UINT64; 80typedef DItype SINT64; 81 82/* It has to be identical to the one defined in bid_functions.h. */ 83typedef __attribute__ ((aligned(16))) struct 84{ 85 UINT64 w[2]; 86} UINT128; 87#else /* if not IN_LIBGCC2 */ 88 89#ifndef BID_HAS_XF_MODE 90#define BID_HAS_XF_MODE 1 91#endif 92 93#ifndef BID_HAS_TF_MODE 94#if defined __i386__ 95#define BID_HAS_TF_MODE 0 96#else 97#define BID_HAS_TF_MODE 1 98#endif 99#endif 100 101#ifndef SFtype 102#define SFtype float 103#endif 104 105#ifndef DFtype 106#define DFtype double 107#endif 108 109#if BID_HAS_XF_MODE 110#ifndef XFtype 111#define XFtype long double 112#endif 113 114#endif /* IN_LIBGCC2 */ 115 116#if BID_HAS_TF_MODE 117#ifndef TFtype 118#define TFtype __float128 119#endif 120#endif 121 122#ifndef SItype 123#define SItype SINT32 124#endif 125 126#ifndef DItype 127#define DItype SINT64 128#endif 129 130#ifndef USItype 131#define USItype UINT32 132#endif 133 134#ifndef UDItype 135#define UDItype UINT64 136#endif 137 138#ifndef CMPtype 139#define CMPtype long 140#endif 141#endif /* IN_LIBGCC2 */ 142 143#if BID_HAS_GCC_DECIMAL_INTRINSICS 144/* Prototypes for gcc instrinsics */ 145 146extern _Decimal64 __bid_adddd3 (_Decimal64, _Decimal64); 147extern _Decimal64 __bid_subdd3 (_Decimal64, _Decimal64); 148extern _Decimal32 __bid_addsd3 (_Decimal32, _Decimal32); 149extern _Decimal32 __bid_subsd3 (_Decimal32, _Decimal32); 150extern _Decimal128 __bid_addtd3 (_Decimal128, _Decimal128); 151extern _Decimal128 __bid_subtd3 (_Decimal128, _Decimal128); 152extern DFtype __bid_truncdddf (_Decimal64); 153extern DItype __bid_fixdddi (_Decimal64); 154extern _Decimal32 __bid_truncddsd2 (_Decimal64); 155extern SFtype __bid_truncddsf (_Decimal64); 156extern SItype __bid_fixddsi (_Decimal64); 157extern _Decimal128 __bid_extendddtd2 (_Decimal64); 158#if BID_HAS_TF_MODE 159extern TFtype __bid_extendddtf (_Decimal64); 160#endif 161extern UDItype __bid_fixunsdddi (_Decimal64); 162extern USItype __bid_fixunsddsi (_Decimal64); 163#if BID_HAS_XF_MODE 164extern XFtype __bid_extendddxf (_Decimal64); 165#endif 166extern _Decimal64 __bid_extenddfdd (DFtype); 167extern _Decimal32 __bid_truncdfsd (DFtype); 168extern _Decimal128 __bid_extenddftd (DFtype); 169extern _Decimal64 __bid_floatdidd (DItype); 170extern _Decimal32 __bid_floatdisd (DItype); 171extern _Decimal128 __bid_floatditd (DItype); 172extern _Decimal64 __bid_divdd3 (_Decimal64, _Decimal64); 173extern _Decimal32 __bid_divsd3 (_Decimal32, _Decimal32); 174extern _Decimal128 __bid_divtd3 (_Decimal128, _Decimal128); 175extern CMPtype __bid_eqdd2 (_Decimal64, _Decimal64); 176extern CMPtype __bid_eqsd2 (_Decimal32, _Decimal32); 177extern CMPtype __bid_eqtd2 (_Decimal128, _Decimal128); 178extern CMPtype __bid_gedd2 (_Decimal64, _Decimal64); 179extern CMPtype __bid_gesd2 (_Decimal32, _Decimal32); 180extern CMPtype __bid_getd2 (_Decimal128, _Decimal128); 181extern CMPtype __bid_gtdd2 (_Decimal64, _Decimal64); 182extern CMPtype __bid_gtsd2 (_Decimal32, _Decimal32); 183extern CMPtype __bid_gttd2 (_Decimal128, _Decimal128); 184extern CMPtype __bid_ledd2 (_Decimal64, _Decimal64); 185extern CMPtype __bid_lesd2 (_Decimal32, _Decimal32); 186extern CMPtype __bid_letd2 (_Decimal128, _Decimal128); 187extern CMPtype __bid_ltdd2 (_Decimal64, _Decimal64); 188extern CMPtype __bid_ltsd2 (_Decimal32, _Decimal32); 189extern CMPtype __bid_lttd2 (_Decimal128, _Decimal128); 190extern CMPtype __bid_nedd2 (_Decimal64, _Decimal64); 191extern CMPtype __bid_nesd2 (_Decimal32, _Decimal32); 192extern CMPtype __bid_netd2 (_Decimal128, _Decimal128); 193extern CMPtype __bid_unorddd2 (_Decimal64, _Decimal64); 194extern CMPtype __bid_unordsd2 (_Decimal32, _Decimal32); 195extern CMPtype __bid_unordtd2 (_Decimal128, _Decimal128); 196extern _Decimal64 __bid_muldd3 (_Decimal64, _Decimal64); 197extern _Decimal32 __bid_mulsd3 (_Decimal32, _Decimal32); 198extern _Decimal128 __bid_multd3 (_Decimal128, _Decimal128); 199extern _Decimal64 __bid_extendsddd2 (_Decimal32); 200extern DFtype __bid_extendsddf (_Decimal32); 201extern DItype __bid_fixsddi (_Decimal32); 202extern SFtype __bid_truncsdsf (_Decimal32); 203extern SItype __bid_fixsdsi (_Decimal32); 204extern _Decimal128 __bid_extendsdtd2 (_Decimal32); 205#if BID_HAS_TF_MODE 206extern TFtype __bid_extendsdtf (_Decimal32); 207#endif 208extern UDItype __bid_fixunssddi (_Decimal32); 209extern USItype __bid_fixunssdsi (_Decimal32); 210#if BID_HAS_XF_MODE 211extern XFtype __bid_extendsdxf (_Decimal32); 212#endif 213extern _Decimal64 __bid_extendsfdd (SFtype); 214extern _Decimal32 __bid_extendsfsd (SFtype); 215extern _Decimal128 __bid_extendsftd (SFtype); 216extern _Decimal64 __bid_floatsidd (SItype); 217extern _Decimal32 __bid_floatsisd (SItype); 218extern _Decimal128 __bid_floatsitd (SItype); 219extern _Decimal64 __bid_trunctddd2 (_Decimal128); 220extern DFtype __bid_trunctddf (_Decimal128); 221extern DItype __bid_fixtddi (_Decimal128); 222extern _Decimal32 __bid_trunctdsd2 (_Decimal128); 223extern SFtype __bid_trunctdsf (_Decimal128); 224extern SItype __bid_fixtdsi (_Decimal128); 225#if BID_HAS_TF_MODE 226extern TFtype __bid_trunctdtf (_Decimal128); 227#endif 228extern UDItype __bid_fixunstddi (_Decimal128); 229extern USItype __bid_fixunstdsi (_Decimal128); 230#if BID_HAS_XF_MODE 231extern XFtype __bid_trunctdxf (_Decimal128); 232#endif 233#if BID_HAS_TF_MODE 234extern _Decimal64 __bid_trunctfdd (TFtype); 235extern _Decimal32 __bid_trunctfsd (TFtype); 236extern _Decimal128 __bid_extendtftd (TFtype); 237#endif 238extern _Decimal64 __bid_floatunsdidd (UDItype); 239extern _Decimal32 __bid_floatunsdisd (UDItype); 240extern _Decimal128 __bid_floatunsditd (UDItype); 241extern _Decimal64 __bid_floatunssidd (USItype); 242extern _Decimal32 __bid_floatunssisd (USItype); 243extern _Decimal128 __bid_floatunssitd (USItype); 244#if BID_HAS_XF_MODE 245extern _Decimal64 __bid_truncxfdd (XFtype); 246extern _Decimal32 __bid_truncxfsd (XFtype); 247extern _Decimal128 __bid_extendxftd (XFtype); 248#endif 249extern int isinfd32 (_Decimal32); 250extern int isinfd64 (_Decimal64); 251extern int isinfd128 (_Decimal128); 252#endif /* BID_HAS_GCC_DECIMAL_INTRINSICS */ 253 254extern void __dfp_set_round (int); 255extern int __dfp_get_round (void); 256extern void __dfp_clear_except (void); 257extern int __dfp_test_except (int); 258extern void __dfp_raise_except (int); 259 260#if BID_HAS_GCC_DECIMAL_INTRINSICS 261/* Used by gcc intrinsics. We have to define them after UINT128 262 is defined. */ 263union decimal32 { 264 _Decimal32 d; 265 UINT32 i; 266}; 267 268union decimal64 { 269 _Decimal64 d; 270 UINT64 i; 271}; 272 273union decimal128 { 274 _Decimal128 d; 275 UINT128 i; 276}; 277 278#if BID_HAS_TF_MODE 279union float128 { 280 TFtype f; 281 UINT128 i; 282}; 283#endif 284#endif /* BID_HAS_GCC_DECIMAL_INTRINSICS */ 285 286#endif /* _BID_GCC_INTRINSICS_H */ 287