1/* Copyright (C) 2007-2015 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