123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523 |
- /* Header file for libgcc2.c. */
- /* Copyright (C) 2000-2015 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 GCC_LIBGCC2_H
- #define GCC_LIBGCC2_H
- #ifndef HIDE_EXPORTS
- #pragma GCC visibility push(default)
- #endif
- extern int __gcc_bcmp (const unsigned char *, const unsigned char *, size_t);
- extern void __clear_cache (char *, char *);
- extern void __eprintf (const char *, const char *, unsigned int, const char *)
- __attribute__ ((__noreturn__));
- #ifdef __LIBGCC_HAS_SF_MODE__
- #define LIBGCC2_HAS_SF_MODE 1
- #else
- #define LIBGCC2_HAS_SF_MODE 0
- #endif
- #ifdef __LIBGCC_HAS_DF_MODE__
- #define LIBGCC2_HAS_DF_MODE 1
- #else
- #define LIBGCC2_HAS_DF_MODE 0
- #endif
- #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 __LIBGCC_SF_MANT_DIG__
- #if LIBGCC2_HAS_SF_MODE
- #error __LIBGCC_SF_MANT_DIG__ not defined
- #else
- #define __LIBGCC_SF_MANT_DIG__ 0
- #endif
- #endif
- #ifndef __LIBGCC_DF_MANT_DIG__
- #if LIBGCC2_HAS_DF_MODE
- #error __LIBGCC_DF_MANT_DIG__ not defined
- #else
- #define __LIBGCC_DF_MANT_DIG__ 0
- #endif
- #endif
- #ifndef __LIBGCC_XF_MANT_DIG__
- #if LIBGCC2_HAS_XF_MODE
- #error __LIBGCC_XF_MANT_DIG__ not defined
- #else
- #define __LIBGCC_XF_MANT_DIG__ 0
- #endif
- #endif
- #ifndef __LIBGCC_TF_MANT_DIG__
- #if LIBGCC2_HAS_TF_MODE
- #error __LIBGCC_TF_MANT_DIG__ not defined
- #else
- #define __LIBGCC_TF_MANT_DIG__ 0
- #endif
- #endif
- /* FIXME: This #ifdef probably should be removed, ie. enable the test
- for mips too. */
- /* Don't use IBM Extended Double TFmode for TI->SF calculations.
- The conversion from long double to float suffers from double
- rounding, because we convert via double. In other cases, going
- through the software fp routines is much slower than the fallback. */
- #ifdef __powerpc__
- #define AVOID_FP_TYPE_CONVERSION(SIZE) (SIZE == 106)
- #elif defined(WIDEST_HARDWARE_FP_SIZE)
- #define AVOID_FP_TYPE_CONVERSION(SIZE) (SIZE > WIDEST_HARDWARE_FP_SIZE)
- #else
- #define AVOID_FP_TYPE_CONVERSION(SIZE) 0
- #endif
- /* In the first part of this file, we are interfacing to calls generated
- by the compiler itself. These calls pass values into these routines
- which have very specific modes (rather than very specific types), and
- these compiler-generated calls also expect any return values to have
- very specific modes (rather than very specific types). Thus, we need
- to avoid using regular C language type names in this part of the file
- because the sizes for those types can be configured to be anything.
- Instead we use the following special type names. */
- typedef int QItype __attribute__ ((mode (QI)));
- typedef unsigned int UQItype __attribute__ ((mode (QI)));
- typedef int HItype __attribute__ ((mode (HI)));
- typedef unsigned int UHItype __attribute__ ((mode (HI)));
- #if MIN_UNITS_PER_WORD > 1
- /* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1. */
- typedef int SItype __attribute__ ((mode (SI)));
- typedef unsigned int USItype __attribute__ ((mode (SI)));
- #if __SIZEOF_LONG_LONG__ > 4
- /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2. */
- typedef int DItype __attribute__ ((mode (DI)));
- typedef unsigned int UDItype __attribute__ ((mode (DI)));
- #if MIN_UNITS_PER_WORD > 4
- /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 4. */
- typedef int TItype __attribute__ ((mode (TI)));
- typedef unsigned int UTItype __attribute__ ((mode (TI)));
- #endif
- #endif
- #endif
- #if LIBGCC2_HAS_SF_MODE
- typedef float SFtype __attribute__ ((mode (SF)));
- typedef _Complex float SCtype __attribute__ ((mode (SC)));
- #endif
- #if LIBGCC2_HAS_DF_MODE
- typedef float DFtype __attribute__ ((mode (DF)));
- typedef _Complex float DCtype __attribute__ ((mode (DC)));
- #endif
- #if LIBGCC2_HAS_XF_MODE
- typedef float XFtype __attribute__ ((mode (XF)));
- typedef _Complex float XCtype __attribute__ ((mode (XC)));
- #endif
- #if LIBGCC2_HAS_TF_MODE
- typedef float TFtype __attribute__ ((mode (TF)));
- typedef _Complex float TCtype __attribute__ ((mode (TC)));
- #endif
- typedef int cmp_return_type __attribute__((mode (__libgcc_cmp_return__)));
- typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__)));
- /* Make sure that we don't accidentally use any normal C language built-in
- type names in the first part of this file. Instead we want to use *only*
- the type names defined above. The following macro definitions insure
- that if we *do* accidentally use some normal C language built-in type name,
- we will get a syntax error. */
- #define char bogus_type
- #define short bogus_type
- #define int bogus_type
- #define long bogus_type
- #define unsigned bogus_type
- #define float bogus_type
- #define double bogus_type
- /* Versions prior to 3.4.4 were not taking into account the word size for
- the 5 trapping arithmetic functions absv, addv, subv, mulv and negv. As
- a consequence, the si and di variants were always and the only ones emitted.
- To maintain backward compatibility, COMPAT_SIMODE_TRAPPING_ARITHMETIC is
- defined on platforms where it makes sense to still have the si variants
- emitted. As a bonus, their implementation is now correct. Note that the
- same mechanism should have been implemented for the di variants, but it
- turns out that no platform would define COMPAT_DIMODE_TRAPPING_ARITHMETIC
- if it existed. */
- #if LIBGCC2_UNITS_PER_WORD == 8
- #define W_TYPE_SIZE (8 * BITS_PER_UNIT)
- #define Wtype DItype
- #define UWtype UDItype
- #define HWtype DItype
- #define UHWtype UDItype
- #define DWtype TItype
- #define UDWtype UTItype
- #ifdef LIBGCC2_GNU_PREFIX
- #define __NW(a,b) __gnu_ ## a ## di ## b
- #define __NDW(a,b) __gnu_ ## a ## ti ## b
- #else
- #define __NW(a,b) __ ## a ## di ## b
- #define __NDW(a,b) __ ## a ## ti ## b
- #endif
- #define COMPAT_SIMODE_TRAPPING_ARITHMETIC
- #elif LIBGCC2_UNITS_PER_WORD == 4
- #define W_TYPE_SIZE (4 * BITS_PER_UNIT)
- #define Wtype SItype
- #define UWtype USItype
- #define HWtype SItype
- #define UHWtype USItype
- #define DWtype DItype
- #define UDWtype UDItype
- #ifdef LIBGCC2_GNU_PREFIX
- #define __NW(a,b) __gnu_ ## a ## si ## b
- #define __NDW(a,b) __gnu_ ## a ## di ## b
- #else
- #define __NW(a,b) __ ## a ## si ## b
- #define __NDW(a,b) __ ## a ## di ## b
- #endif
- #elif LIBGCC2_UNITS_PER_WORD == 2
- #define W_TYPE_SIZE (2 * BITS_PER_UNIT)
- #define Wtype HItype
- #define UWtype UHItype
- #define HWtype HItype
- #define UHWtype UHItype
- #define DWtype SItype
- #define UDWtype USItype
- #ifdef LIBGCC2_GNU_PREFIX
- #define __NW(a,b) __gnu_ ## a ## hi ## b
- #define __NDW(a,b) __gnu_ ## a ## si ## b
- #else
- #define __NW(a,b) __ ## a ## hi ## b
- #define __NDW(a,b) __ ## a ## si ## b
- #endif
- #else
- #define W_TYPE_SIZE BITS_PER_UNIT
- #define Wtype QItype
- #define UWtype UQItype
- #define HWtype QItype
- #define UHWtype UQItype
- #define DWtype HItype
- #define UDWtype UHItype
- #ifdef LIBGCC2_GNU_PREFIX
- #define __NW(a,b) __gnu_ ## a ## qi ## b
- #define __NDW(a,b) __gnu_ ## a ## hi ## b
- #else
- #define __NW(a,b) __ ## a ## qi ## b
- #define __NDW(a,b) __ ## a ## hi ## b
- #endif
- #endif
- #ifdef LIBGCC2_GNU_PREFIX
- #define __N(a) __gnu_ ## a
- #else
- #define __N(a) __ ## a
- #endif
- #define Wtype_MAX ((Wtype)(((UWtype)1 << (W_TYPE_SIZE - 1)) - 1))
- #define Wtype_MIN (- Wtype_MAX - 1)
- #if W_TYPE_SIZE == 8
- # define Wtype_MAXp1_F 0x1p8f
- #elif W_TYPE_SIZE == 16
- # define Wtype_MAXp1_F 0x1p16f
- #elif W_TYPE_SIZE == 32
- # define Wtype_MAXp1_F 0x1p32f
- #elif W_TYPE_SIZE == 64
- # define Wtype_MAXp1_F 0x1p64f
- #else
- # error "expand the table"
- #endif
- #define __muldi3 __NDW(mul,3)
- #define __divdi3 __NDW(div,3)
- #define __udivdi3 __NDW(udiv,3)
- #define __moddi3 __NDW(mod,3)
- #define __umoddi3 __NDW(umod,3)
- #define __negdi2 __NDW(neg,2)
- #define __lshrdi3 __NDW(lshr,3)
- #define __ashldi3 __NDW(ashl,3)
- #define __ashrdi3 __NDW(ashr,3)
- #define __cmpdi2 __NDW(cmp,2)
- #define __ucmpdi2 __NDW(ucmp,2)
- #define __udivmoddi4 __NDW(udivmod,4)
- #define __fixunstfDI __NDW(fixunstf,)
- #define __fixtfdi __NDW(fixtf,)
- #define __fixunsxfDI __NDW(fixunsxf,)
- #define __fixxfdi __NDW(fixxf,)
- #define __fixunsdfDI __NDW(fixunsdf,)
- #define __fixdfdi __NDW(fixdf,)
- #define __fixunssfDI __NDW(fixunssf,)
- #define __fixsfdi __NDW(fixsf,)
- #define __floatdixf __NDW(float,xf)
- #define __floatditf __NDW(float,tf)
- #define __floatdidf __NDW(float,df)
- #define __floatdisf __NDW(float,sf)
- #define __floatundixf __NDW(floatun,xf)
- #define __floatunditf __NDW(floatun,tf)
- #define __floatundidf __NDW(floatun,df)
- #define __floatundisf __NDW(floatun,sf)
- #define __fixunsxfSI __NW(fixunsxf,)
- #define __fixunstfSI __NW(fixunstf,)
- #define __fixunsdfSI __NW(fixunsdf,)
- #define __fixunssfSI __NW(fixunssf,)
- #define __absvSI2 __NW(absv,2)
- #define __addvSI3 __NW(addv,3)
- #define __subvSI3 __NW(subv,3)
- #define __mulvSI3 __NW(mulv,3)
- #define __negvSI2 __NW(negv,2)
- #define __absvDI2 __NDW(absv,2)
- #define __addvDI3 __NDW(addv,3)
- #define __subvDI3 __NDW(subv,3)
- #define __mulvDI3 __NDW(mulv,3)
- #define __negvDI2 __NDW(negv,2)
- #define __ffsSI2 __NW(ffs,2)
- #define __clzSI2 __NW(clz,2)
- #define __ctzSI2 __NW(ctz,2)
- #define __clrsbSI2 __NW(clrsb,2)
- #define __popcountSI2 __NW(popcount,2)
- #define __paritySI2 __NW(parity,2)
- #define __ffsDI2 __NDW(ffs,2)
- #define __clzDI2 __NDW(clz,2)
- #define __ctzDI2 __NDW(ctz,2)
- #define __clrsbDI2 __NDW(clrsb,2)
- #define __popcountDI2 __NDW(popcount,2)
- #define __parityDI2 __NDW(parity,2)
- #define __clz_tab __N(clz_tab)
- #define __bswapsi2 __N(bswapsi2)
- #define __bswapdi2 __N(bswapdi2)
- #define __udiv_w_sdiv __N(udiv_w_sdiv)
- #define __clear_cache __N(clear_cache)
- #define __enable_execute_stack __N(enable_execute_stack)
- #ifndef __powisf2
- #define __powisf2 __N(powisf2)
- #endif
- #ifndef __powidf2
- #define __powidf2 __N(powidf2)
- #endif
- #ifndef __powitf2
- #define __powitf2 __N(powitf2)
- #endif
- #ifndef __powixf2
- #define __powixf2 __N(powixf2)
- #endif
- #ifndef __mulsc3
- #define __mulsc3 __N(mulsc3)
- #endif
- #ifndef __muldc3
- #define __muldc3 __N(muldc3)
- #endif
- #ifndef __mulxc3
- #define __mulxc3 __N(mulxc3)
- #endif
- #ifndef __multc3
- #define __multc3 __N(multc3)
- #endif
- #ifndef __divsc3
- #define __divsc3 __N(divsc3)
- #endif
- #ifndef __divdc3
- #define __divdc3 __N(divdc3)
- #endif
- #ifndef __divxc3
- #define __divxc3 __N(divxc3)
- #endif
- #ifndef __divtc3
- #define __divtc3 __N(divtc3)
- #endif
- extern DWtype __muldi3 (DWtype, DWtype);
- extern DWtype __divdi3 (DWtype, DWtype);
- extern UDWtype __udivdi3 (UDWtype, UDWtype);
- extern UDWtype __umoddi3 (UDWtype, UDWtype);
- extern DWtype __moddi3 (DWtype, DWtype);
- /* __udivmoddi4 is static inline when building other libgcc2 portions. */
- #if (!defined (L_udivdi3) && !defined (L_divdi3) && \
- !defined (L_umoddi3) && !defined (L_moddi3))
- extern UDWtype __udivmoddi4 (UDWtype, UDWtype, UDWtype *);
- #endif
- /* __negdi2 is static inline when building other libgcc2 portions. */
- #if !defined(L_divdi3) && !defined(L_moddi3)
- extern DWtype __negdi2 (DWtype);
- #endif
- extern DWtype __lshrdi3 (DWtype, shift_count_type);
- extern DWtype __ashldi3 (DWtype, shift_count_type);
- extern DWtype __ashrdi3 (DWtype, shift_count_type);
- /* __udiv_w_sdiv is static inline when building other libgcc2 portions. */
- #if (!defined(L_udivdi3) && !defined(L_divdi3) && \
- !defined(L_umoddi3) && !defined(L_moddi3))
- extern UWtype __udiv_w_sdiv (UWtype *, UWtype, UWtype, UWtype);
- #endif
- extern cmp_return_type __cmpdi2 (DWtype, DWtype);
- extern cmp_return_type __ucmpdi2 (DWtype, DWtype);
- #if MIN_UNITS_PER_WORD > 1
- extern SItype __bswapsi2 (SItype);
- #endif
- #if __SIZEOF_LONG_LONG__ > 4
- extern DItype __bswapdi2 (DItype);
- #endif
- extern Wtype __absvSI2 (Wtype);
- extern Wtype __addvSI3 (Wtype, Wtype);
- extern Wtype __subvSI3 (Wtype, Wtype);
- extern Wtype __mulvSI3 (Wtype, Wtype);
- extern Wtype __negvSI2 (Wtype);
- extern DWtype __absvDI2 (DWtype);
- extern DWtype __addvDI3 (DWtype, DWtype);
- extern DWtype __subvDI3 (DWtype, DWtype);
- extern DWtype __mulvDI3 (DWtype, DWtype);
- extern DWtype __negvDI2 (DWtype);
- #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
- #define __absvsi2 __N(absvsi2)
- #define __negvsi2 __N(negvsi2)
- #define __addvsi3 __N(addvsi3)
- #define __subvsi3 __N(subvsi3)
- #define __mulvsi3 __N(mulvsi3)
- extern SItype __absvsi2 (SItype);
- extern SItype __addvsi3 (SItype, SItype);
- extern SItype __subvsi3 (SItype, SItype);
- extern SItype __mulvsi3 (SItype, SItype);
- extern SItype __negvsi2 (SItype);
- #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
- #undef int
- #if LIBGCC2_HAS_SF_MODE
- extern DWtype __fixsfdi (SFtype);
- extern SFtype __floatdisf (DWtype);
- extern SFtype __floatundisf (UDWtype);
- extern UWtype __fixunssfSI (SFtype);
- extern UDWtype __fixunssfDI (SFtype);
- extern SFtype __powisf2 (SFtype, int);
- extern SCtype __divsc3 (SFtype, SFtype, SFtype, SFtype);
- extern SCtype __mulsc3 (SFtype, SFtype, SFtype, SFtype);
- #endif
- #if LIBGCC2_HAS_DF_MODE
- extern DWtype __fixdfdi (DFtype);
- extern DFtype __floatdidf (DWtype);
- extern DFtype __floatundidf (UDWtype);
- extern UWtype __fixunsdfSI (DFtype);
- extern UDWtype __fixunsdfDI (DFtype);
- extern DFtype __powidf2 (DFtype, int);
- extern DCtype __divdc3 (DFtype, DFtype, DFtype, DFtype);
- extern DCtype __muldc3 (DFtype, DFtype, DFtype, DFtype);
- #endif
- #if LIBGCC2_HAS_XF_MODE
- extern DWtype __fixxfdi (XFtype);
- extern UDWtype __fixunsxfDI (XFtype);
- extern XFtype __floatdixf (DWtype);
- extern XFtype __floatundixf (UDWtype);
- extern UWtype __fixunsxfSI (XFtype);
- extern XFtype __powixf2 (XFtype, int);
- extern XCtype __divxc3 (XFtype, XFtype, XFtype, XFtype);
- extern XCtype __mulxc3 (XFtype, XFtype, XFtype, XFtype);
- #endif
- #if LIBGCC2_HAS_TF_MODE
- extern UDWtype __fixunstfDI (TFtype);
- extern DWtype __fixtfdi (TFtype);
- extern TFtype __floatditf (DWtype);
- extern TFtype __floatunditf (UDWtype);
- extern TFtype __powitf2 (TFtype, int);
- extern TCtype __divtc3 (TFtype, TFtype, TFtype, TFtype);
- extern TCtype __multc3 (TFtype, TFtype, TFtype, TFtype);
- #endif
- #define int bogus_type
- /* DWstructs are pairs of Wtype values in the order determined by
- __BYTE_ORDER__. */
- #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
- struct DWstruct {Wtype high, low;};
- #else
- struct DWstruct {Wtype low, high;};
- #endif
- /* We need this union to unpack/pack DImode values, since we don't have
- any arithmetic yet. Incoming DImode parameters are stored into the
- `ll' field, and the unpacked result is read from the struct `s'. */
- typedef union
- {
- struct DWstruct s;
- DWtype ll;
- } DWunion;
- /* Defined for L_popcount_tab. Exported here because some targets may
- want to use it for their own versions of the __popcount builtins. */
- extern const UQItype __popcount_tab[256];
- /* Defined for L_clz. Exported here because some targets may want to use
- it for their own versions of the __clz builtins. It contains the bit
- position of the first set bit for the numbers 0 - 255. This avoids the
- need for a separate table for the __ctz builtins. */
- extern const UQItype __clz_tab[256];
- #include "longlong.h"
- #undef int
- extern int __clzDI2 (UDWtype);
- extern int __clzSI2 (UWtype);
- extern int __ctzSI2 (UWtype);
- extern int __ctzDI2 (UDWtype);
- extern int __clrsbSI2 (Wtype);
- extern int __clrsbDI2 (DWtype);
- extern int __ffsSI2 (UWtype);
- extern int __ffsDI2 (DWtype);
- extern int __popcountSI2 (UWtype);
- extern int __popcountDI2 (UDWtype);
- extern int __paritySI2 (UWtype);
- extern int __parityDI2 (UDWtype);
- #define int bogus_type
- extern void __enable_execute_stack (void *);
- #ifndef HIDE_EXPORTS
- #pragma GCC visibility pop
- #endif
- #endif /* ! GCC_LIBGCC2_H */
|