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