xref: /dragonfly/contrib/gcc-8.0/libgcc/libgcc2.h (revision 38fd1498)
1*38fd1498Szrj /* Header file for libgcc2.c.  */
2*38fd1498Szrj /* Copyright (C) 2000-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj This file is part of GCC.
5*38fd1498Szrj 
6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
7*38fd1498Szrj the terms of the GNU General Public License as published by the Free
8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj version.
10*38fd1498Szrj 
11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*38fd1498Szrj for more details.
15*38fd1498Szrj 
16*38fd1498Szrj Under Section 7 of GPL version 3, you are granted additional
17*38fd1498Szrj permissions described in the GCC Runtime Library Exception, version
18*38fd1498Szrj 3.1, as published by the Free Software Foundation.
19*38fd1498Szrj 
20*38fd1498Szrj You should have received a copy of the GNU General Public License and
21*38fd1498Szrj a copy of the GCC Runtime Library Exception along with this program;
22*38fd1498Szrj see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
24*38fd1498Szrj 
25*38fd1498Szrj #ifndef GCC_LIBGCC2_H
26*38fd1498Szrj #define GCC_LIBGCC2_H
27*38fd1498Szrj 
28*38fd1498Szrj #ifndef HIDE_EXPORTS
29*38fd1498Szrj #pragma GCC visibility push(default)
30*38fd1498Szrj #endif
31*38fd1498Szrj 
32*38fd1498Szrj extern int __gcc_bcmp (const unsigned char *, const unsigned char *, size_t);
33*38fd1498Szrj extern void __clear_cache (char *, char *);
34*38fd1498Szrj extern void __eprintf (const char *, const char *, unsigned int, const char *)
35*38fd1498Szrj   __attribute__ ((__noreturn__));
36*38fd1498Szrj 
37*38fd1498Szrj #ifdef __LIBGCC_HAS_HF_MODE__
38*38fd1498Szrj #define LIBGCC2_HAS_HF_MODE 1
39*38fd1498Szrj #else
40*38fd1498Szrj #define LIBGCC2_HAS_HF_MODE 0
41*38fd1498Szrj #endif
42*38fd1498Szrj 
43*38fd1498Szrj #ifdef __LIBGCC_HAS_SF_MODE__
44*38fd1498Szrj #define LIBGCC2_HAS_SF_MODE 1
45*38fd1498Szrj #else
46*38fd1498Szrj #define LIBGCC2_HAS_SF_MODE 0
47*38fd1498Szrj #endif
48*38fd1498Szrj 
49*38fd1498Szrj #ifdef __LIBGCC_HAS_DF_MODE__
50*38fd1498Szrj #define LIBGCC2_HAS_DF_MODE 1
51*38fd1498Szrj #else
52*38fd1498Szrj #define LIBGCC2_HAS_DF_MODE 0
53*38fd1498Szrj #endif
54*38fd1498Szrj 
55*38fd1498Szrj #ifdef __LIBGCC_HAS_XF_MODE__
56*38fd1498Szrj #define LIBGCC2_HAS_XF_MODE 1
57*38fd1498Szrj #else
58*38fd1498Szrj #define LIBGCC2_HAS_XF_MODE 0
59*38fd1498Szrj #endif
60*38fd1498Szrj 
61*38fd1498Szrj #ifdef __LIBGCC_HAS_TF_MODE__
62*38fd1498Szrj #define LIBGCC2_HAS_TF_MODE 1
63*38fd1498Szrj #else
64*38fd1498Szrj #define LIBGCC2_HAS_TF_MODE 0
65*38fd1498Szrj #endif
66*38fd1498Szrj 
67*38fd1498Szrj #ifndef __LIBGCC_SF_MANT_DIG__
68*38fd1498Szrj #if LIBGCC2_HAS_SF_MODE
69*38fd1498Szrj #error __LIBGCC_SF_MANT_DIG__ not defined
70*38fd1498Szrj #else
71*38fd1498Szrj #define __LIBGCC_SF_MANT_DIG__ 0
72*38fd1498Szrj #endif
73*38fd1498Szrj #endif
74*38fd1498Szrj 
75*38fd1498Szrj #ifndef __LIBGCC_DF_MANT_DIG__
76*38fd1498Szrj #if LIBGCC2_HAS_DF_MODE
77*38fd1498Szrj #error __LIBGCC_DF_MANT_DIG__ not defined
78*38fd1498Szrj #else
79*38fd1498Szrj #define __LIBGCC_DF_MANT_DIG__ 0
80*38fd1498Szrj #endif
81*38fd1498Szrj #endif
82*38fd1498Szrj 
83*38fd1498Szrj #ifndef __LIBGCC_XF_MANT_DIG__
84*38fd1498Szrj #if LIBGCC2_HAS_XF_MODE
85*38fd1498Szrj #error __LIBGCC_XF_MANT_DIG__ not defined
86*38fd1498Szrj #else
87*38fd1498Szrj #define __LIBGCC_XF_MANT_DIG__ 0
88*38fd1498Szrj #endif
89*38fd1498Szrj #endif
90*38fd1498Szrj 
91*38fd1498Szrj #ifndef __LIBGCC_TF_MANT_DIG__
92*38fd1498Szrj #if LIBGCC2_HAS_TF_MODE
93*38fd1498Szrj #error __LIBGCC_TF_MANT_DIG__ not defined
94*38fd1498Szrj #else
95*38fd1498Szrj #define __LIBGCC_TF_MANT_DIG__ 0
96*38fd1498Szrj #endif
97*38fd1498Szrj #endif
98*38fd1498Szrj 
99*38fd1498Szrj /* FIXME: This #ifdef probably should be removed, ie. enable the test
100*38fd1498Szrj    for mips too.  */
101*38fd1498Szrj /* Don't use IBM Extended Double TFmode for TI->SF calculations.
102*38fd1498Szrj    The conversion from long double to float suffers from double
103*38fd1498Szrj    rounding, because we convert via double.  In other cases, going
104*38fd1498Szrj    through the software fp routines is much slower than the fallback.  */
105*38fd1498Szrj #ifdef __powerpc__
106*38fd1498Szrj #define AVOID_FP_TYPE_CONVERSION(SIZE) (SIZE == 106)
107*38fd1498Szrj #elif defined(WIDEST_HARDWARE_FP_SIZE)
108*38fd1498Szrj #define AVOID_FP_TYPE_CONVERSION(SIZE) (SIZE > WIDEST_HARDWARE_FP_SIZE)
109*38fd1498Szrj #else
110*38fd1498Szrj #define AVOID_FP_TYPE_CONVERSION(SIZE) 0
111*38fd1498Szrj #endif
112*38fd1498Szrj 
113*38fd1498Szrj /* In the first part of this file, we are interfacing to calls generated
114*38fd1498Szrj    by the compiler itself.  These calls pass values into these routines
115*38fd1498Szrj    which have very specific modes (rather than very specific types), and
116*38fd1498Szrj    these compiler-generated calls also expect any return values to have
117*38fd1498Szrj    very specific modes (rather than very specific types).  Thus, we need
118*38fd1498Szrj    to avoid using regular C language type names in this part of the file
119*38fd1498Szrj    because the sizes for those types can be configured to be anything.
120*38fd1498Szrj    Instead we use the following special type names.  */
121*38fd1498Szrj 
122*38fd1498Szrj typedef		 int QItype	__attribute__ ((mode (QI)));
123*38fd1498Szrj typedef unsigned int UQItype	__attribute__ ((mode (QI)));
124*38fd1498Szrj typedef		 int HItype	__attribute__ ((mode (HI)));
125*38fd1498Szrj typedef unsigned int UHItype	__attribute__ ((mode (HI)));
126*38fd1498Szrj #if MIN_UNITS_PER_WORD > 1
127*38fd1498Szrj /* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1.  */
128*38fd1498Szrj typedef 	 int SItype	__attribute__ ((mode (SI)));
129*38fd1498Szrj typedef unsigned int USItype	__attribute__ ((mode (SI)));
130*38fd1498Szrj #if __SIZEOF_LONG_LONG__ > 4
131*38fd1498Szrj /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2.  */
132*38fd1498Szrj typedef		 int DItype	__attribute__ ((mode (DI)));
133*38fd1498Szrj typedef unsigned int UDItype	__attribute__ ((mode (DI)));
134*38fd1498Szrj #if MIN_UNITS_PER_WORD > 4
135*38fd1498Szrj /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 4.  */
136*38fd1498Szrj typedef		 int TItype	__attribute__ ((mode (TI)));
137*38fd1498Szrj typedef unsigned int UTItype	__attribute__ ((mode (TI)));
138*38fd1498Szrj #endif
139*38fd1498Szrj #endif
140*38fd1498Szrj #endif
141*38fd1498Szrj 
142*38fd1498Szrj #if LIBGCC2_HAS_HF_MODE
143*38fd1498Szrj typedef		float HFtype	__attribute__ ((mode (HF)));
144*38fd1498Szrj typedef _Complex float HCtype	__attribute__ ((mode (HC)));
145*38fd1498Szrj #endif
146*38fd1498Szrj #if LIBGCC2_HAS_SF_MODE
147*38fd1498Szrj typedef 	float SFtype	__attribute__ ((mode (SF)));
148*38fd1498Szrj typedef _Complex float SCtype	__attribute__ ((mode (SC)));
149*38fd1498Szrj #endif
150*38fd1498Szrj #if LIBGCC2_HAS_DF_MODE
151*38fd1498Szrj typedef		float DFtype	__attribute__ ((mode (DF)));
152*38fd1498Szrj typedef _Complex float DCtype	__attribute__ ((mode (DC)));
153*38fd1498Szrj #endif
154*38fd1498Szrj #if LIBGCC2_HAS_XF_MODE
155*38fd1498Szrj typedef		float XFtype	__attribute__ ((mode (XF)));
156*38fd1498Szrj typedef _Complex float XCtype	__attribute__ ((mode (XC)));
157*38fd1498Szrj #endif
158*38fd1498Szrj #if LIBGCC2_HAS_TF_MODE
159*38fd1498Szrj typedef		float TFtype	__attribute__ ((mode (TF)));
160*38fd1498Szrj typedef _Complex float TCtype	__attribute__ ((mode (TC)));
161*38fd1498Szrj #endif
162*38fd1498Szrj 
163*38fd1498Szrj typedef int cmp_return_type __attribute__((mode (__libgcc_cmp_return__)));
164*38fd1498Szrj typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__)));
165*38fd1498Szrj 
166*38fd1498Szrj /* Make sure that we don't accidentally use any normal C language built-in
167*38fd1498Szrj    type names in the first part of this file.  Instead we want to use *only*
168*38fd1498Szrj    the type names defined above.  The following macro definitions insure
169*38fd1498Szrj    that if we *do* accidentally use some normal C language built-in type name,
170*38fd1498Szrj    we will get a syntax error.  */
171*38fd1498Szrj 
172*38fd1498Szrj #define char bogus_type
173*38fd1498Szrj #define short bogus_type
174*38fd1498Szrj #define int bogus_type
175*38fd1498Szrj #define long bogus_type
176*38fd1498Szrj #define unsigned bogus_type
177*38fd1498Szrj #define float bogus_type
178*38fd1498Szrj #define double bogus_type
179*38fd1498Szrj 
180*38fd1498Szrj /* Versions prior to 3.4.4 were not taking into account the word size for
181*38fd1498Szrj    the 5 trapping arithmetic functions absv, addv, subv, mulv and negv.  As
182*38fd1498Szrj    a consequence, the si and di variants were always and the only ones emitted.
183*38fd1498Szrj    To maintain backward compatibility, COMPAT_SIMODE_TRAPPING_ARITHMETIC is
184*38fd1498Szrj    defined on platforms where it makes sense to still have the si variants
185*38fd1498Szrj    emitted.  As a bonus, their implementation is now correct.  Note that the
186*38fd1498Szrj    same mechanism should have been implemented for the di variants, but it
187*38fd1498Szrj    turns out that no platform would define COMPAT_DIMODE_TRAPPING_ARITHMETIC
188*38fd1498Szrj    if it existed.  */
189*38fd1498Szrj 
190*38fd1498Szrj #if LIBGCC2_UNITS_PER_WORD == 8
191*38fd1498Szrj #define W_TYPE_SIZE (8 * __CHAR_BIT__)
192*38fd1498Szrj #define Wtype	DItype
193*38fd1498Szrj #define UWtype	UDItype
194*38fd1498Szrj #define HWtype	DItype
195*38fd1498Szrj #define UHWtype	UDItype
196*38fd1498Szrj #define DWtype	TItype
197*38fd1498Szrj #define UDWtype	UTItype
198*38fd1498Szrj #ifdef LIBGCC2_GNU_PREFIX
199*38fd1498Szrj #define __NW(a,b)	__gnu_ ## a ## di ## b
200*38fd1498Szrj #define __NDW(a,b)	__gnu_ ## a ## ti ## b
201*38fd1498Szrj #else
202*38fd1498Szrj #define __NW(a,b)	__ ## a ## di ## b
203*38fd1498Szrj #define __NDW(a,b)	__ ## a ## ti ## b
204*38fd1498Szrj #endif
205*38fd1498Szrj #define COMPAT_SIMODE_TRAPPING_ARITHMETIC
206*38fd1498Szrj #elif LIBGCC2_UNITS_PER_WORD == 4
207*38fd1498Szrj #define W_TYPE_SIZE (4 * __CHAR_BIT__)
208*38fd1498Szrj #define Wtype	SItype
209*38fd1498Szrj #define UWtype	USItype
210*38fd1498Szrj #define HWtype	SItype
211*38fd1498Szrj #define UHWtype	USItype
212*38fd1498Szrj #define DWtype	DItype
213*38fd1498Szrj #define UDWtype	UDItype
214*38fd1498Szrj #ifdef LIBGCC2_GNU_PREFIX
215*38fd1498Szrj #define __NW(a,b)	__gnu_ ## a ## si ## b
216*38fd1498Szrj #define __NDW(a,b)	__gnu_ ## a ## di ## b
217*38fd1498Szrj #else
218*38fd1498Szrj #define __NW(a,b)	__ ## a ## si ## b
219*38fd1498Szrj #define __NDW(a,b)	__ ## a ## di ## b
220*38fd1498Szrj #endif
221*38fd1498Szrj #elif LIBGCC2_UNITS_PER_WORD == 2
222*38fd1498Szrj #define W_TYPE_SIZE (2 * __CHAR_BIT__)
223*38fd1498Szrj #define Wtype	HItype
224*38fd1498Szrj #define UWtype	UHItype
225*38fd1498Szrj #define HWtype	HItype
226*38fd1498Szrj #define UHWtype	UHItype
227*38fd1498Szrj #define DWtype	SItype
228*38fd1498Szrj #define UDWtype	USItype
229*38fd1498Szrj #ifdef LIBGCC2_GNU_PREFIX
230*38fd1498Szrj #define __NW(a,b)	__gnu_ ## a ## hi ## b
231*38fd1498Szrj #define __NDW(a,b)	__gnu_ ## a ## si ## b
232*38fd1498Szrj #else
233*38fd1498Szrj #define __NW(a,b)	__ ## a ## hi ## b
234*38fd1498Szrj #define __NDW(a,b)	__ ## a ## si ## b
235*38fd1498Szrj #endif
236*38fd1498Szrj #else
237*38fd1498Szrj #define W_TYPE_SIZE __CHAR_BIT__
238*38fd1498Szrj #define Wtype	QItype
239*38fd1498Szrj #define UWtype  UQItype
240*38fd1498Szrj #define HWtype	QItype
241*38fd1498Szrj #define UHWtype	UQItype
242*38fd1498Szrj #define DWtype	HItype
243*38fd1498Szrj #define UDWtype	UHItype
244*38fd1498Szrj #ifdef LIBGCC2_GNU_PREFIX
245*38fd1498Szrj #define __NW(a,b)	__gnu_ ## a ## qi ## b
246*38fd1498Szrj #define __NDW(a,b)	__gnu_ ## a ## hi ## b
247*38fd1498Szrj #else
248*38fd1498Szrj #define __NW(a,b)	__ ## a ## qi ## b
249*38fd1498Szrj #define __NDW(a,b)	__ ## a ## hi ## b
250*38fd1498Szrj #endif
251*38fd1498Szrj #endif
252*38fd1498Szrj 
253*38fd1498Szrj #ifdef LIBGCC2_GNU_PREFIX
254*38fd1498Szrj #define __N(a)	__gnu_ ## a
255*38fd1498Szrj #else
256*38fd1498Szrj #define __N(a)	__ ## a
257*38fd1498Szrj #endif
258*38fd1498Szrj #define Wtype_MAX ((Wtype)(((UWtype)1 << (W_TYPE_SIZE - 1)) - 1))
259*38fd1498Szrj #define Wtype_MIN (- Wtype_MAX - 1)
260*38fd1498Szrj 
261*38fd1498Szrj #if W_TYPE_SIZE == 8
262*38fd1498Szrj # define Wtype_MAXp1_F	0x1p8f
263*38fd1498Szrj #elif W_TYPE_SIZE == 16
264*38fd1498Szrj # define Wtype_MAXp1_F	0x1p16f
265*38fd1498Szrj #elif W_TYPE_SIZE == 32
266*38fd1498Szrj # define Wtype_MAXp1_F	0x1p32f
267*38fd1498Szrj #elif W_TYPE_SIZE == 64
268*38fd1498Szrj # define Wtype_MAXp1_F	0x1p64f
269*38fd1498Szrj #else
270*38fd1498Szrj # error "expand the table"
271*38fd1498Szrj #endif
272*38fd1498Szrj 
273*38fd1498Szrj #define __muldi3	__NDW(mul,3)
274*38fd1498Szrj #define __divdi3	__NDW(div,3)
275*38fd1498Szrj #define __udivdi3	__NDW(udiv,3)
276*38fd1498Szrj #define __moddi3	__NDW(mod,3)
277*38fd1498Szrj #define __umoddi3	__NDW(umod,3)
278*38fd1498Szrj #define __negdi2	__NDW(neg,2)
279*38fd1498Szrj #define __lshrdi3	__NDW(lshr,3)
280*38fd1498Szrj #define __ashldi3	__NDW(ashl,3)
281*38fd1498Szrj #define __ashrdi3	__NDW(ashr,3)
282*38fd1498Szrj #define __cmpdi2	__NDW(cmp,2)
283*38fd1498Szrj #define __ucmpdi2	__NDW(ucmp,2)
284*38fd1498Szrj #define __divmoddi4	__NDW(divmod,4)
285*38fd1498Szrj #define __udivmoddi4	__NDW(udivmod,4)
286*38fd1498Szrj #define __fixunstfDI	__NDW(fixunstf,)
287*38fd1498Szrj #define __fixtfdi	__NDW(fixtf,)
288*38fd1498Szrj #define __fixunsxfDI	__NDW(fixunsxf,)
289*38fd1498Szrj #define __fixxfdi	__NDW(fixxf,)
290*38fd1498Szrj #define __fixunsdfDI	__NDW(fixunsdf,)
291*38fd1498Szrj #define __fixdfdi	__NDW(fixdf,)
292*38fd1498Szrj #define __fixunssfDI	__NDW(fixunssf,)
293*38fd1498Szrj #define __fixsfdi	__NDW(fixsf,)
294*38fd1498Szrj #define __floatdixf	__NDW(float,xf)
295*38fd1498Szrj #define __floatditf	__NDW(float,tf)
296*38fd1498Szrj #define __floatdidf	__NDW(float,df)
297*38fd1498Szrj #define __floatdisf	__NDW(float,sf)
298*38fd1498Szrj #define __floatundixf	__NDW(floatun,xf)
299*38fd1498Szrj #define __floatunditf	__NDW(floatun,tf)
300*38fd1498Szrj #define __floatundidf	__NDW(floatun,df)
301*38fd1498Szrj #define __floatundisf	__NDW(floatun,sf)
302*38fd1498Szrj #define __fixunsxfSI	__NW(fixunsxf,)
303*38fd1498Szrj #define __fixunstfSI	__NW(fixunstf,)
304*38fd1498Szrj #define __fixunsdfSI	__NW(fixunsdf,)
305*38fd1498Szrj #define __fixunssfSI	__NW(fixunssf,)
306*38fd1498Szrj 
307*38fd1498Szrj #define __absvSI2	__NW(absv,2)
308*38fd1498Szrj #define __addvSI3	__NW(addv,3)
309*38fd1498Szrj #define __subvSI3	__NW(subv,3)
310*38fd1498Szrj #define __mulvSI3	__NW(mulv,3)
311*38fd1498Szrj #define __negvSI2	__NW(negv,2)
312*38fd1498Szrj #define __absvDI2	__NDW(absv,2)
313*38fd1498Szrj #define __addvDI3	__NDW(addv,3)
314*38fd1498Szrj #define __subvDI3	__NDW(subv,3)
315*38fd1498Szrj #define __mulvDI3	__NDW(mulv,3)
316*38fd1498Szrj #define __negvDI2	__NDW(negv,2)
317*38fd1498Szrj 
318*38fd1498Szrj #define __ffsSI2	__NW(ffs,2)
319*38fd1498Szrj #define __clzSI2	__NW(clz,2)
320*38fd1498Szrj #define __ctzSI2	__NW(ctz,2)
321*38fd1498Szrj #define __clrsbSI2	__NW(clrsb,2)
322*38fd1498Szrj #define __popcountSI2	__NW(popcount,2)
323*38fd1498Szrj #define __paritySI2	__NW(parity,2)
324*38fd1498Szrj #define __ffsDI2	__NDW(ffs,2)
325*38fd1498Szrj #define __clzDI2	__NDW(clz,2)
326*38fd1498Szrj #define __ctzDI2	__NDW(ctz,2)
327*38fd1498Szrj #define __clrsbDI2	__NDW(clrsb,2)
328*38fd1498Szrj #define __popcountDI2	__NDW(popcount,2)
329*38fd1498Szrj #define __parityDI2	__NDW(parity,2)
330*38fd1498Szrj 
331*38fd1498Szrj #define __clz_tab		__N(clz_tab)
332*38fd1498Szrj #define __bswapsi2		__N(bswapsi2)
333*38fd1498Szrj #define __bswapdi2		__N(bswapdi2)
334*38fd1498Szrj #define __udiv_w_sdiv		__N(udiv_w_sdiv)
335*38fd1498Szrj #define __clear_cache		__N(clear_cache)
336*38fd1498Szrj #define __enable_execute_stack	__N(enable_execute_stack)
337*38fd1498Szrj 
338*38fd1498Szrj #ifndef __powisf2
339*38fd1498Szrj #define __powisf2		__N(powisf2)
340*38fd1498Szrj #endif
341*38fd1498Szrj #ifndef __powidf2
342*38fd1498Szrj #define __powidf2		__N(powidf2)
343*38fd1498Szrj #endif
344*38fd1498Szrj #ifndef __powitf2
345*38fd1498Szrj #define __powitf2		__N(powitf2)
346*38fd1498Szrj #endif
347*38fd1498Szrj #ifndef __powixf2
348*38fd1498Szrj #define __powixf2		__N(powixf2)
349*38fd1498Szrj #endif
350*38fd1498Szrj #ifndef __mulsc3
351*38fd1498Szrj #define __mulsc3		__N(mulsc3)
352*38fd1498Szrj #endif
353*38fd1498Szrj #ifndef __muldc3
354*38fd1498Szrj #define __muldc3		__N(muldc3)
355*38fd1498Szrj #endif
356*38fd1498Szrj #ifndef __mulxc3
357*38fd1498Szrj #define __mulxc3		__N(mulxc3)
358*38fd1498Szrj #endif
359*38fd1498Szrj #ifndef __multc3
360*38fd1498Szrj #define __multc3		__N(multc3)
361*38fd1498Szrj #endif
362*38fd1498Szrj #ifndef __divsc3
363*38fd1498Szrj #define __divsc3		__N(divsc3)
364*38fd1498Szrj #endif
365*38fd1498Szrj #ifndef __divdc3
366*38fd1498Szrj #define __divdc3		__N(divdc3)
367*38fd1498Szrj #endif
368*38fd1498Szrj #ifndef __divxc3
369*38fd1498Szrj #define __divxc3		__N(divxc3)
370*38fd1498Szrj #endif
371*38fd1498Szrj #ifndef __divtc3
372*38fd1498Szrj #define __divtc3		__N(divtc3)
373*38fd1498Szrj #endif
374*38fd1498Szrj 
375*38fd1498Szrj extern DWtype __muldi3 (DWtype, DWtype);
376*38fd1498Szrj extern DWtype __divdi3 (DWtype, DWtype);
377*38fd1498Szrj extern UDWtype __udivdi3 (UDWtype, UDWtype);
378*38fd1498Szrj extern UDWtype __umoddi3 (UDWtype, UDWtype);
379*38fd1498Szrj extern DWtype __moddi3 (DWtype, DWtype);
380*38fd1498Szrj extern DWtype __divmoddi4 (DWtype, DWtype, DWtype *);
381*38fd1498Szrj 
382*38fd1498Szrj /* __udivmoddi4 is static inline when building other libgcc2 portions.  */
383*38fd1498Szrj #if (!defined (L_udivdi3) && !defined (L_divdi3) && \
384*38fd1498Szrj      !defined (L_umoddi3) && !defined (L_moddi3) && \
385*38fd1498Szrj      !defined (L_divmoddi4))
386*38fd1498Szrj extern UDWtype __udivmoddi4 (UDWtype, UDWtype, UDWtype *);
387*38fd1498Szrj #endif
388*38fd1498Szrj 
389*38fd1498Szrj /* __negdi2 is static inline when building other libgcc2 portions.  */
390*38fd1498Szrj #if !defined(L_divdi3) && !defined(L_moddi3)
391*38fd1498Szrj extern DWtype __negdi2 (DWtype);
392*38fd1498Szrj #endif
393*38fd1498Szrj 
394*38fd1498Szrj extern DWtype __lshrdi3 (DWtype, shift_count_type);
395*38fd1498Szrj extern DWtype __ashldi3 (DWtype, shift_count_type);
396*38fd1498Szrj extern DWtype __ashrdi3 (DWtype, shift_count_type);
397*38fd1498Szrj 
398*38fd1498Szrj /* __udiv_w_sdiv is static inline when building other libgcc2 portions.  */
399*38fd1498Szrj #if (!defined(L_udivdi3) && !defined(L_divdi3) && \
400*38fd1498Szrj      !defined(L_umoddi3) && !defined(L_moddi3))
401*38fd1498Szrj extern UWtype __udiv_w_sdiv (UWtype *, UWtype, UWtype, UWtype);
402*38fd1498Szrj #endif
403*38fd1498Szrj 
404*38fd1498Szrj extern cmp_return_type __cmpdi2 (DWtype, DWtype);
405*38fd1498Szrj extern cmp_return_type __ucmpdi2 (DWtype, DWtype);
406*38fd1498Szrj 
407*38fd1498Szrj #if MIN_UNITS_PER_WORD > 1
408*38fd1498Szrj extern SItype __bswapsi2 (SItype);
409*38fd1498Szrj #endif
410*38fd1498Szrj #if __SIZEOF_LONG_LONG__ > 4
411*38fd1498Szrj extern DItype __bswapdi2 (DItype);
412*38fd1498Szrj #endif
413*38fd1498Szrj 
414*38fd1498Szrj extern Wtype __absvSI2 (Wtype);
415*38fd1498Szrj extern Wtype __addvSI3 (Wtype, Wtype);
416*38fd1498Szrj extern Wtype __subvSI3 (Wtype, Wtype);
417*38fd1498Szrj extern Wtype __mulvSI3 (Wtype, Wtype);
418*38fd1498Szrj extern Wtype __negvSI2 (Wtype);
419*38fd1498Szrj extern DWtype __absvDI2 (DWtype);
420*38fd1498Szrj extern DWtype __addvDI3 (DWtype, DWtype);
421*38fd1498Szrj extern DWtype __subvDI3 (DWtype, DWtype);
422*38fd1498Szrj extern DWtype __mulvDI3 (DWtype, DWtype);
423*38fd1498Szrj extern DWtype __negvDI2 (DWtype);
424*38fd1498Szrj 
425*38fd1498Szrj #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
426*38fd1498Szrj #define __absvsi2	__N(absvsi2)
427*38fd1498Szrj #define __negvsi2	__N(negvsi2)
428*38fd1498Szrj #define __addvsi3	__N(addvsi3)
429*38fd1498Szrj #define __subvsi3	__N(subvsi3)
430*38fd1498Szrj #define __mulvsi3	__N(mulvsi3)
431*38fd1498Szrj 
432*38fd1498Szrj extern SItype __absvsi2 (SItype);
433*38fd1498Szrj extern SItype __addvsi3 (SItype, SItype);
434*38fd1498Szrj extern SItype __subvsi3 (SItype, SItype);
435*38fd1498Szrj extern SItype __mulvsi3 (SItype, SItype);
436*38fd1498Szrj extern SItype __negvsi2 (SItype);
437*38fd1498Szrj #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
438*38fd1498Szrj 
439*38fd1498Szrj #undef int
440*38fd1498Szrj #if LIBGCC2_HAS_HF_MODE
441*38fd1498Szrj extern HCtype __divhc3 (HFtype, HFtype, HFtype, HFtype);
442*38fd1498Szrj extern HCtype __mulhc3 (HFtype, HFtype, HFtype, HFtype);
443*38fd1498Szrj #endif
444*38fd1498Szrj #if LIBGCC2_HAS_SF_MODE
445*38fd1498Szrj extern DWtype __fixsfdi (SFtype);
446*38fd1498Szrj extern SFtype __floatdisf (DWtype);
447*38fd1498Szrj extern SFtype __floatundisf (UDWtype);
448*38fd1498Szrj extern UWtype __fixunssfSI (SFtype);
449*38fd1498Szrj extern UDWtype __fixunssfDI (SFtype);
450*38fd1498Szrj extern SFtype __powisf2 (SFtype, int);
451*38fd1498Szrj extern SCtype __divsc3 (SFtype, SFtype, SFtype, SFtype);
452*38fd1498Szrj extern SCtype __mulsc3 (SFtype, SFtype, SFtype, SFtype);
453*38fd1498Szrj #endif
454*38fd1498Szrj #if LIBGCC2_HAS_DF_MODE
455*38fd1498Szrj extern DWtype __fixdfdi (DFtype);
456*38fd1498Szrj extern DFtype __floatdidf (DWtype);
457*38fd1498Szrj extern DFtype __floatundidf (UDWtype);
458*38fd1498Szrj extern UWtype __fixunsdfSI (DFtype);
459*38fd1498Szrj extern UDWtype __fixunsdfDI (DFtype);
460*38fd1498Szrj extern DFtype __powidf2 (DFtype, int);
461*38fd1498Szrj extern DCtype __divdc3 (DFtype, DFtype, DFtype, DFtype);
462*38fd1498Szrj extern DCtype __muldc3 (DFtype, DFtype, DFtype, DFtype);
463*38fd1498Szrj #endif
464*38fd1498Szrj 
465*38fd1498Szrj #if LIBGCC2_HAS_XF_MODE
466*38fd1498Szrj extern DWtype __fixxfdi (XFtype);
467*38fd1498Szrj extern UDWtype __fixunsxfDI (XFtype);
468*38fd1498Szrj extern XFtype __floatdixf (DWtype);
469*38fd1498Szrj extern XFtype __floatundixf (UDWtype);
470*38fd1498Szrj extern UWtype __fixunsxfSI (XFtype);
471*38fd1498Szrj extern XFtype __powixf2 (XFtype, int);
472*38fd1498Szrj extern XCtype __divxc3 (XFtype, XFtype, XFtype, XFtype);
473*38fd1498Szrj extern XCtype __mulxc3 (XFtype, XFtype, XFtype, XFtype);
474*38fd1498Szrj #endif
475*38fd1498Szrj 
476*38fd1498Szrj #if LIBGCC2_HAS_TF_MODE
477*38fd1498Szrj extern UDWtype __fixunstfDI (TFtype);
478*38fd1498Szrj extern DWtype __fixtfdi (TFtype);
479*38fd1498Szrj extern TFtype __floatditf (DWtype);
480*38fd1498Szrj extern TFtype __floatunditf (UDWtype);
481*38fd1498Szrj extern TFtype __powitf2 (TFtype, int);
482*38fd1498Szrj extern TCtype __divtc3 (TFtype, TFtype, TFtype, TFtype);
483*38fd1498Szrj extern TCtype __multc3 (TFtype, TFtype, TFtype, TFtype);
484*38fd1498Szrj #endif
485*38fd1498Szrj #define int bogus_type
486*38fd1498Szrj 
487*38fd1498Szrj /* DWstructs are pairs of Wtype values in the order determined by
488*38fd1498Szrj    __BYTE_ORDER__.  */
489*38fd1498Szrj 
490*38fd1498Szrj #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
491*38fd1498Szrj   struct DWstruct {Wtype high, low;};
492*38fd1498Szrj #else
493*38fd1498Szrj   struct DWstruct {Wtype low, high;};
494*38fd1498Szrj #endif
495*38fd1498Szrj 
496*38fd1498Szrj /* We need this union to unpack/pack DImode values, since we don't have
497*38fd1498Szrj    any arithmetic yet.  Incoming DImode parameters are stored into the
498*38fd1498Szrj    `ll' field, and the unpacked result is read from the struct `s'.  */
499*38fd1498Szrj 
500*38fd1498Szrj typedef union
501*38fd1498Szrj {
502*38fd1498Szrj   struct DWstruct s;
503*38fd1498Szrj   DWtype ll;
504*38fd1498Szrj } DWunion;
505*38fd1498Szrj 
506*38fd1498Szrj /* Defined for L_popcount_tab.  Exported here because some targets may
507*38fd1498Szrj    want to use it for their own versions of the __popcount builtins.  */
508*38fd1498Szrj extern const UQItype __popcount_tab[256];
509*38fd1498Szrj 
510*38fd1498Szrj /* Defined for L_clz.  Exported here because some targets may want to use
511*38fd1498Szrj    it for their own versions of the __clz builtins.  It contains the bit
512*38fd1498Szrj    position of the first set bit for the numbers 0 - 255.  This avoids the
513*38fd1498Szrj    need for a separate table for the __ctz builtins.  */
514*38fd1498Szrj extern const UQItype __clz_tab[256];
515*38fd1498Szrj 
516*38fd1498Szrj #include "longlong.h"
517*38fd1498Szrj 
518*38fd1498Szrj #undef int
519*38fd1498Szrj extern int __clzDI2 (UDWtype);
520*38fd1498Szrj extern int __clzSI2 (UWtype);
521*38fd1498Szrj extern int __ctzSI2 (UWtype);
522*38fd1498Szrj extern int __ctzDI2 (UDWtype);
523*38fd1498Szrj extern int __clrsbSI2 (Wtype);
524*38fd1498Szrj extern int __clrsbDI2 (DWtype);
525*38fd1498Szrj extern int __ffsSI2 (UWtype);
526*38fd1498Szrj extern int __ffsDI2 (DWtype);
527*38fd1498Szrj extern int __popcountSI2 (UWtype);
528*38fd1498Szrj extern int __popcountDI2 (UDWtype);
529*38fd1498Szrj extern int __paritySI2 (UWtype);
530*38fd1498Szrj extern int __parityDI2 (UDWtype);
531*38fd1498Szrj #define int bogus_type
532*38fd1498Szrj 
533*38fd1498Szrj extern void __enable_execute_stack (void *);
534*38fd1498Szrj 
535*38fd1498Szrj #ifndef HIDE_EXPORTS
536*38fd1498Szrj #pragma GCC visibility pop
537*38fd1498Szrj #endif
538*38fd1498Szrj 
539*38fd1498Szrj #endif /* ! GCC_LIBGCC2_H */
540