190075Sobrien/* Header file for libgcc2.c. */ 2169689Skan/* Copyright (C) 2000, 2001, 2004, 2005 390075Sobrien Free Software Foundation, Inc. 490075Sobrien 590075SobrienThis file is part of GCC. 690075Sobrien 790075SobrienGCC is free software; you can redistribute it and/or modify it under 890075Sobrienthe terms of the GNU General Public License as published by the Free 990075SobrienSoftware Foundation; either version 2, or (at your option) any later 1090075Sobrienversion. 1190075Sobrien 1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or 1490075SobrienFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1590075Sobrienfor more details. 1690075Sobrien 1790075SobrienYou should have received a copy of the GNU General Public License 1890075Sobrienalong with GCC; see the file COPYING. If not, write to the Free 19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 20169689Skan02110-1301, USA. */ 2190075Sobrien 22117395Skan/* As a special exception, if you link this library with other files, 23117395Skan some of which are compiled with GCC, to produce an executable, 24117395Skan this library does not by itself cause the resulting executable 25117395Skan to be covered by the GNU General Public License. 26117395Skan This exception does not however invalidate any other reasons why 27117395Skan the executable file might be covered by the GNU General Public License. */ 28117395Skan 29117395Skan 3090075Sobrien#ifndef GCC_LIBGCC2_H 3190075Sobrien#define GCC_LIBGCC2_H 3290075Sobrien 33169689Skan#ifndef HIDE_EXPORTS 34169689Skan#pragma GCC visibility push(default) 35169689Skan#endif 36169689Skan 3790075Sobrienextern int __gcc_bcmp (const unsigned char *, const unsigned char *, size_t); 38263508Sdimextern void __clear_cache (void *, void *); 3990075Sobrienextern void __eprintf (const char *, const char *, unsigned int, const char *) 4090075Sobrien __attribute__ ((__noreturn__)); 4190075Sobrien 4290075Sobrienstruct exception_descriptor; 4390075Sobrienextern short int __get_eh_table_language (struct exception_descriptor *); 4490075Sobrienextern short int __get_eh_table_version (struct exception_descriptor *); 4590075Sobrien 4690075Sobrien/* Permit the tm.h file to select the endianness to use just for this 4790075Sobrien file. This is used when the endianness is determined when the 4890075Sobrien compiler is run. */ 4990075Sobrien 5090075Sobrien#ifndef LIBGCC2_WORDS_BIG_ENDIAN 5190075Sobrien#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN 5290075Sobrien#endif 5390075Sobrien 54169689Skan#ifndef LIBGCC2_DOUBLE_TYPE_SIZE 55169689Skan#define LIBGCC2_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE 56169689Skan#endif 5790075Sobrien#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE 5890075Sobrien#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE 5990075Sobrien#endif 6090075Sobrien 61169689Skan#ifndef LIBGCC2_HAS_SF_MODE 62169689Skan#define LIBGCC2_HAS_SF_MODE (BITS_PER_UNIT == 8) 6390075Sobrien#endif 6490075Sobrien 65169689Skan#ifndef LIBGCC2_HAS_DF_MODE 66169689Skan#define LIBGCC2_HAS_DF_MODE \ 67169689Skan (BITS_PER_UNIT == 8 \ 68169689Skan && (LIBGCC2_DOUBLE_TYPE_SIZE == 64 \ 69169689Skan || LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64)) 70169689Skan#endif 71169689Skan 72169689Skan#ifndef LIBGCC2_HAS_XF_MODE 73169689Skan#define LIBGCC2_HAS_XF_MODE \ 74169689Skan (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80) 75169689Skan#endif 76169689Skan 77169689Skan#ifndef LIBGCC2_HAS_TF_MODE 78169689Skan#define LIBGCC2_HAS_TF_MODE \ 79169689Skan (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128) 80169689Skan#endif 81169689Skan 82169689Skan#ifndef SF_SIZE 83169689Skan#if LIBGCC2_HAS_SF_MODE 84169689Skan#define SF_SIZE FLT_MANT_DIG 85169689Skan#else 86169689Skan#define SF_SIZE 0 87169689Skan#endif 88169689Skan#endif 89169689Skan 90169689Skan#ifndef DF_SIZE 91169689Skan#if LIBGCC2_HAS_DF_MODE 92169689Skan#if LIBGCC2_DOUBLE_TYPE_SIZE == 64 93169689Skan#define DF_SIZE DBL_MANT_DIG 94169689Skan#elif LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64 95169689Skan#define DF_SIZE LDBL_MANT_DIG 96169689Skan#else 97169689Skan#define DF_SIZE 0 98169689Skan#endif 99169689Skan#else 100169689Skan#define DF_SIZE 0 101169689Skan#endif 102169689Skan#endif 103169689Skan 104169689Skan#ifndef XF_SIZE 105169689Skan#if LIBGCC2_HAS_XF_MODE 106169689Skan#define XF_SIZE LDBL_MANT_DIG 107169689Skan#else 108169689Skan#define XF_SIZE 0 109169689Skan#endif 110169689Skan#endif 111169689Skan 112169689Skan#ifndef TF_SIZE 113169689Skan#if LIBGCC2_HAS_TF_MODE 114169689Skan#define TF_SIZE LDBL_MANT_DIG 115169689Skan#else 116169689Skan#define TF_SIZE 0 117169689Skan#endif 118169689Skan#endif 119169689Skan 120169689Skan/* FIXME: This #ifdef probably should be removed, ie. enable the test 121169689Skan for mips too. */ 122169689Skan#ifdef __powerpc__ 123169689Skan#define IS_IBM_EXTENDED(SIZE) (SIZE == 106) 124169689Skan#else 125169689Skan#define IS_IBM_EXTENDED(SIZE) 0 126169689Skan#endif 127169689Skan 12890075Sobrien/* In the first part of this file, we are interfacing to calls generated 12990075Sobrien by the compiler itself. These calls pass values into these routines 13090075Sobrien which have very specific modes (rather than very specific types), and 13190075Sobrien these compiler-generated calls also expect any return values to have 13290075Sobrien very specific modes (rather than very specific types). Thus, we need 13390075Sobrien to avoid using regular C language type names in this part of the file 13490075Sobrien because the sizes for those types can be configured to be anything. 13590075Sobrien Instead we use the following special type names. */ 13690075Sobrien 13790075Sobrientypedef int QItype __attribute__ ((mode (QI))); 13890075Sobrientypedef unsigned int UQItype __attribute__ ((mode (QI))); 13990075Sobrientypedef int HItype __attribute__ ((mode (HI))); 14090075Sobrientypedef unsigned int UHItype __attribute__ ((mode (HI))); 14190075Sobrien#if MIN_UNITS_PER_WORD > 1 142132718Skan/* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1. */ 14390075Sobrientypedef int SItype __attribute__ ((mode (SI))); 14490075Sobrientypedef unsigned int USItype __attribute__ ((mode (SI))); 14590075Sobrien#if LONG_LONG_TYPE_SIZE > 32 146132718Skan/* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2. */ 14790075Sobrientypedef int DItype __attribute__ ((mode (DI))); 14890075Sobrientypedef unsigned int UDItype __attribute__ ((mode (DI))); 14990075Sobrien#if MIN_UNITS_PER_WORD > 4 150132718Skan/* These typedefs are usually forbidden on archs with UNITS_PER_WORD 4. */ 15190075Sobrientypedef int TItype __attribute__ ((mode (TI))); 15290075Sobrientypedef unsigned int UTItype __attribute__ ((mode (TI))); 15390075Sobrien#endif 15490075Sobrien#endif 15590075Sobrien#endif 15690075Sobrien 157169689Skan#if LIBGCC2_HAS_SF_MODE 15890075Sobrientypedef float SFtype __attribute__ ((mode (SF))); 159169689Skantypedef _Complex float SCtype __attribute__ ((mode (SC))); 160169689Skan#endif 161169689Skan#if LIBGCC2_HAS_DF_MODE 16290075Sobrientypedef float DFtype __attribute__ ((mode (DF))); 163169689Skantypedef _Complex float DCtype __attribute__ ((mode (DC))); 164169689Skan#endif 165169689Skan#if LIBGCC2_HAS_XF_MODE 16690075Sobrientypedef float XFtype __attribute__ ((mode (XF))); 167169689Skantypedef _Complex float XCtype __attribute__ ((mode (XC))); 16890075Sobrien#endif 169169689Skan#if LIBGCC2_HAS_TF_MODE 17090075Sobrientypedef float TFtype __attribute__ ((mode (TF))); 171169689Skantypedef _Complex float TCtype __attribute__ ((mode (TC))); 17290075Sobrien#endif 17390075Sobrien 17490075Sobrientypedef int word_type __attribute__ ((mode (__word__))); 17590075Sobrien 17690075Sobrien/* Make sure that we don't accidentally use any normal C language built-in 17790075Sobrien type names in the first part of this file. Instead we want to use *only* 17890075Sobrien the type names defined above. The following macro definitions insure 17990075Sobrien that if we *do* accidentally use some normal C language built-in type name, 18090075Sobrien we will get a syntax error. */ 18190075Sobrien 18290075Sobrien#define char bogus_type 18390075Sobrien#define short bogus_type 18490075Sobrien#define int bogus_type 18590075Sobrien#define long bogus_type 18690075Sobrien#define unsigned bogus_type 18790075Sobrien#define float bogus_type 18890075Sobrien#define double bogus_type 18990075Sobrien 190146895Skan/* Versions prior to 3.4.4 were not taking into account the word size for 191146895Skan the 5 trapping arithmetic functions absv, addv, subv, mulv and negv. As 192146895Skan a consequence, the si and di variants were always and the only ones emitted. 193146895Skan To maintain backward compatibility, COMPAT_SIMODE_TRAPPING_ARITHMETIC is 194146895Skan defined on platforms where it makes sense to still have the si variants 195146895Skan emitted. As a bonus, their implementation is now correct. Note that the 196146895Skan same mechanism should have been implemented for the di variants, but it 197146895Skan turns out that no platform would define COMPAT_DIMODE_TRAPPING_ARITHMETIC 198146895Skan if it existed. */ 199146895Skan 200169689Skan#if LIBGCC2_UNITS_PER_WORD == 8 20190075Sobrien#define W_TYPE_SIZE (8 * BITS_PER_UNIT) 20290075Sobrien#define Wtype DItype 20390075Sobrien#define UWtype UDItype 20490075Sobrien#define HWtype DItype 20590075Sobrien#define UHWtype UDItype 20690075Sobrien#define DWtype TItype 20790075Sobrien#define UDWtype UTItype 20890075Sobrien#define __NW(a,b) __ ## a ## di ## b 20990075Sobrien#define __NDW(a,b) __ ## a ## ti ## b 210146895Skan#define COMPAT_SIMODE_TRAPPING_ARITHMETIC 211169689Skan#elif LIBGCC2_UNITS_PER_WORD == 4 21290075Sobrien#define W_TYPE_SIZE (4 * BITS_PER_UNIT) 21390075Sobrien#define Wtype SItype 21490075Sobrien#define UWtype USItype 21590075Sobrien#define HWtype SItype 21690075Sobrien#define UHWtype USItype 21790075Sobrien#define DWtype DItype 21890075Sobrien#define UDWtype UDItype 21990075Sobrien#define __NW(a,b) __ ## a ## si ## b 22090075Sobrien#define __NDW(a,b) __ ## a ## di ## b 221169689Skan#elif LIBGCC2_UNITS_PER_WORD == 2 22290075Sobrien#define W_TYPE_SIZE (2 * BITS_PER_UNIT) 22390075Sobrien#define Wtype HItype 22490075Sobrien#define UWtype UHItype 22590075Sobrien#define HWtype HItype 22690075Sobrien#define UHWtype UHItype 22790075Sobrien#define DWtype SItype 22890075Sobrien#define UDWtype USItype 22990075Sobrien#define __NW(a,b) __ ## a ## hi ## b 23090075Sobrien#define __NDW(a,b) __ ## a ## si ## b 23190075Sobrien#else 23290075Sobrien#define W_TYPE_SIZE BITS_PER_UNIT 23390075Sobrien#define Wtype QItype 23490075Sobrien#define UWtype UQItype 23590075Sobrien#define HWtype QItype 23690075Sobrien#define UHWtype UQItype 23790075Sobrien#define DWtype HItype 23890075Sobrien#define UDWtype UHItype 23990075Sobrien#define __NW(a,b) __ ## a ## qi ## b 24090075Sobrien#define __NDW(a,b) __ ## a ## hi ## b 24190075Sobrien#endif 24290075Sobrien 24390075Sobrien#define Wtype_MAX ((Wtype)(((UWtype)1 << (W_TYPE_SIZE - 1)) - 1)) 24490075Sobrien#define Wtype_MIN (- Wtype_MAX - 1) 24590075Sobrien 246169689Skan#if W_TYPE_SIZE == 8 247169689Skan# define Wtype_MAXp1_F 0x1p8f 248169689Skan#elif W_TYPE_SIZE == 16 249169689Skan# define Wtype_MAXp1_F 0x1p16f 250169689Skan#elif W_TYPE_SIZE == 32 251169689Skan# define Wtype_MAXp1_F 0x1p32f 252169689Skan#elif W_TYPE_SIZE == 64 253169689Skan# define Wtype_MAXp1_F 0x1p64f 254169689Skan#else 255169689Skan# error "expand the table" 256169689Skan#endif 257169689Skan 25890075Sobrien#define __muldi3 __NDW(mul,3) 25990075Sobrien#define __divdi3 __NDW(div,3) 26090075Sobrien#define __udivdi3 __NDW(udiv,3) 26190075Sobrien#define __moddi3 __NDW(mod,3) 26290075Sobrien#define __umoddi3 __NDW(umod,3) 26390075Sobrien#define __negdi2 __NDW(neg,2) 26490075Sobrien#define __lshrdi3 __NDW(lshr,3) 26590075Sobrien#define __ashldi3 __NDW(ashl,3) 26690075Sobrien#define __ashrdi3 __NDW(ashr,3) 26790075Sobrien#define __cmpdi2 __NDW(cmp,2) 26890075Sobrien#define __ucmpdi2 __NDW(ucmp,2) 26990075Sobrien#define __udivmoddi4 __NDW(udivmod,4) 27090075Sobrien#define __fixunstfDI __NDW(fixunstf,) 27190075Sobrien#define __fixtfdi __NDW(fixtf,) 27290075Sobrien#define __fixunsxfDI __NDW(fixunsxf,) 27390075Sobrien#define __fixxfdi __NDW(fixxf,) 27490075Sobrien#define __fixunsdfDI __NDW(fixunsdf,) 27590075Sobrien#define __fixdfdi __NDW(fixdf,) 27690075Sobrien#define __fixunssfDI __NDW(fixunssf,) 27790075Sobrien#define __fixsfdi __NDW(fixsf,) 27890075Sobrien#define __floatdixf __NDW(float,xf) 27990075Sobrien#define __floatditf __NDW(float,tf) 28090075Sobrien#define __floatdidf __NDW(float,df) 28190075Sobrien#define __floatdisf __NDW(float,sf) 282169689Skan#define __floatundixf __NDW(floatun,xf) 283169689Skan#define __floatunditf __NDW(floatun,tf) 284169689Skan#define __floatundidf __NDW(floatun,df) 285169689Skan#define __floatundisf __NDW(floatun,sf) 28690075Sobrien#define __fixunsxfSI __NW(fixunsxf,) 28790075Sobrien#define __fixunstfSI __NW(fixunstf,) 28890075Sobrien#define __fixunsdfSI __NW(fixunsdf,) 28990075Sobrien#define __fixunssfSI __NW(fixunssf,) 29090075Sobrien 291146895Skan#define __absvSI2 __NW(absv,2) 292146895Skan#define __addvSI3 __NW(addv,3) 293146895Skan#define __subvSI3 __NW(subv,3) 294146895Skan#define __mulvSI3 __NW(mulv,3) 295146895Skan#define __negvSI2 __NW(negv,2) 296146895Skan#define __absvDI2 __NDW(absv,2) 297146895Skan#define __addvDI3 __NDW(addv,3) 298146895Skan#define __subvDI3 __NDW(subv,3) 299146895Skan#define __mulvDI3 __NDW(mulv,3) 300146895Skan#define __negvDI2 __NDW(negv,2) 301146895Skan 302132718Skan#define __ffsSI2 __NW(ffs,2) 303132718Skan#define __clzSI2 __NW(clz,2) 304132718Skan#define __ctzSI2 __NW(ctz,2) 305132718Skan#define __popcountSI2 __NW(popcount,2) 306132718Skan#define __paritySI2 __NW(parity,2) 307132718Skan#define __ffsDI2 __NDW(ffs,2) 308132718Skan#define __clzDI2 __NDW(clz,2) 309132718Skan#define __ctzDI2 __NDW(ctz,2) 310132718Skan#define __popcountDI2 __NDW(popcount,2) 311132718Skan#define __parityDI2 __NDW(parity,2) 312132718Skan 31390075Sobrienextern DWtype __muldi3 (DWtype, DWtype); 31490075Sobrienextern DWtype __divdi3 (DWtype, DWtype); 31590075Sobrienextern UDWtype __udivdi3 (UDWtype, UDWtype); 31690075Sobrienextern UDWtype __umoddi3 (UDWtype, UDWtype); 31790075Sobrienextern DWtype __moddi3 (DWtype, DWtype); 31890075Sobrien 31990075Sobrien/* __udivmoddi4 is static inline when building other libgcc2 portions. */ 32090075Sobrien#if (!defined (L_udivdi3) && !defined (L_divdi3) && \ 32190075Sobrien !defined (L_umoddi3) && !defined (L_moddi3)) 32290075Sobrienextern UDWtype __udivmoddi4 (UDWtype, UDWtype, UDWtype *); 32390075Sobrien#endif 32490075Sobrien 32590075Sobrien/* __negdi2 is static inline when building other libgcc2 portions. */ 32690075Sobrien#if !defined(L_divdi3) && !defined(L_moddi3) 32790075Sobrienextern DWtype __negdi2 (DWtype); 32890075Sobrien#endif 32990075Sobrien 33090075Sobrienextern DWtype __lshrdi3 (DWtype, word_type); 33190075Sobrienextern DWtype __ashldi3 (DWtype, word_type); 33290075Sobrienextern DWtype __ashrdi3 (DWtype, word_type); 33390075Sobrien 33490075Sobrien/* __udiv_w_sdiv is static inline when building other libgcc2 portions. */ 33590075Sobrien#if (!defined(L_udivdi3) && !defined(L_divdi3) && \ 33690075Sobrien !defined(L_umoddi3) && !defined(L_moddi3)) 33790075Sobrienextern UWtype __udiv_w_sdiv (UWtype *, UWtype, UWtype, UWtype); 33890075Sobrien#endif 33990075Sobrien 34090075Sobrienextern word_type __cmpdi2 (DWtype, DWtype); 34190075Sobrienextern word_type __ucmpdi2 (DWtype, DWtype); 34290075Sobrien 343146895Skanextern Wtype __absvSI2 (Wtype); 344146895Skanextern Wtype __addvSI3 (Wtype, Wtype); 345146895Skanextern Wtype __subvSI3 (Wtype, Wtype); 346146895Skanextern Wtype __mulvSI3 (Wtype, Wtype); 347146895Skanextern Wtype __negvSI2 (Wtype); 348259563Spfgextern UWtype __bswapsi2 (UWtype); 349146895Skanextern DWtype __absvDI2 (DWtype); 350146895Skanextern DWtype __addvDI3 (DWtype, DWtype); 351146895Skanextern DWtype __subvDI3 (DWtype, DWtype); 352146895Skanextern DWtype __mulvDI3 (DWtype, DWtype); 353146895Skanextern DWtype __negvDI2 (DWtype); 354259563Spfgextern UDWtype __bswapdi2 (UDWtype); 35590075Sobrien 356146895Skan#ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC 357146895Skanextern SItype __absvsi2 (SItype); 358146895Skanextern SItype __addvsi3 (SItype, SItype); 359146895Skanextern SItype __subvsi3 (SItype, SItype); 360146895Skanextern SItype __mulvsi3 (SItype, SItype); 361146895Skanextern SItype __negvsi2 (SItype); 362146895Skan#endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */ 363146895Skan 364169689Skan#undef int 365169689Skan#if LIBGCC2_HAS_SF_MODE 366169689Skanextern DWtype __fixsfdi (SFtype); 367169689Skanextern SFtype __floatdisf (DWtype); 368169689Skanextern SFtype __floatundisf (UDWtype); 369169689Skanextern UWtype __fixunssfSI (SFtype); 370169689Skanextern DWtype __fixunssfDI (SFtype); 371169689Skanextern SFtype __powisf2 (SFtype, int); 372169689Skanextern SCtype __divsc3 (SFtype, SFtype, SFtype, SFtype); 373169689Skanextern SCtype __mulsc3 (SFtype, SFtype, SFtype, SFtype); 374169689Skan#endif 375169689Skan#if LIBGCC2_HAS_DF_MODE 37690075Sobrienextern DWtype __fixdfdi (DFtype); 37790075Sobrienextern DFtype __floatdidf (DWtype); 378169689Skanextern DFtype __floatundidf (UDWtype); 37990075Sobrienextern UWtype __fixunsdfSI (DFtype); 38090075Sobrienextern DWtype __fixunsdfDI (DFtype); 381169689Skanextern DFtype __powidf2 (DFtype, int); 382169689Skanextern DCtype __divdc3 (DFtype, DFtype, DFtype, DFtype); 383169689Skanextern DCtype __muldc3 (DFtype, DFtype, DFtype, DFtype); 384169689Skan#endif 38590075Sobrien 386169689Skan#if LIBGCC2_HAS_XF_MODE 38790075Sobrienextern DWtype __fixxfdi (XFtype); 38890075Sobrienextern DWtype __fixunsxfDI (XFtype); 38990075Sobrienextern XFtype __floatdixf (DWtype); 390169689Skanextern XFtype __floatundixf (UDWtype); 39190075Sobrienextern UWtype __fixunsxfSI (XFtype); 392169689Skanextern XFtype __powixf2 (XFtype, int); 393169689Skanextern XCtype __divxc3 (XFtype, XFtype, XFtype, XFtype); 394169689Skanextern XCtype __mulxc3 (XFtype, XFtype, XFtype, XFtype); 39590075Sobrien#endif 39690075Sobrien 397169689Skan#if LIBGCC2_HAS_TF_MODE 39890075Sobrienextern DWtype __fixunstfDI (TFtype); 39990075Sobrienextern DWtype __fixtfdi (TFtype); 40090075Sobrienextern TFtype __floatditf (DWtype); 401169689Skanextern TFtype __floatunditf (UDWtype); 402169689Skanextern TFtype __powitf2 (TFtype, int); 403169689Skanextern TCtype __divtc3 (TFtype, TFtype, TFtype, TFtype); 404169689Skanextern TCtype __multc3 (TFtype, TFtype, TFtype, TFtype); 40590075Sobrien#endif 406169689Skan#define int bogus_type 40790075Sobrien 40890075Sobrien/* DWstructs are pairs of Wtype values in the order determined by 40990075Sobrien LIBGCC2_WORDS_BIG_ENDIAN. */ 41090075Sobrien 41190075Sobrien#if LIBGCC2_WORDS_BIG_ENDIAN 41290075Sobrien struct DWstruct {Wtype high, low;}; 41390075Sobrien#else 41490075Sobrien struct DWstruct {Wtype low, high;}; 41590075Sobrien#endif 41690075Sobrien 41790075Sobrien/* We need this union to unpack/pack DImode values, since we don't have 41890075Sobrien any arithmetic yet. Incoming DImode parameters are stored into the 41990075Sobrien `ll' field, and the unpacked result is read from the struct `s'. */ 42090075Sobrien 42190075Sobrientypedef union 42290075Sobrien{ 42390075Sobrien struct DWstruct s; 42490075Sobrien DWtype ll; 42590075Sobrien} DWunion; 42690075Sobrien 427169689Skan/* Defined for L_popcount_tab. Exported here because some targets may 428169689Skan want to use it for their own versions of the __popcount builtins. */ 429169689Skanextern const UQItype __popcount_tab[256]; 430169689Skan 431169689Skan/* Defined for L_clz. Exported here because some targets may want to use 432169689Skan it for their own versions of the __clz builtins. It contains the bit 433169689Skan position of the first set bit for the numbers 0 - 255. This avoids the 434169689Skan need for a separate table for the __ctz builtins. */ 435169689Skanextern const UQItype __clz_tab[256]; 436169689Skan 43790075Sobrien#include "longlong.h" 43890075Sobrien 439169689Skan#undef int 440169689Skanextern int __clzDI2 (UDWtype); 441169689Skanextern int __clzSI2 (UWtype); 442169689Skanextern int __ctzSI2 (UWtype); 443169689Skanextern int __ffsSI2 (UWtype); 444169689Skanextern int __ffsDI2 (DWtype); 445169689Skanextern int __ctzDI2 (UDWtype); 446169689Skanextern int __popcountSI2 (UWtype); 447169689Skanextern int __popcountDI2 (UDWtype); 448169689Skanextern int __paritySI2 (UWtype); 449169689Skanextern int __parityDI2 (UDWtype); 450169689Skan#define int bogus_type 451169689Skan 452169689Skanextern void __enable_execute_stack (void *); 453169689Skan 454169689Skan#ifndef HIDE_EXPORTS 455169689Skan#pragma GCC visibility pop 456169689Skan#endif 457169689Skan 45890075Sobrien#endif /* ! GCC_LIBGCC2_H */ 459