Home | History | Annotate | Line # | Download | only in libgcc
      1   1.1  mrg /* More subroutines needed by GCC output code on some machines.  */
      2   1.1  mrg /* Compile this one with gcc.  */
      3  1.12  mrg /* Copyright (C) 1989-2022 Free Software Foundation, Inc.
      4   1.1  mrg 
      5   1.1  mrg This file is part of GCC.
      6   1.1  mrg 
      7   1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      8   1.1  mrg the terms of the GNU General Public License as published by the Free
      9   1.1  mrg Software Foundation; either version 3, or (at your option) any later
     10   1.1  mrg version.
     11   1.1  mrg 
     12   1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13   1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14   1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15   1.1  mrg for more details.
     16   1.1  mrg 
     17   1.1  mrg Under Section 7 of GPL version 3, you are granted additional
     18   1.1  mrg permissions described in the GCC Runtime Library Exception, version
     19   1.1  mrg 3.1, as published by the Free Software Foundation.
     20   1.1  mrg 
     21   1.1  mrg You should have received a copy of the GNU General Public License and
     22   1.1  mrg a copy of the GCC Runtime Library Exception along with this program;
     23   1.1  mrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24   1.1  mrg <http://www.gnu.org/licenses/>.  */
     25   1.1  mrg 
     26   1.1  mrg #include "tconfig.h"
     27   1.1  mrg #include "tsystem.h"
     28   1.1  mrg #include "coretypes.h"
     29   1.1  mrg #include "tm.h"
     30   1.1  mrg #include "libgcc_tm.h"
     31   1.1  mrg 
     32   1.1  mrg #ifdef HAVE_GAS_HIDDEN
     33   1.1  mrg #define ATTRIBUTE_HIDDEN  __attribute__ ((__visibility__ ("hidden")))
     34   1.1  mrg #else
     35   1.1  mrg #define ATTRIBUTE_HIDDEN
     36   1.1  mrg #endif
     37   1.1  mrg 
     38   1.1  mrg /* Work out the largest "word" size that we can deal with on this target.  */
     39   1.1  mrg #if MIN_UNITS_PER_WORD > 4
     40   1.1  mrg # define LIBGCC2_MAX_UNITS_PER_WORD 8
     41   1.1  mrg #elif (MIN_UNITS_PER_WORD > 2 \
     42   1.1  mrg        || (MIN_UNITS_PER_WORD > 1 && __SIZEOF_LONG_LONG__ > 4))
     43   1.1  mrg # define LIBGCC2_MAX_UNITS_PER_WORD 4
     44   1.1  mrg #else
     45   1.1  mrg # define LIBGCC2_MAX_UNITS_PER_WORD MIN_UNITS_PER_WORD
     46   1.1  mrg #endif
     47   1.1  mrg 
     48   1.1  mrg /* Work out what word size we are using for this compilation.
     49   1.1  mrg    The value can be set on the command line.  */
     50   1.1  mrg #ifndef LIBGCC2_UNITS_PER_WORD
     51   1.1  mrg #define LIBGCC2_UNITS_PER_WORD LIBGCC2_MAX_UNITS_PER_WORD
     52   1.1  mrg #endif
     53   1.1  mrg 
     54   1.1  mrg #if LIBGCC2_UNITS_PER_WORD <= LIBGCC2_MAX_UNITS_PER_WORD
     55   1.1  mrg 
     56   1.1  mrg #include "libgcc2.h"
     57   1.1  mrg 
     58   1.1  mrg #ifdef DECLARE_LIBRARY_RENAMES
     60   1.1  mrg   DECLARE_LIBRARY_RENAMES
     61   1.1  mrg #endif
     62   1.1  mrg 
     63   1.1  mrg #if defined (L_negdi2)
     64   1.1  mrg DWtype
     65   1.1  mrg __negdi2 (DWtype u)
     66   1.1  mrg {
     67   1.1  mrg   const DWunion uu = {.ll = u};
     68   1.1  mrg   const DWunion w = { {.low = -uu.s.low,
     69   1.1  mrg 		       .high = -uu.s.high - ((UWtype) -uu.s.low > 0) } };
     70   1.1  mrg 
     71   1.1  mrg   return w.ll;
     72   1.1  mrg }
     73   1.1  mrg #endif
     74   1.1  mrg 
     75   1.1  mrg #ifdef L_addvsi3
     76   1.1  mrg Wtype
     77   1.1  mrg __addvSI3 (Wtype a, Wtype b)
     78  1.12  mrg {
     79   1.1  mrg   Wtype w;
     80  1.12  mrg 
     81   1.1  mrg   if (__builtin_add_overflow (a, b, &w))
     82   1.1  mrg     abort ();
     83   1.1  mrg 
     84   1.1  mrg   return w;
     85   1.1  mrg }
     86   1.1  mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
     87   1.1  mrg SItype
     88   1.1  mrg __addvsi3 (SItype a, SItype b)
     89  1.12  mrg {
     90   1.1  mrg   SItype w;
     91  1.12  mrg 
     92   1.1  mrg   if (__builtin_add_overflow (a, b, &w))
     93   1.1  mrg     abort ();
     94   1.1  mrg 
     95   1.1  mrg   return w;
     96   1.1  mrg }
     97   1.1  mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
     98   1.1  mrg #endif
     99   1.1  mrg 
    100   1.1  mrg #ifdef L_addvdi3
    102   1.1  mrg DWtype
    103  1.12  mrg __addvDI3 (DWtype a, DWtype b)
    104   1.1  mrg {
    105  1.12  mrg   DWtype w;
    106   1.1  mrg 
    107   1.1  mrg   if (__builtin_add_overflow (a, b, &w))
    108   1.1  mrg     abort ();
    109   1.1  mrg 
    110   1.1  mrg   return w;
    111   1.1  mrg }
    112   1.1  mrg #endif
    113   1.1  mrg 
    114   1.1  mrg #ifdef L_subvsi3
    116  1.12  mrg Wtype
    117   1.1  mrg __subvSI3 (Wtype a, Wtype b)
    118  1.12  mrg {
    119   1.1  mrg   Wtype w;
    120   1.1  mrg 
    121   1.1  mrg   if (__builtin_sub_overflow (a, b, &w))
    122   1.1  mrg     abort ();
    123   1.1  mrg 
    124   1.1  mrg   return w;
    125   1.1  mrg }
    126   1.1  mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
    127  1.12  mrg SItype
    128   1.1  mrg __subvsi3 (SItype a, SItype b)
    129  1.12  mrg {
    130   1.1  mrg   SItype w;
    131   1.1  mrg 
    132   1.1  mrg   if (__builtin_sub_overflow (a, b, &w))
    133   1.1  mrg     abort ();
    134   1.1  mrg 
    135   1.1  mrg   return w;
    136   1.1  mrg }
    137   1.1  mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
    138   1.1  mrg #endif
    139   1.1  mrg 
    140   1.1  mrg #ifdef L_subvdi3
    142   1.1  mrg DWtype
    143  1.12  mrg __subvDI3 (DWtype a, DWtype b)
    144   1.1  mrg {
    145   1.1  mrg   DWtype w;
    146   1.1  mrg 
    147   1.1  mrg   if (__builtin_sub_overflow (a, b, &w))
    148   1.1  mrg     abort ();
    149   1.1  mrg 
    150   1.1  mrg   return w;
    151   1.1  mrg }
    152   1.1  mrg #endif
    153   1.1  mrg 
    154  1.12  mrg #ifdef L_mulvsi3
    156  1.12  mrg Wtype
    157   1.1  mrg __mulvSI3 (Wtype a, Wtype b)
    158   1.1  mrg {
    159   1.1  mrg   Wtype w;
    160   1.1  mrg 
    161   1.1  mrg   if (__builtin_mul_overflow (a, b, &w))
    162   1.1  mrg     abort ();
    163   1.1  mrg 
    164   1.1  mrg   return w;
    165  1.12  mrg }
    166   1.1  mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
    167  1.12  mrg SItype
    168   1.1  mrg __mulvsi3 (SItype a, SItype b)
    169   1.1  mrg {
    170   1.1  mrg   SItype w;
    171   1.1  mrg 
    172   1.1  mrg   if (__builtin_mul_overflow (a, b, &w))
    173   1.1  mrg     abort ();
    174   1.1  mrg 
    175   1.1  mrg   return w;
    176   1.1  mrg }
    177   1.1  mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
    178   1.1  mrg #endif
    179  1.12  mrg 
    180   1.1  mrg #ifdef L_negvsi2
    182   1.1  mrg Wtype
    183   1.1  mrg __negvSI2 (Wtype a)
    184  1.12  mrg {
    185   1.1  mrg   Wtype w;
    186   1.1  mrg 
    187   1.1  mrg   if (__builtin_sub_overflow (0, a, &w))
    188   1.1  mrg     abort ();
    189   1.1  mrg 
    190  1.12  mrg   return w;
    191   1.1  mrg }
    192  1.12  mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
    193   1.1  mrg SItype
    194   1.1  mrg __negvsi2 (SItype a)
    195  1.12  mrg {
    196   1.1  mrg   SItype w;
    197   1.1  mrg 
    198   1.1  mrg   if (__builtin_sub_overflow (0, a, &w))
    199   1.1  mrg     abort ();
    200   1.1  mrg 
    201   1.1  mrg   return w;
    202   1.1  mrg }
    203   1.1  mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
    204  1.12  mrg #endif
    205   1.1  mrg 
    206  1.12  mrg #ifdef L_negvdi2
    208   1.1  mrg DWtype
    209   1.1  mrg __negvDI2 (DWtype a)
    210   1.1  mrg {
    211   1.1  mrg   DWtype w;
    212   1.1  mrg 
    213   1.1  mrg   if (__builtin_sub_overflow (0, a, &w))
    214   1.1  mrg     abort ();
    215   1.1  mrg 
    216   1.1  mrg   return w;
    217  1.12  mrg }
    218  1.12  mrg #endif
    219   1.1  mrg 
    220  1.12  mrg #ifdef L_absvsi2
    222   1.1  mrg Wtype
    223  1.12  mrg __absvSI2 (Wtype a)
    224   1.1  mrg {
    225   1.1  mrg   const Wtype v = 0 - (a < 0);
    226   1.1  mrg   Wtype w;
    227   1.1  mrg 
    228   1.1  mrg   if (__builtin_add_overflow (a, v, &w))
    229  1.12  mrg     abort ();
    230  1.12  mrg 
    231   1.1  mrg   return v ^ w;
    232  1.12  mrg }
    233   1.1  mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
    234   1.1  mrg SItype
    235  1.12  mrg __absvsi2 (SItype a)
    236   1.1  mrg {
    237   1.1  mrg   const SItype v = 0 - (a < 0);
    238   1.1  mrg   SItype w;
    239   1.1  mrg 
    240   1.1  mrg   if (__builtin_add_overflow (a, v, &w))
    241   1.1  mrg     abort ();
    242   1.1  mrg 
    243   1.1  mrg   return v ^ w;
    244  1.12  mrg }
    245  1.12  mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
    246   1.1  mrg #endif
    247  1.12  mrg 
    248   1.1  mrg #ifdef L_absvdi2
    250  1.12  mrg DWtype
    251   1.1  mrg __absvDI2 (DWtype a)
    252   1.1  mrg {
    253   1.1  mrg   const DWtype v = 0 - (a < 0);
    254   1.1  mrg   DWtype w;
    255   1.1  mrg 
    256   1.1  mrg   if (__builtin_add_overflow (a, v, &w))
    257   1.1  mrg     abort ();
    258   1.1  mrg 
    259   1.1  mrg   return v ^ w;
    260   1.1  mrg }
    261   1.1  mrg #endif
    262   1.1  mrg 
    263   1.1  mrg #ifdef L_mulvdi3
    265   1.1  mrg DWtype
    266   1.1  mrg __mulvDI3 (DWtype u, DWtype v)
    267   1.1  mrg {
    268   1.1  mrg   /* The unchecked multiplication needs 3 Wtype x Wtype multiplications,
    269   1.1  mrg      but the checked multiplication needs only two.  */
    270   1.1  mrg   const DWunion uu = {.ll = u};
    271   1.1  mrg   const DWunion vv = {.ll = v};
    272   1.1  mrg 
    273   1.1  mrg   if (__builtin_expect (uu.s.high == uu.s.low >> (W_TYPE_SIZE - 1), 1))
    274   1.1  mrg     {
    275   1.1  mrg       /* u fits in a single Wtype.  */
    276   1.1  mrg       if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1))
    277   1.1  mrg 	{
    278   1.1  mrg 	  /* v fits in a single Wtype as well.  */
    279   1.1  mrg 	  /* A single multiplication.  No overflow risk.  */
    280   1.1  mrg 	  return (DWtype) uu.s.low * (DWtype) vv.s.low;
    281   1.1  mrg 	}
    282   1.1  mrg       else
    283   1.1  mrg 	{
    284   1.1  mrg 	  /* Two multiplications.  */
    285   1.1  mrg 	  DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low
    286   1.1  mrg 			* (UDWtype) (UWtype) vv.s.low};
    287   1.1  mrg 	  DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.low
    288   1.1  mrg 			* (UDWtype) (UWtype) vv.s.high};
    289   1.1  mrg 
    290   1.1  mrg 	  if (vv.s.high < 0)
    291   1.1  mrg 	    w1.s.high -= uu.s.low;
    292   1.1  mrg 	  if (uu.s.low < 0)
    293   1.1  mrg 	    w1.ll -= vv.ll;
    294   1.1  mrg 	  w1.ll += (UWtype) w0.s.high;
    295   1.1  mrg 	  if (__builtin_expect (w1.s.high == w1.s.low >> (W_TYPE_SIZE - 1), 1))
    296   1.1  mrg 	    {
    297   1.1  mrg 	      w0.s.high = w1.s.low;
    298   1.1  mrg 	      return w0.ll;
    299   1.1  mrg 	    }
    300   1.1  mrg 	}
    301   1.1  mrg     }
    302   1.1  mrg   else
    303   1.1  mrg     {
    304   1.1  mrg       if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1))
    305   1.1  mrg 	{
    306   1.1  mrg 	  /* v fits into a single Wtype.  */
    307   1.1  mrg 	  /* Two multiplications.  */
    308   1.1  mrg 	  DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low
    309   1.1  mrg 			* (UDWtype) (UWtype) vv.s.low};
    310   1.1  mrg 	  DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.high
    311   1.1  mrg 			* (UDWtype) (UWtype) vv.s.low};
    312   1.1  mrg 
    313   1.1  mrg 	  if (uu.s.high < 0)
    314   1.1  mrg 	    w1.s.high -= vv.s.low;
    315   1.1  mrg 	  if (vv.s.low < 0)
    316   1.1  mrg 	    w1.ll -= uu.ll;
    317   1.1  mrg 	  w1.ll += (UWtype) w0.s.high;
    318   1.1  mrg 	  if (__builtin_expect (w1.s.high == w1.s.low >> (W_TYPE_SIZE - 1), 1))
    319   1.1  mrg 	    {
    320   1.1  mrg 	      w0.s.high = w1.s.low;
    321   1.1  mrg 	      return w0.ll;
    322   1.1  mrg 	    }
    323   1.1  mrg 	}
    324   1.1  mrg       else
    325   1.1  mrg 	{
    326   1.1  mrg 	  /* A few sign checks and a single multiplication.  */
    327   1.1  mrg 	  if (uu.s.high >= 0)
    328   1.1  mrg 	    {
    329   1.1  mrg 	      if (vv.s.high >= 0)
    330   1.1  mrg 		{
    331   1.1  mrg 		  if (uu.s.high == 0 && vv.s.high == 0)
    332   1.1  mrg 		    {
    333   1.1  mrg 		      const DWtype w = (UDWtype) (UWtype) uu.s.low
    334   1.1  mrg 			* (UDWtype) (UWtype) vv.s.low;
    335   1.1  mrg 		      if (__builtin_expect (w >= 0, 1))
    336   1.1  mrg 			return w;
    337   1.1  mrg 		    }
    338   1.1  mrg 		}
    339   1.1  mrg 	      else
    340   1.1  mrg 		{
    341   1.1  mrg 		  if (uu.s.high == 0 && vv.s.high == (Wtype) -1)
    342   1.1  mrg 		    {
    343   1.1  mrg 		      DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
    344   1.1  mrg 				    * (UDWtype) (UWtype) vv.s.low};
    345   1.1  mrg 
    346   1.1  mrg 		      ww.s.high -= uu.s.low;
    347   1.1  mrg 		      if (__builtin_expect (ww.s.high < 0, 1))
    348   1.1  mrg 			return ww.ll;
    349   1.1  mrg 		    }
    350   1.1  mrg 		}
    351   1.1  mrg 	    }
    352   1.1  mrg 	  else
    353   1.1  mrg 	    {
    354   1.1  mrg 	      if (vv.s.high >= 0)
    355   1.1  mrg 		{
    356   1.1  mrg 		  if (uu.s.high == (Wtype) -1 && vv.s.high == 0)
    357   1.1  mrg 		    {
    358   1.6  mrg 		      DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
    359   1.6  mrg 				    * (UDWtype) (UWtype) vv.s.low};
    360   1.1  mrg 
    361   1.1  mrg 		      ww.s.high -= vv.s.low;
    362   1.1  mrg 		      if (__builtin_expect (ww.s.high < 0, 1))
    363   1.1  mrg 			return ww.ll;
    364   1.1  mrg 		    }
    365   1.1  mrg 		}
    366   1.1  mrg 	      else
    367   1.1  mrg 		{
    368   1.1  mrg 		  if ((uu.s.high & vv.s.high) == (Wtype) -1
    369   1.1  mrg 		      && (uu.s.low | vv.s.low) != 0)
    370   1.1  mrg 		    {
    371   1.1  mrg 		      DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
    372   1.1  mrg 				    * (UDWtype) (UWtype) vv.s.low};
    373   1.1  mrg 
    374   1.1  mrg 		      ww.s.high -= uu.s.low;
    375   1.1  mrg 		      ww.s.high -= vv.s.low;
    376   1.1  mrg 		      if (__builtin_expect (ww.s.high >= 0, 1))
    377   1.1  mrg 			return ww.ll;
    378   1.1  mrg 		    }
    379   1.1  mrg 		}
    380   1.1  mrg 	    }
    381   1.1  mrg 	}
    382   1.1  mrg     }
    383   1.1  mrg 
    384   1.1  mrg   /* Overflow.  */
    385   1.1  mrg   abort ();
    386   1.1  mrg }
    387   1.1  mrg #endif
    388   1.1  mrg 
    389   1.1  mrg 
    391   1.1  mrg /* Unless shift functions are defined with full ANSI prototypes,
    392   1.1  mrg    parameter b will be promoted to int if shift_count_type is smaller than an int.  */
    393   1.1  mrg #ifdef L_lshrdi3
    394   1.1  mrg DWtype
    395   1.1  mrg __lshrdi3 (DWtype u, shift_count_type b)
    396   1.1  mrg {
    397   1.1  mrg   if (b == 0)
    398   1.1  mrg     return u;
    399   1.1  mrg 
    400   1.1  mrg   const DWunion uu = {.ll = u};
    401   1.1  mrg   const shift_count_type bm = W_TYPE_SIZE - b;
    402   1.1  mrg   DWunion w;
    403   1.1  mrg 
    404   1.1  mrg   if (bm <= 0)
    405   1.1  mrg     {
    406   1.1  mrg       w.s.high = 0;
    407   1.1  mrg       w.s.low = (UWtype) uu.s.high >> -bm;
    408   1.1  mrg     }
    409   1.1  mrg   else
    410   1.1  mrg     {
    411   1.1  mrg       const UWtype carries = (UWtype) uu.s.high << bm;
    412   1.1  mrg 
    413   1.1  mrg       w.s.high = (UWtype) uu.s.high >> b;
    414   1.1  mrg       w.s.low = ((UWtype) uu.s.low >> b) | carries;
    415   1.1  mrg     }
    416   1.1  mrg 
    417   1.1  mrg   return w.ll;
    418   1.1  mrg }
    419   1.1  mrg #endif
    420   1.1  mrg 
    421   1.1  mrg #ifdef L_ashldi3
    422   1.1  mrg DWtype
    423   1.1  mrg __ashldi3 (DWtype u, shift_count_type b)
    424   1.1  mrg {
    425   1.1  mrg   if (b == 0)
    426   1.1  mrg     return u;
    427   1.1  mrg 
    428   1.1  mrg   const DWunion uu = {.ll = u};
    429   1.1  mrg   const shift_count_type bm = W_TYPE_SIZE - b;
    430   1.1  mrg   DWunion w;
    431   1.1  mrg 
    432   1.1  mrg   if (bm <= 0)
    433   1.1  mrg     {
    434   1.1  mrg       w.s.low = 0;
    435   1.1  mrg       w.s.high = (UWtype) uu.s.low << -bm;
    436   1.1  mrg     }
    437   1.1  mrg   else
    438   1.1  mrg     {
    439   1.1  mrg       const UWtype carries = (UWtype) uu.s.low >> bm;
    440   1.1  mrg 
    441   1.1  mrg       w.s.low = (UWtype) uu.s.low << b;
    442   1.1  mrg       w.s.high = ((UWtype) uu.s.high << b) | carries;
    443   1.1  mrg     }
    444   1.1  mrg 
    445   1.1  mrg   return w.ll;
    446   1.1  mrg }
    447   1.1  mrg #endif
    448   1.1  mrg 
    449   1.1  mrg #ifdef L_ashrdi3
    450   1.1  mrg DWtype
    451   1.1  mrg __ashrdi3 (DWtype u, shift_count_type b)
    452   1.1  mrg {
    453   1.1  mrg   if (b == 0)
    454   1.1  mrg     return u;
    455   1.1  mrg 
    456   1.1  mrg   const DWunion uu = {.ll = u};
    457   1.1  mrg   const shift_count_type bm = W_TYPE_SIZE - b;
    458   1.1  mrg   DWunion w;
    459   1.1  mrg 
    460   1.1  mrg   if (bm <= 0)
    461   1.1  mrg     {
    462   1.1  mrg       /* w.s.high = 1..1 or 0..0 */
    463   1.1  mrg       w.s.high = uu.s.high >> (W_TYPE_SIZE - 1);
    464   1.1  mrg       w.s.low = uu.s.high >> -bm;
    465   1.1  mrg     }
    466   1.1  mrg   else
    467   1.1  mrg     {
    468   1.1  mrg       const UWtype carries = (UWtype) uu.s.high << bm;
    469   1.1  mrg 
    470   1.1  mrg       w.s.high = uu.s.high >> b;
    471  1.12  mrg       w.s.low = ((UWtype) uu.s.low >> b) | carries;
    472  1.12  mrg     }
    473  1.12  mrg 
    474  1.12  mrg   return w.ll;
    475   1.1  mrg }
    476   1.1  mrg #endif
    477   1.1  mrg 
    478   1.1  mrg #ifdef L_bswapsi2
    480   1.1  mrg SItype
    481   1.1  mrg __bswapsi2 (SItype u)
    482   1.1  mrg {
    483   1.1  mrg   return ((((u) & 0xff000000u) >> 24)
    484   1.1  mrg 	  | (((u) & 0x00ff0000u) >>  8)
    485   1.1  mrg 	  | (((u) & 0x0000ff00u) <<  8)
    486   1.1  mrg 	  | (((u) & 0x000000ffu) << 24));
    487   1.1  mrg }
    488   1.1  mrg #endif
    489   1.1  mrg #ifdef L_bswapdi2
    490   1.1  mrg DItype
    491   1.1  mrg __bswapdi2 (DItype u)
    492   1.1  mrg {
    493   1.1  mrg   return ((((u) & 0xff00000000000000ull) >> 56)
    494   1.1  mrg 	  | (((u) & 0x00ff000000000000ull) >> 40)
    495   1.1  mrg 	  | (((u) & 0x0000ff0000000000ull) >> 24)
    496   1.1  mrg 	  | (((u) & 0x000000ff00000000ull) >>  8)
    497   1.1  mrg 	  | (((u) & 0x00000000ff000000ull) <<  8)
    498   1.1  mrg 	  | (((u) & 0x0000000000ff0000ull) << 24)
    499   1.1  mrg 	  | (((u) & 0x000000000000ff00ull) << 40)
    500   1.1  mrg 	  | (((u) & 0x00000000000000ffull) << 56));
    501   1.1  mrg }
    502   1.1  mrg #endif
    503   1.1  mrg #ifdef L_ffssi2
    504   1.1  mrg #undef int
    505   1.1  mrg int
    506   1.1  mrg __ffsSI2 (UWtype u)
    507   1.1  mrg {
    508   1.1  mrg   UWtype count;
    509   1.1  mrg 
    510   1.1  mrg   if (u == 0)
    511   1.1  mrg     return 0;
    512   1.1  mrg 
    513   1.1  mrg   count_trailing_zeros (count, u);
    514   1.1  mrg   return count + 1;
    515   1.1  mrg }
    516   1.1  mrg #endif
    517   1.1  mrg 
    518   1.1  mrg #ifdef L_ffsdi2
    520   1.1  mrg #undef int
    521   1.1  mrg int
    522   1.1  mrg __ffsDI2 (DWtype u)
    523   1.1  mrg {
    524   1.1  mrg   const DWunion uu = {.ll = u};
    525   1.1  mrg   UWtype word, count, add;
    526   1.1  mrg 
    527   1.1  mrg   if (uu.s.low != 0)
    528   1.1  mrg     word = uu.s.low, add = 0;
    529   1.1  mrg   else if (uu.s.high != 0)
    530   1.1  mrg     word = uu.s.high, add = W_TYPE_SIZE;
    531   1.1  mrg   else
    532   1.1  mrg     return 0;
    533   1.1  mrg 
    534   1.1  mrg   count_trailing_zeros (count, word);
    535   1.1  mrg   return count + add + 1;
    536   1.1  mrg }
    537   1.1  mrg #endif
    538   1.1  mrg 
    539   1.1  mrg #ifdef L_muldi3
    541   1.1  mrg DWtype
    542   1.1  mrg __muldi3 (DWtype u, DWtype v)
    543   1.1  mrg {
    544   1.1  mrg   const DWunion uu = {.ll = u};
    545   1.1  mrg   const DWunion vv = {.ll = v};
    546   1.1  mrg   DWunion w = {.ll = __umulsidi3 (uu.s.low, vv.s.low)};
    547   1.1  mrg 
    548   1.1  mrg   w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
    549   1.1  mrg 	       + (UWtype) uu.s.high * (UWtype) vv.s.low);
    550   1.1  mrg 
    551   1.1  mrg   return w.ll;
    552   1.1  mrg }
    553   1.1  mrg #endif
    554   1.1  mrg 
    555   1.1  mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
    557   1.1  mrg      defined (L_umoddi3) || defined (L_moddi3))
    558   1.1  mrg #if defined (sdiv_qrnnd)
    559   1.1  mrg #define L_udiv_w_sdiv
    560   1.1  mrg #endif
    561   1.1  mrg #endif
    562   1.1  mrg 
    563   1.1  mrg #ifdef L_udiv_w_sdiv
    564   1.1  mrg #if defined (sdiv_qrnnd)
    565   1.1  mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
    566   1.1  mrg      defined (L_umoddi3) || defined (L_moddi3))
    567   1.1  mrg static inline __attribute__ ((__always_inline__))
    568   1.1  mrg #endif
    569   1.1  mrg UWtype
    570   1.1  mrg __udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d)
    571   1.1  mrg {
    572   1.1  mrg   UWtype q, r;
    573   1.1  mrg   UWtype c0, c1, b1;
    574   1.1  mrg 
    575   1.1  mrg   if ((Wtype) d >= 0)
    576   1.1  mrg     {
    577   1.1  mrg       if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
    578   1.1  mrg 	{
    579   1.1  mrg 	  /* Dividend, divisor, and quotient are nonnegative.  */
    580   1.1  mrg 	  sdiv_qrnnd (q, r, a1, a0, d);
    581   1.1  mrg 	}
    582   1.1  mrg       else
    583   1.1  mrg 	{
    584   1.1  mrg 	  /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d.  */
    585   1.1  mrg 	  sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1));
    586   1.1  mrg 	  /* Divide (c1*2^32 + c0) by d.  */
    587   1.1  mrg 	  sdiv_qrnnd (q, r, c1, c0, d);
    588   1.1  mrg 	  /* Add 2^31 to quotient.  */
    589   1.1  mrg 	  q += (UWtype) 1 << (W_TYPE_SIZE - 1);
    590   1.1  mrg 	}
    591   1.1  mrg     }
    592   1.1  mrg   else
    593   1.1  mrg     {
    594   1.1  mrg       b1 = d >> 1;			/* d/2, between 2^30 and 2^31 - 1 */
    595   1.1  mrg       c1 = a1 >> 1;			/* A/2 */
    596   1.1  mrg       c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1);
    597   1.1  mrg 
    598   1.1  mrg       if (a1 < b1)			/* A < 2^32*b1, so A/2 < 2^31*b1 */
    599   1.1  mrg 	{
    600   1.1  mrg 	  sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
    601   1.1  mrg 
    602   1.1  mrg 	  r = 2*r + (a0 & 1);		/* Remainder from A/(2*b1) */
    603   1.1  mrg 	  if ((d & 1) != 0)
    604   1.1  mrg 	    {
    605   1.1  mrg 	      if (r >= q)
    606   1.1  mrg 		r = r - q;
    607   1.1  mrg 	      else if (q - r <= d)
    608   1.1  mrg 		{
    609   1.1  mrg 		  r = r - q + d;
    610   1.1  mrg 		  q--;
    611   1.1  mrg 		}
    612   1.1  mrg 	      else
    613   1.1  mrg 		{
    614   1.1  mrg 		  r = r - q + 2*d;
    615   1.1  mrg 		  q -= 2;
    616   1.1  mrg 		}
    617   1.1  mrg 	    }
    618   1.1  mrg 	}
    619   1.1  mrg       else if (c1 < b1)			/* So 2^31 <= (A/2)/b1 < 2^32 */
    620   1.1  mrg 	{
    621   1.1  mrg 	  c1 = (b1 - 1) - c1;
    622   1.1  mrg 	  c0 = ~c0;			/* logical NOT */
    623   1.1  mrg 
    624   1.1  mrg 	  sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
    625   1.1  mrg 
    626   1.1  mrg 	  q = ~q;			/* (A/2)/b1 */
    627   1.1  mrg 	  r = (b1 - 1) - r;
    628   1.1  mrg 
    629   1.1  mrg 	  r = 2*r + (a0 & 1);		/* A/(2*b1) */
    630   1.1  mrg 
    631   1.1  mrg 	  if ((d & 1) != 0)
    632   1.1  mrg 	    {
    633   1.1  mrg 	      if (r >= q)
    634   1.1  mrg 		r = r - q;
    635   1.1  mrg 	      else if (q - r <= d)
    636   1.1  mrg 		{
    637   1.1  mrg 		  r = r - q + d;
    638   1.1  mrg 		  q--;
    639   1.1  mrg 		}
    640   1.1  mrg 	      else
    641   1.1  mrg 		{
    642   1.1  mrg 		  r = r - q + 2*d;
    643   1.1  mrg 		  q -= 2;
    644   1.1  mrg 		}
    645   1.1  mrg 	    }
    646   1.1  mrg 	}
    647   1.1  mrg       else				/* Implies c1 = b1 */
    648   1.1  mrg 	{				/* Hence a1 = d - 1 = 2*b1 - 1 */
    649   1.1  mrg 	  if (a0 >= -d)
    650   1.1  mrg 	    {
    651   1.1  mrg 	      q = -1;
    652   1.1  mrg 	      r = a0 + d;
    653   1.1  mrg 	    }
    654   1.1  mrg 	  else
    655   1.1  mrg 	    {
    656   1.1  mrg 	      q = -2;
    657   1.1  mrg 	      r = a0 + 2*d;
    658   1.1  mrg 	    }
    659   1.1  mrg 	}
    660   1.1  mrg     }
    661   1.1  mrg 
    662   1.1  mrg   *rp = r;
    663   1.1  mrg   return q;
    664   1.8  mrg }
    665   1.8  mrg #else
    666   1.1  mrg /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv.  */
    667   1.1  mrg UWtype
    668   1.1  mrg __udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)),
    669   1.1  mrg 	       UWtype a1 __attribute__ ((__unused__)),
    670   1.1  mrg 	       UWtype a0 __attribute__ ((__unused__)),
    671   1.1  mrg 	       UWtype d __attribute__ ((__unused__)))
    672   1.1  mrg {
    673   1.1  mrg   return 0;
    674   1.1  mrg }
    675   1.1  mrg #endif
    676   1.1  mrg #endif
    677   1.1  mrg 
    678   1.1  mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
    680   1.1  mrg      defined (L_umoddi3) || defined (L_moddi3) || \
    681   1.1  mrg      defined (L_divmoddi4))
    682   1.1  mrg #define L_udivmoddi4
    683   1.1  mrg #endif
    684   1.1  mrg 
    685   1.1  mrg #ifdef L_clz
    686   1.1  mrg const UQItype __clz_tab[256] =
    687   1.1  mrg {
    688   1.1  mrg   0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
    689   1.1  mrg   6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
    690   1.1  mrg   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
    691   1.1  mrg   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
    692   1.1  mrg   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
    693   1.1  mrg   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
    694   1.1  mrg   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
    695   1.1  mrg   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
    696   1.1  mrg };
    697   1.1  mrg #endif
    698   1.1  mrg 
    699   1.1  mrg #ifdef L_clzsi2
    701   1.1  mrg #undef int
    702   1.1  mrg int
    703   1.1  mrg __clzSI2 (UWtype x)
    704   1.1  mrg {
    705   1.1  mrg   Wtype ret;
    706   1.1  mrg 
    707   1.1  mrg   count_leading_zeros (ret, x);
    708   1.1  mrg 
    709   1.1  mrg   return ret;
    710   1.1  mrg }
    711   1.1  mrg #endif
    712   1.1  mrg 
    713   1.1  mrg #ifdef L_clzdi2
    715   1.1  mrg #undef int
    716   1.1  mrg int
    717   1.1  mrg __clzDI2 (UDWtype x)
    718   1.1  mrg {
    719   1.1  mrg   const DWunion uu = {.ll = x};
    720   1.1  mrg   UWtype word;
    721   1.1  mrg   Wtype ret, add;
    722   1.1  mrg 
    723   1.1  mrg   if (uu.s.high)
    724   1.1  mrg     word = uu.s.high, add = 0;
    725   1.1  mrg   else
    726   1.1  mrg     word = uu.s.low, add = W_TYPE_SIZE;
    727   1.1  mrg 
    728   1.1  mrg   count_leading_zeros (ret, word);
    729   1.1  mrg   return ret + add;
    730   1.1  mrg }
    731   1.1  mrg #endif
    732   1.1  mrg 
    733   1.1  mrg #ifdef L_ctzsi2
    735   1.1  mrg #undef int
    736   1.1  mrg int
    737   1.1  mrg __ctzSI2 (UWtype x)
    738   1.1  mrg {
    739   1.1  mrg   Wtype ret;
    740   1.1  mrg 
    741   1.1  mrg   count_trailing_zeros (ret, x);
    742   1.1  mrg 
    743   1.1  mrg   return ret;
    744   1.1  mrg }
    745   1.1  mrg #endif
    746   1.1  mrg 
    747   1.1  mrg #ifdef L_ctzdi2
    749   1.1  mrg #undef int
    750   1.1  mrg int
    751   1.1  mrg __ctzDI2 (UDWtype x)
    752   1.1  mrg {
    753   1.1  mrg   const DWunion uu = {.ll = x};
    754   1.1  mrg   UWtype word;
    755   1.1  mrg   Wtype ret, add;
    756   1.1  mrg 
    757   1.1  mrg   if (uu.s.low)
    758   1.1  mrg     word = uu.s.low, add = 0;
    759   1.1  mrg   else
    760   1.1  mrg     word = uu.s.high, add = W_TYPE_SIZE;
    761   1.1  mrg 
    762   1.1  mrg   count_trailing_zeros (ret, word);
    763   1.1  mrg   return ret + add;
    764   1.1  mrg }
    765   1.1  mrg #endif
    766   1.1  mrg 
    767   1.1  mrg #ifdef L_clrsbsi2
    769   1.1  mrg #undef int
    770   1.1  mrg int
    771   1.1  mrg __clrsbSI2 (Wtype x)
    772   1.1  mrg {
    773   1.1  mrg   Wtype ret;
    774   1.1  mrg 
    775   1.1  mrg   if (x < 0)
    776   1.1  mrg     x = ~x;
    777   1.1  mrg   if (x == 0)
    778   1.1  mrg     return W_TYPE_SIZE - 1;
    779   1.1  mrg   count_leading_zeros (ret, x);
    780   1.1  mrg   return ret - 1;
    781   1.1  mrg }
    782   1.1  mrg #endif
    783   1.1  mrg 
    784   1.1  mrg #ifdef L_clrsbdi2
    786   1.1  mrg #undef int
    787   1.1  mrg int
    788   1.1  mrg __clrsbDI2 (DWtype x)
    789   1.1  mrg {
    790   1.1  mrg   const DWunion uu = {.ll = x};
    791   1.1  mrg   UWtype word;
    792   1.1  mrg   Wtype ret, add;
    793   1.1  mrg 
    794   1.1  mrg   if (uu.s.high == 0)
    795   1.1  mrg     word = uu.s.low, add = W_TYPE_SIZE;
    796   1.1  mrg   else if (uu.s.high == -1)
    797   1.1  mrg     word = ~uu.s.low, add = W_TYPE_SIZE;
    798   1.1  mrg   else if (uu.s.high >= 0)
    799   1.1  mrg     word = uu.s.high, add = 0;
    800   1.1  mrg   else
    801   1.1  mrg     word = ~uu.s.high, add = 0;
    802   1.1  mrg 
    803   1.1  mrg   if (word == 0)
    804   1.3  mrg     ret = W_TYPE_SIZE;
    805   1.5  mrg   else
    806   1.5  mrg     count_leading_zeros (ret, word);
    807   1.5  mrg 
    808   1.5  mrg   return ret + add - 1;
    809   1.3  mrg }
    810   1.5  mrg #endif
    811   1.3  mrg 
    812   1.5  mrg #ifdef L_popcount_tab
    814   1.5  mrg const UQItype __popcount_tab[256] =
    815   1.3  mrg {
    816   1.3  mrg     0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
    817   1.3  mrg     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    818   1.3  mrg     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    819   1.1  mrg     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    820   1.1  mrg     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    821   1.1  mrg     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    822   1.1  mrg     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    823   1.1  mrg     3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
    824   1.3  mrg };
    825   1.3  mrg #endif
    826   1.3  mrg 
    827   1.5  mrg #if defined(L_popcountsi2) || defined(L_popcountdi2)
    829   1.3  mrg #define POPCOUNTCST2(x) (((UWtype) x << __CHAR_BIT__) | x)
    830   1.3  mrg #define POPCOUNTCST4(x) (((UWtype) x << (2 * __CHAR_BIT__)) | x)
    831   1.5  mrg #define POPCOUNTCST8(x) (((UWtype) x << (4 * __CHAR_BIT__)) | x)
    832   1.3  mrg #if W_TYPE_SIZE == __CHAR_BIT__
    833   1.1  mrg #define POPCOUNTCST(x) x
    834   1.1  mrg #elif W_TYPE_SIZE == 2 * __CHAR_BIT__
    835   1.1  mrg #define POPCOUNTCST(x) POPCOUNTCST2 (x)
    836   1.1  mrg #elif W_TYPE_SIZE == 4 * __CHAR_BIT__
    837   1.1  mrg #define POPCOUNTCST(x) POPCOUNTCST4 (POPCOUNTCST2 (x))
    838   1.1  mrg #elif W_TYPE_SIZE == 8 * __CHAR_BIT__
    839   1.3  mrg #define POPCOUNTCST(x) POPCOUNTCST8 (POPCOUNTCST4 (POPCOUNTCST2 (x)))
    840   1.1  mrg #endif
    841   1.1  mrg #endif
    842   1.1  mrg 
    843   1.1  mrg #ifdef L_popcountsi2
    845   1.1  mrg #undef int
    846   1.1  mrg int
    847   1.1  mrg __popcountSI2 (UWtype x)
    848   1.3  mrg {
    849   1.3  mrg   /* Force table lookup on targets like AVR and RL78 which only
    850   1.3  mrg      pretend they have LIBGCC2_UNITS_PER_WORD 4, but actually
    851   1.5  mrg      have 1, and other small word targets.  */
    852   1.3  mrg #if __SIZEOF_INT__ > 2 && defined (POPCOUNTCST) && __CHAR_BIT__ == 8
    853   1.3  mrg   x = x - ((x >> 1) & POPCOUNTCST (0x55));
    854   1.3  mrg   x = (x & POPCOUNTCST (0x33)) + ((x >> 2) & POPCOUNTCST (0x33));
    855   1.3  mrg   x = (x + (x >> 4)) & POPCOUNTCST (0x0F);
    856   1.3  mrg   return (x * POPCOUNTCST (0x01)) >> (W_TYPE_SIZE - __CHAR_BIT__);
    857   1.3  mrg #else
    858   1.3  mrg   int i, ret = 0;
    859   1.3  mrg 
    860   1.3  mrg   for (i = 0; i < W_TYPE_SIZE; i += 8)
    861   1.5  mrg     ret += __popcount_tab[(x >> i) & 0xff];
    862   1.3  mrg 
    863   1.1  mrg   return ret;
    864   1.1  mrg #endif
    865   1.1  mrg }
    866   1.1  mrg #endif
    867   1.1  mrg 
    868   1.1  mrg #ifdef L_popcountdi2
    870   1.1  mrg #undef int
    871   1.1  mrg int
    872   1.1  mrg __popcountDI2 (UDWtype x)
    873   1.1  mrg {
    874   1.1  mrg   /* Force table lookup on targets like AVR and RL78 which only
    875   1.1  mrg      pretend they have LIBGCC2_UNITS_PER_WORD 4, but actually
    876   1.1  mrg      have 1, and other small word targets.  */
    877   1.1  mrg #if __SIZEOF_INT__ > 2 && defined (POPCOUNTCST) && __CHAR_BIT__ == 8
    878   1.1  mrg   const DWunion uu = {.ll = x};
    879   1.1  mrg   UWtype x1 = uu.s.low, x2 = uu.s.high;
    880   1.1  mrg   x1 = x1 - ((x1 >> 1) & POPCOUNTCST (0x55));
    881   1.1  mrg   x2 = x2 - ((x2 >> 1) & POPCOUNTCST (0x55));
    882   1.1  mrg   x1 = (x1 & POPCOUNTCST (0x33)) + ((x1 >> 2) & POPCOUNTCST (0x33));
    883   1.1  mrg   x2 = (x2 & POPCOUNTCST (0x33)) + ((x2 >> 2) & POPCOUNTCST (0x33));
    884   1.1  mrg   x1 = (x1 + (x1 >> 4)) & POPCOUNTCST (0x0F);
    885   1.1  mrg   x2 = (x2 + (x2 >> 4)) & POPCOUNTCST (0x0F);
    886   1.1  mrg   x1 += x2;
    887   1.1  mrg   return (x1 * POPCOUNTCST (0x01)) >> (W_TYPE_SIZE - __CHAR_BIT__);
    888   1.1  mrg #else
    889   1.1  mrg   int i, ret = 0;
    890   1.1  mrg 
    891   1.1  mrg   for (i = 0; i < 2*W_TYPE_SIZE; i += 8)
    892   1.1  mrg     ret += __popcount_tab[(x >> i) & 0xff];
    893   1.1  mrg 
    894   1.1  mrg   return ret;
    895   1.1  mrg #endif
    896   1.1  mrg }
    897   1.1  mrg #endif
    898   1.1  mrg 
    899   1.1  mrg #ifdef L_paritysi2
    901   1.1  mrg #undef int
    902   1.1  mrg int
    903   1.1  mrg __paritySI2 (UWtype x)
    904   1.1  mrg {
    905   1.1  mrg #if W_TYPE_SIZE > 64
    906   1.1  mrg # error "fill out the table"
    907   1.1  mrg #endif
    908   1.1  mrg #if W_TYPE_SIZE > 32
    909   1.1  mrg   x ^= x >> 32;
    910   1.1  mrg #endif
    911   1.1  mrg #if W_TYPE_SIZE > 16
    912   1.1  mrg   x ^= x >> 16;
    913   1.1  mrg #endif
    914   1.1  mrg   x ^= x >> 8;
    915   1.1  mrg   x ^= x >> 4;
    916   1.1  mrg   x &= 0xf;
    917   1.1  mrg   return (0x6996 >> x) & 1;
    918   1.1  mrg }
    919   1.3  mrg #endif
    920   1.3  mrg 
    921   1.3  mrg #ifdef L_paritydi2
    923   1.8  mrg #undef int
    924   1.3  mrg int
    925   1.3  mrg __parityDI2 (UDWtype x)
    926   1.3  mrg {
    927   1.3  mrg   const DWunion uu = {.ll = x};
    928   1.3  mrg   UWtype nx = uu.s.low ^ uu.s.high;
    929   1.3  mrg 
    930   1.3  mrg #if W_TYPE_SIZE > 64
    931   1.3  mrg # error "fill out the table"
    932   1.3  mrg #endif
    933   1.3  mrg #if W_TYPE_SIZE > 32
    934   1.3  mrg   nx ^= nx >> 32;
    935   1.3  mrg #endif
    936  1.12  mrg #if W_TYPE_SIZE > 16
    937   1.3  mrg   nx ^= nx >> 16;
    938   1.3  mrg #endif
    939   1.3  mrg   nx ^= nx >> 8;
    940   1.3  mrg   nx ^= nx >> 4;
    941   1.3  mrg   nx &= 0xf;
    942   1.3  mrg   return (0x6996 >> nx) & 1;
    943   1.3  mrg }
    944   1.3  mrg #endif
    945   1.3  mrg 
    946   1.3  mrg #ifdef L_udivmoddi4
    947   1.3  mrg #ifdef TARGET_HAS_NO_HW_DIVIDE
    948  1.12  mrg 
    949   1.3  mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
    950   1.3  mrg      defined (L_umoddi3) || defined (L_moddi3) || \
    951   1.3  mrg      defined (L_divmoddi4))
    952   1.3  mrg static inline __attribute__ ((__always_inline__))
    953   1.3  mrg #endif
    954   1.3  mrg UDWtype
    955   1.3  mrg __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
    956   1.3  mrg {
    957   1.3  mrg   UDWtype q = 0, r = n, y = d;
    958   1.3  mrg   UWtype lz1, lz2, i, k;
    959   1.3  mrg 
    960   1.3  mrg   /* Implements align divisor shift dividend method. This algorithm
    961   1.3  mrg      aligns the divisor under the dividend and then perform number of
    962   1.3  mrg      test-subtract iterations which shift the dividend left. Number of
    963   1.3  mrg      iterations is k + 1 where k is the number of bit positions the
    964   1.3  mrg      divisor must be shifted left to align it under the dividend.
    965   1.3  mrg      quotient bits can be saved in the rightmost positions of the dividend
    966   1.3  mrg      as it shifts left on each test-subtract iteration. */
    967   1.3  mrg 
    968   1.3  mrg   if (y <= r)
    969   1.3  mrg     {
    970   1.3  mrg       lz1 = __builtin_clzll (d);
    971   1.3  mrg       lz2 = __builtin_clzll (n);
    972   1.3  mrg 
    973   1.3  mrg       k = lz1 - lz2;
    974   1.3  mrg       y = (y << k);
    975   1.3  mrg 
    976   1.3  mrg       /* Dividend can exceed 2 ^ (width - 1) - 1 but still be less than the
    977   1.3  mrg 	 aligned divisor. Normal iteration can drops the high order bit
    978   1.3  mrg 	 of the dividend. Therefore, first test-subtract iteration is a
    979   1.3  mrg 	 special case, saving its quotient bit in a separate location and
    980   1.3  mrg 	 not shifting the dividend. */
    981   1.3  mrg       if (r >= y)
    982   1.3  mrg 	{
    983   1.3  mrg 	  r = r - y;
    984   1.3  mrg 	  q =  (1ULL << k);
    985   1.3  mrg 	}
    986   1.3  mrg 
    987   1.3  mrg       if (k > 0)
    988   1.1  mrg 	{
    989   1.1  mrg 	  y = y >> 1;
    990   1.8  mrg 
    991   1.8  mrg 	  /* k additional iterations where k regular test subtract shift
    992   1.1  mrg 	    dividend iterations are done.  */
    993   1.1  mrg 	  i = k;
    994   1.1  mrg 	  do
    995   1.1  mrg 	    {
    996   1.1  mrg 	      if (r >= y)
    997   1.1  mrg 		r = ((r - y) << 1) + 1;
    998   1.1  mrg 	      else
    999   1.1  mrg 		r =  (r << 1);
   1000   1.1  mrg 	      i = i - 1;
   1001   1.1  mrg 	    } while (i != 0);
   1002   1.1  mrg 
   1003   1.1  mrg 	  /* First quotient bit is combined with the quotient bits resulting
   1004   1.1  mrg 	     from the k regular iterations.  */
   1005   1.1  mrg 	  q = q + r;
   1006   1.1  mrg 	  r = r >> k;
   1007   1.1  mrg 	  q = q - (r << k);
   1008   1.1  mrg 	}
   1009   1.1  mrg     }
   1010   1.1  mrg 
   1011   1.1  mrg   if (rp)
   1012   1.1  mrg     *rp = r;
   1013   1.1  mrg   return q;
   1014   1.1  mrg }
   1015   1.1  mrg #else
   1016   1.1  mrg 
   1017   1.1  mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
   1018   1.1  mrg      defined (L_umoddi3) || defined (L_moddi3) || \
   1019   1.1  mrg      defined (L_divmoddi4))
   1020   1.1  mrg static inline __attribute__ ((__always_inline__))
   1021   1.1  mrg #endif
   1022   1.1  mrg UDWtype
   1023   1.1  mrg __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
   1024   1.1  mrg {
   1025   1.1  mrg   const DWunion nn = {.ll = n};
   1026   1.1  mrg   const DWunion dd = {.ll = d};
   1027   1.1  mrg   DWunion rr;
   1028   1.1  mrg   UWtype d0, d1, n0, n1, n2;
   1029   1.1  mrg   UWtype q0, q1;
   1030   1.1  mrg   UWtype b, bm;
   1031   1.1  mrg 
   1032   1.1  mrg   d0 = dd.s.low;
   1033   1.1  mrg   d1 = dd.s.high;
   1034   1.1  mrg   n0 = nn.s.low;
   1035   1.1  mrg   n1 = nn.s.high;
   1036   1.1  mrg 
   1037   1.1  mrg #if !UDIV_NEEDS_NORMALIZATION
   1038   1.1  mrg   if (d1 == 0)
   1039   1.1  mrg     {
   1040   1.1  mrg       if (d0 > n1)
   1041   1.1  mrg 	{
   1042   1.1  mrg 	  /* 0q = nn / 0D */
   1043   1.1  mrg 
   1044   1.1  mrg 	  udiv_qrnnd (q0, n0, n1, n0, d0);
   1045   1.1  mrg 	  q1 = 0;
   1046   1.1  mrg 
   1047   1.1  mrg 	  /* Remainder in n0.  */
   1048   1.1  mrg 	}
   1049   1.1  mrg       else
   1050   1.1  mrg 	{
   1051   1.1  mrg 	  /* qq = NN / 0d */
   1052   1.1  mrg 
   1053   1.1  mrg 	  if (d0 == 0)
   1054   1.1  mrg 	    d0 = 1 / d0;	/* Divide intentionally by zero.  */
   1055   1.1  mrg 
   1056   1.1  mrg 	  udiv_qrnnd (q1, n1, 0, n1, d0);
   1057   1.1  mrg 	  udiv_qrnnd (q0, n0, n1, n0, d0);
   1058   1.1  mrg 
   1059   1.1  mrg 	  /* Remainder in n0.  */
   1060   1.1  mrg 	}
   1061   1.1  mrg 
   1062   1.1  mrg       if (rp != 0)
   1063   1.1  mrg 	{
   1064   1.1  mrg 	  rr.s.low = n0;
   1065   1.1  mrg 	  rr.s.high = 0;
   1066   1.1  mrg 	  *rp = rr.ll;
   1067   1.1  mrg 	}
   1068   1.1  mrg     }
   1069   1.1  mrg 
   1070   1.1  mrg #else /* UDIV_NEEDS_NORMALIZATION */
   1071   1.1  mrg 
   1072   1.1  mrg   if (d1 == 0)
   1073   1.1  mrg     {
   1074   1.1  mrg       if (d0 > n1)
   1075   1.1  mrg 	{
   1076   1.1  mrg 	  /* 0q = nn / 0D */
   1077   1.1  mrg 
   1078   1.1  mrg 	  count_leading_zeros (bm, d0);
   1079   1.1  mrg 
   1080   1.1  mrg 	  if (bm != 0)
   1081   1.1  mrg 	    {
   1082   1.1  mrg 	      /* Normalize, i.e. make the most significant bit of the
   1083   1.1  mrg 		 denominator set.  */
   1084   1.1  mrg 
   1085   1.1  mrg 	      d0 = d0 << bm;
   1086   1.1  mrg 	      n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
   1087   1.1  mrg 	      n0 = n0 << bm;
   1088   1.1  mrg 	    }
   1089   1.1  mrg 
   1090   1.1  mrg 	  udiv_qrnnd (q0, n0, n1, n0, d0);
   1091   1.1  mrg 	  q1 = 0;
   1092   1.1  mrg 
   1093   1.1  mrg 	  /* Remainder in n0 >> bm.  */
   1094   1.1  mrg 	}
   1095   1.1  mrg       else
   1096   1.1  mrg 	{
   1097   1.1  mrg 	  /* qq = NN / 0d */
   1098   1.1  mrg 
   1099   1.1  mrg 	  if (d0 == 0)
   1100   1.1  mrg 	    d0 = 1 / d0;	/* Divide intentionally by zero.  */
   1101   1.1  mrg 
   1102   1.1  mrg 	  count_leading_zeros (bm, d0);
   1103   1.1  mrg 
   1104   1.1  mrg 	  if (bm == 0)
   1105   1.1  mrg 	    {
   1106   1.1  mrg 	      /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
   1107   1.1  mrg 		 conclude (the most significant bit of n1 is set) /\ (the
   1108   1.1  mrg 		 leading quotient digit q1 = 1).
   1109   1.1  mrg 
   1110   1.1  mrg 		 This special case is necessary, not an optimization.
   1111   1.1  mrg 		 (Shifts counts of W_TYPE_SIZE are undefined.)  */
   1112   1.1  mrg 
   1113   1.1  mrg 	      n1 -= d0;
   1114   1.1  mrg 	      q1 = 1;
   1115   1.1  mrg 	    }
   1116   1.1  mrg 	  else
   1117   1.1  mrg 	    {
   1118   1.1  mrg 	      /* Normalize.  */
   1119   1.1  mrg 
   1120   1.1  mrg 	      b = W_TYPE_SIZE - bm;
   1121   1.1  mrg 
   1122   1.1  mrg 	      d0 = d0 << bm;
   1123   1.1  mrg 	      n2 = n1 >> b;
   1124   1.1  mrg 	      n1 = (n1 << bm) | (n0 >> b);
   1125   1.1  mrg 	      n0 = n0 << bm;
   1126   1.1  mrg 
   1127   1.1  mrg 	      udiv_qrnnd (q1, n1, n2, n1, d0);
   1128   1.1  mrg 	    }
   1129   1.1  mrg 
   1130   1.1  mrg 	  /* n1 != d0...  */
   1131   1.1  mrg 
   1132   1.1  mrg 	  udiv_qrnnd (q0, n0, n1, n0, d0);
   1133   1.1  mrg 
   1134   1.1  mrg 	  /* Remainder in n0 >> bm.  */
   1135   1.1  mrg 	}
   1136   1.1  mrg 
   1137   1.1  mrg       if (rp != 0)
   1138   1.1  mrg 	{
   1139   1.1  mrg 	  rr.s.low = n0 >> bm;
   1140   1.1  mrg 	  rr.s.high = 0;
   1141   1.1  mrg 	  *rp = rr.ll;
   1142   1.1  mrg 	}
   1143   1.1  mrg     }
   1144   1.1  mrg #endif /* UDIV_NEEDS_NORMALIZATION */
   1145   1.1  mrg 
   1146   1.1  mrg   else
   1147   1.1  mrg     {
   1148   1.1  mrg       if (d1 > n1)
   1149   1.1  mrg 	{
   1150   1.1  mrg 	  /* 00 = nn / DD */
   1151   1.1  mrg 
   1152   1.1  mrg 	  q0 = 0;
   1153   1.1  mrg 	  q1 = 0;
   1154   1.1  mrg 
   1155   1.1  mrg 	  /* Remainder in n1n0.  */
   1156   1.1  mrg 	  if (rp != 0)
   1157   1.1  mrg 	    {
   1158   1.1  mrg 	      rr.s.low = n0;
   1159   1.1  mrg 	      rr.s.high = n1;
   1160   1.1  mrg 	      *rp = rr.ll;
   1161   1.1  mrg 	    }
   1162   1.1  mrg 	}
   1163   1.1  mrg       else
   1164   1.1  mrg 	{
   1165   1.1  mrg 	  /* 0q = NN / dd */
   1166   1.1  mrg 
   1167   1.1  mrg 	  count_leading_zeros (bm, d1);
   1168   1.1  mrg 	  if (bm == 0)
   1169   1.1  mrg 	    {
   1170   1.1  mrg 	      /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
   1171   1.1  mrg 		 conclude (the most significant bit of n1 is set) /\ (the
   1172   1.1  mrg 		 quotient digit q0 = 0 or 1).
   1173   1.1  mrg 
   1174   1.1  mrg 		 This special case is necessary, not an optimization.  */
   1175   1.1  mrg 
   1176   1.1  mrg 	      /* The condition on the next line takes advantage of that
   1177   1.1  mrg 		 n1 >= d1 (true due to program flow).  */
   1178   1.1  mrg 	      if (n1 > d1 || n0 >= d0)
   1179   1.1  mrg 		{
   1180   1.1  mrg 		  q0 = 1;
   1181   1.1  mrg 		  sub_ddmmss (n1, n0, n1, n0, d1, d0);
   1182   1.1  mrg 		}
   1183   1.1  mrg 	      else
   1184   1.1  mrg 		q0 = 0;
   1185   1.1  mrg 
   1186   1.1  mrg 	      q1 = 0;
   1187   1.1  mrg 
   1188   1.1  mrg 	      if (rp != 0)
   1189   1.1  mrg 		{
   1190   1.1  mrg 		  rr.s.low = n0;
   1191   1.1  mrg 		  rr.s.high = n1;
   1192   1.1  mrg 		  *rp = rr.ll;
   1193   1.1  mrg 		}
   1194   1.1  mrg 	    }
   1195   1.1  mrg 	  else
   1196   1.1  mrg 	    {
   1197   1.1  mrg 	      UWtype m1, m0;
   1198   1.1  mrg 	      /* Normalize.  */
   1199   1.1  mrg 
   1200   1.1  mrg 	      b = W_TYPE_SIZE - bm;
   1201   1.1  mrg 
   1202   1.1  mrg 	      d1 = (d1 << bm) | (d0 >> b);
   1203   1.1  mrg 	      d0 = d0 << bm;
   1204   1.1  mrg 	      n2 = n1 >> b;
   1205   1.1  mrg 	      n1 = (n1 << bm) | (n0 >> b);
   1206   1.1  mrg 	      n0 = n0 << bm;
   1207   1.3  mrg 
   1208   1.1  mrg 	      udiv_qrnnd (q0, n1, n2, n1, d1);
   1209   1.1  mrg 	      umul_ppmm (m1, m0, q0, d0);
   1210   1.1  mrg 
   1211   1.1  mrg 	      if (m1 > n1 || (m1 == n1 && m0 > n0))
   1212   1.1  mrg 		{
   1213   1.1  mrg 		  q0--;
   1214   1.1  mrg 		  sub_ddmmss (m1, m0, m1, m0, d1, d0);
   1215   1.1  mrg 		}
   1216   1.1  mrg 
   1217   1.1  mrg 	      q1 = 0;
   1218   1.1  mrg 
   1219   1.1  mrg 	      /* Remainder in (n1n0 - m1m0) >> bm.  */
   1220   1.1  mrg 	      if (rp != 0)
   1221   1.1  mrg 		{
   1222   1.1  mrg 		  sub_ddmmss (n1, n0, n1, n0, m1, m0);
   1223   1.1  mrg 		  rr.s.low = (n1 << b) | (n0 >> bm);
   1224   1.1  mrg 		  rr.s.high = n1 >> bm;
   1225   1.1  mrg 		  *rp = rr.ll;
   1226   1.1  mrg 		}
   1227   1.1  mrg 	    }
   1228   1.1  mrg 	}
   1229   1.1  mrg     }
   1230   1.1  mrg 
   1231   1.1  mrg   const DWunion ww = {{.low = q0, .high = q1}};
   1232   1.1  mrg   return ww.ll;
   1233   1.1  mrg }
   1234   1.1  mrg #endif
   1235   1.1  mrg #endif
   1236   1.1  mrg 
   1237   1.1  mrg #ifdef L_divdi3
   1238   1.1  mrg DWtype
   1239   1.1  mrg __divdi3 (DWtype u, DWtype v)
   1240   1.1  mrg {
   1241   1.1  mrg   Wtype c = 0;
   1242   1.1  mrg   DWunion uu = {.ll = u};
   1243   1.1  mrg   DWunion vv = {.ll = v};
   1244   1.1  mrg   DWtype w;
   1245   1.1  mrg 
   1246   1.1  mrg   if (uu.s.high < 0)
   1247   1.1  mrg     c = ~c,
   1248   1.1  mrg     uu.ll = -uu.ll;
   1249   1.1  mrg   if (vv.s.high < 0)
   1250   1.1  mrg     c = ~c,
   1251   1.1  mrg     vv.ll = -vv.ll;
   1252   1.1  mrg 
   1253   1.1  mrg   w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
   1254   1.1  mrg   if (c)
   1255   1.1  mrg     w = -w;
   1256   1.8  mrg 
   1257   1.8  mrg   return w;
   1258   1.8  mrg }
   1259   1.8  mrg #endif
   1260   1.8  mrg 
   1261   1.8  mrg #ifdef L_moddi3
   1262   1.8  mrg DWtype
   1263   1.8  mrg __moddi3 (DWtype u, DWtype v)
   1264   1.8  mrg {
   1265   1.8  mrg   Wtype c = 0;
   1266   1.8  mrg   DWunion uu = {.ll = u};
   1267   1.8  mrg   DWunion vv = {.ll = v};
   1268   1.8  mrg   DWtype w;
   1269   1.8  mrg 
   1270   1.8  mrg   if (uu.s.high < 0)
   1271   1.8  mrg     c = ~c,
   1272   1.8  mrg     uu.ll = -uu.ll;
   1273   1.8  mrg   if (vv.s.high < 0)
   1274   1.8  mrg     vv.ll = -vv.ll;
   1275   1.8  mrg 
   1276   1.8  mrg   (void) __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&w);
   1277   1.8  mrg   if (c)
   1278   1.8  mrg     w = -w;
   1279   1.8  mrg 
   1280   1.8  mrg   return w;
   1281   1.8  mrg }
   1282   1.8  mrg #endif
   1283   1.8  mrg 
   1284   1.1  mrg #ifdef L_divmoddi4
   1285   1.1  mrg DWtype
   1286   1.1  mrg __divmoddi4 (DWtype u, DWtype v, DWtype *rp)
   1287   1.1  mrg {
   1288   1.1  mrg   Wtype c1 = 0, c2 = 0;
   1289   1.1  mrg   DWunion uu = {.ll = u};
   1290   1.1  mrg   DWunion vv = {.ll = v};
   1291   1.1  mrg   DWtype w;
   1292   1.1  mrg   DWtype r;
   1293   1.1  mrg 
   1294   1.1  mrg   if (uu.s.high < 0)
   1295   1.1  mrg     c1 = ~c1, c2 = ~c2,
   1296   1.1  mrg     uu.ll = -uu.ll;
   1297   1.1  mrg   if (vv.s.high < 0)
   1298   1.1  mrg     c1 = ~c1,
   1299   1.1  mrg     vv.ll = -vv.ll;
   1300   1.1  mrg 
   1301   1.1  mrg   w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&r);
   1302   1.1  mrg   if (c1)
   1303   1.1  mrg     w = -w;
   1304   1.1  mrg   if (c2)
   1305   1.1  mrg     r = -r;
   1306   1.1  mrg 
   1307   1.1  mrg   *rp = r;
   1308  1.12  mrg   return w;
   1309   1.1  mrg }
   1310   1.1  mrg #endif
   1311   1.1  mrg 
   1312   1.1  mrg #ifdef L_umoddi3
   1313   1.1  mrg UDWtype
   1314  1.12  mrg __umoddi3 (UDWtype u, UDWtype v)
   1315   1.1  mrg {
   1316  1.12  mrg   UDWtype w;
   1317   1.1  mrg 
   1318   1.1  mrg   (void) __udivmoddi4 (u, v, &w);
   1319   1.1  mrg 
   1320   1.1  mrg   return w;
   1321   1.1  mrg }
   1322   1.1  mrg #endif
   1323   1.1  mrg 
   1324   1.1  mrg #ifdef L_udivdi3
   1325   1.1  mrg UDWtype
   1326   1.1  mrg __udivdi3 (UDWtype n, UDWtype d)
   1327   1.1  mrg {
   1328   1.1  mrg   return __udivmoddi4 (n, d, (UDWtype *) 0);
   1329   1.1  mrg }
   1330   1.1  mrg #endif
   1331   1.1  mrg 
   1332   1.1  mrg #ifdef L_cmpdi2
   1334   1.1  mrg cmp_return_type
   1335   1.1  mrg __cmpdi2 (DWtype a, DWtype b)
   1336   1.1  mrg {
   1337   1.1  mrg   return (a > b) - (a < b) + 1;
   1338   1.1  mrg }
   1339   1.1  mrg #endif
   1340   1.1  mrg 
   1341   1.1  mrg #ifdef L_ucmpdi2
   1342   1.1  mrg cmp_return_type
   1343   1.1  mrg __ucmpdi2 (UDWtype a, UDWtype b)
   1344   1.1  mrg {
   1345   1.1  mrg   return (a > b) - (a < b) + 1;
   1346   1.1  mrg }
   1347   1.1  mrg #endif
   1348   1.1  mrg 
   1349   1.1  mrg #if defined(L_fixunstfdi) && LIBGCC2_HAS_TF_MODE
   1351   1.1  mrg UDWtype
   1352   1.1  mrg __fixunstfDI (TFtype a)
   1353   1.1  mrg {
   1354   1.1  mrg   if (a < 0)
   1355   1.1  mrg     return 0;
   1356   1.1  mrg 
   1357   1.1  mrg   /* Compute high word of result, as a flonum.  */
   1358   1.1  mrg   const TFtype b = (a / Wtype_MAXp1_F);
   1359   1.1  mrg   /* Convert that to fixed (but not to DWtype!),
   1360   1.1  mrg      and shift it into the high word.  */
   1361   1.1  mrg   UDWtype v = (UWtype) b;
   1362   1.1  mrg   v <<= W_TYPE_SIZE;
   1363   1.1  mrg   /* Remove high part from the TFtype, leaving the low part as flonum.  */
   1364   1.1  mrg   a -= (TFtype)v;
   1365   1.1  mrg   /* Convert that to fixed (but not to DWtype!) and add it in.
   1366   1.1  mrg      Sometimes A comes out negative.  This is significant, since
   1367   1.1  mrg      A has more bits than a long int does.  */
   1368   1.1  mrg   if (a < 0)
   1369   1.1  mrg     v -= (UWtype) (- a);
   1370   1.1  mrg   else
   1371   1.1  mrg     v += (UWtype) a;
   1372   1.1  mrg   return v;
   1373   1.1  mrg }
   1374   1.1  mrg #endif
   1375   1.1  mrg 
   1376   1.1  mrg #if defined(L_fixtfdi) && LIBGCC2_HAS_TF_MODE
   1377   1.1  mrg DWtype
   1378   1.1  mrg __fixtfdi (TFtype a)
   1379   1.1  mrg {
   1380   1.1  mrg   if (a < 0)
   1381   1.1  mrg     return - __fixunstfDI (-a);
   1382   1.1  mrg   return __fixunstfDI (a);
   1383   1.1  mrg }
   1384   1.1  mrg #endif
   1385   1.1  mrg 
   1386   1.1  mrg #if defined(L_fixunsxfdi) && LIBGCC2_HAS_XF_MODE
   1387   1.1  mrg UDWtype
   1388   1.1  mrg __fixunsxfDI (XFtype a)
   1389   1.1  mrg {
   1390   1.1  mrg   if (a < 0)
   1391   1.1  mrg     return 0;
   1392   1.1  mrg 
   1393   1.1  mrg   /* Compute high word of result, as a flonum.  */
   1394   1.1  mrg   const XFtype b = (a / Wtype_MAXp1_F);
   1395   1.1  mrg   /* Convert that to fixed (but not to DWtype!),
   1396   1.1  mrg      and shift it into the high word.  */
   1397   1.1  mrg   UDWtype v = (UWtype) b;
   1398   1.1  mrg   v <<= W_TYPE_SIZE;
   1399   1.1  mrg   /* Remove high part from the XFtype, leaving the low part as flonum.  */
   1400   1.1  mrg   a -= (XFtype)v;
   1401   1.1  mrg   /* Convert that to fixed (but not to DWtype!) and add it in.
   1402   1.1  mrg      Sometimes A comes out negative.  This is significant, since
   1403   1.1  mrg      A has more bits than a long int does.  */
   1404   1.1  mrg   if (a < 0)
   1405   1.1  mrg     v -= (UWtype) (- a);
   1406   1.1  mrg   else
   1407   1.1  mrg     v += (UWtype) a;
   1408   1.1  mrg   return v;
   1409   1.1  mrg }
   1410   1.1  mrg #endif
   1411   1.1  mrg 
   1412   1.1  mrg #if defined(L_fixxfdi) && LIBGCC2_HAS_XF_MODE
   1413   1.1  mrg DWtype
   1414   1.1  mrg __fixxfdi (XFtype a)
   1415   1.1  mrg {
   1416   1.1  mrg   if (a < 0)
   1417   1.1  mrg     return - __fixunsxfDI (-a);
   1418   1.1  mrg   return __fixunsxfDI (a);
   1419   1.1  mrg }
   1420   1.1  mrg #endif
   1421   1.1  mrg 
   1422   1.1  mrg #if defined(L_fixunsdfdi) && LIBGCC2_HAS_DF_MODE
   1423   1.1  mrg UDWtype
   1424   1.1  mrg __fixunsdfDI (DFtype a)
   1425   1.1  mrg {
   1426   1.1  mrg   /* Get high part of result.  The division here will just moves the radix
   1427   1.1  mrg      point and will not cause any rounding.  Then the conversion to integral
   1428   1.1  mrg      type chops result as desired.  */
   1429   1.1  mrg   const UWtype hi = a / Wtype_MAXp1_F;
   1430   1.1  mrg 
   1431   1.1  mrg   /* Get low part of result.  Convert `hi' to floating type and scale it back,
   1432   1.1  mrg      then subtract this from the number being converted.  This leaves the low
   1433   1.1  mrg      part.  Convert that to integral type.  */
   1434   1.1  mrg   const UWtype lo = a - (DFtype) hi * Wtype_MAXp1_F;
   1435   1.1  mrg 
   1436   1.1  mrg   /* Assemble result from the two parts.  */
   1437   1.1  mrg   return ((UDWtype) hi << W_TYPE_SIZE) | lo;
   1438   1.1  mrg }
   1439   1.1  mrg #endif
   1440   1.1  mrg 
   1441   1.1  mrg #if defined(L_fixdfdi) && LIBGCC2_HAS_DF_MODE
   1442   1.1  mrg DWtype
   1443   1.1  mrg __fixdfdi (DFtype a)
   1444   1.1  mrg {
   1445   1.1  mrg   if (a < 0)
   1446   1.1  mrg     return - __fixunsdfDI (-a);
   1447   1.1  mrg   return __fixunsdfDI (a);
   1448   1.1  mrg }
   1449   1.1  mrg #endif
   1450   1.1  mrg 
   1451   1.1  mrg #if defined(L_fixunssfdi) && LIBGCC2_HAS_SF_MODE
   1452   1.1  mrg UDWtype
   1453   1.1  mrg __fixunssfDI (SFtype a)
   1454   1.1  mrg {
   1455   1.1  mrg #if LIBGCC2_HAS_DF_MODE
   1456   1.1  mrg   /* Convert the SFtype to a DFtype, because that is surely not going
   1457   1.1  mrg      to lose any bits.  Some day someone else can write a faster version
   1458   1.1  mrg      that avoids converting to DFtype, and verify it really works right.  */
   1459   1.1  mrg   const DFtype dfa = a;
   1460   1.1  mrg 
   1461   1.1  mrg   /* Get high part of result.  The division here will just moves the radix
   1462   1.1  mrg      point and will not cause any rounding.  Then the conversion to integral
   1463   1.1  mrg      type chops result as desired.  */
   1464   1.1  mrg   const UWtype hi = dfa / Wtype_MAXp1_F;
   1465   1.1  mrg 
   1466   1.1  mrg   /* Get low part of result.  Convert `hi' to floating type and scale it back,
   1467   1.1  mrg      then subtract this from the number being converted.  This leaves the low
   1468   1.1  mrg      part.  Convert that to integral type.  */
   1469   1.1  mrg   const UWtype lo = dfa - (DFtype) hi * Wtype_MAXp1_F;
   1470   1.1  mrg 
   1471   1.1  mrg   /* Assemble result from the two parts.  */
   1472   1.1  mrg   return ((UDWtype) hi << W_TYPE_SIZE) | lo;
   1473   1.1  mrg #elif FLT_MANT_DIG < W_TYPE_SIZE
   1474   1.1  mrg   if (a < 1)
   1475   1.1  mrg     return 0;
   1476   1.1  mrg   if (a < Wtype_MAXp1_F)
   1477   1.1  mrg     return (UWtype)a;
   1478   1.1  mrg   if (a < Wtype_MAXp1_F * Wtype_MAXp1_F)
   1479   1.1  mrg     {
   1480   1.1  mrg       /* Since we know that there are fewer significant bits in the SFmode
   1481   1.1  mrg 	 quantity than in a word, we know that we can convert out all the
   1482   1.1  mrg 	 significant bits in one step, and thus avoid losing bits.  */
   1483   1.1  mrg 
   1484   1.1  mrg       /* ??? This following loop essentially performs frexpf.  If we could
   1485   1.1  mrg 	 use the real libm function, or poke at the actual bits of the fp
   1486   1.1  mrg 	 format, it would be significantly faster.  */
   1487   1.1  mrg 
   1488   1.1  mrg       UWtype shift = 0, counter;
   1489   1.1  mrg       SFtype msb;
   1490   1.1  mrg 
   1491   1.1  mrg       a /= Wtype_MAXp1_F;
   1492   1.1  mrg       for (counter = W_TYPE_SIZE / 2; counter != 0; counter >>= 1)
   1493   1.1  mrg 	{
   1494   1.1  mrg 	  SFtype counterf = (UWtype)1 << counter;
   1495   1.1  mrg 	  if (a >= counterf)
   1496   1.1  mrg 	    {
   1497   1.1  mrg 	      shift |= counter;
   1498   1.1  mrg 	      a /= counterf;
   1499   1.3  mrg 	    }
   1500   1.1  mrg 	}
   1501   1.1  mrg 
   1502   1.1  mrg       /* Rescale into the range of one word, extract the bits of that
   1503   1.1  mrg 	 one word, and shift the result into position.  */
   1504   1.1  mrg       a *= Wtype_MAXp1_F;
   1505   1.1  mrg       counter = a;
   1506   1.1  mrg       return (DWtype)counter << shift;
   1507   1.1  mrg     }
   1508   1.1  mrg   return -1;
   1509   1.1  mrg #else
   1510   1.1  mrg # error
   1511   1.1  mrg #endif
   1512   1.1  mrg }
   1513   1.3  mrg #endif
   1514   1.1  mrg 
   1515   1.1  mrg #if defined(L_fixsfdi) && LIBGCC2_HAS_SF_MODE
   1516   1.1  mrg DWtype
   1517   1.1  mrg __fixsfdi (SFtype a)
   1518   1.1  mrg {
   1519   1.1  mrg   if (a < 0)
   1520   1.1  mrg     return - __fixunssfDI (-a);
   1521   1.1  mrg   return __fixunssfDI (a);
   1522   1.1  mrg }
   1523   1.1  mrg #endif
   1524   1.1  mrg 
   1525   1.1  mrg #if defined(L_floatdixf) && LIBGCC2_HAS_XF_MODE
   1526   1.1  mrg XFtype
   1527   1.3  mrg __floatdixf (DWtype u)
   1528   1.1  mrg {
   1529   1.1  mrg #if W_TYPE_SIZE > __LIBGCC_XF_MANT_DIG__
   1530   1.1  mrg # error
   1531   1.1  mrg #endif
   1532   1.1  mrg   XFtype d = (Wtype) (u >> W_TYPE_SIZE);
   1533   1.1  mrg   d *= Wtype_MAXp1_F;
   1534   1.1  mrg   d += (UWtype)u;
   1535   1.1  mrg   return d;
   1536   1.1  mrg }
   1537   1.1  mrg #endif
   1538   1.1  mrg 
   1539   1.1  mrg #if defined(L_floatundixf) && LIBGCC2_HAS_XF_MODE
   1540   1.1  mrg XFtype
   1541   1.3  mrg __floatundixf (UDWtype u)
   1542   1.1  mrg {
   1543   1.1  mrg #if W_TYPE_SIZE > __LIBGCC_XF_MANT_DIG__
   1544   1.1  mrg # error
   1545   1.1  mrg #endif
   1546   1.1  mrg   XFtype d = (UWtype) (u >> W_TYPE_SIZE);
   1547   1.1  mrg   d *= Wtype_MAXp1_F;
   1548   1.1  mrg   d += (UWtype)u;
   1549   1.1  mrg   return d;
   1550   1.1  mrg }
   1551   1.1  mrg #endif
   1552   1.1  mrg 
   1553   1.1  mrg #if defined(L_floatditf) && LIBGCC2_HAS_TF_MODE
   1554   1.1  mrg TFtype
   1555   1.1  mrg __floatditf (DWtype u)
   1556   1.1  mrg {
   1557   1.1  mrg #if W_TYPE_SIZE > __LIBGCC_TF_MANT_DIG__
   1558   1.1  mrg # error
   1559   1.1  mrg #endif
   1560   1.1  mrg   TFtype d = (Wtype) (u >> W_TYPE_SIZE);
   1561   1.3  mrg   d *= Wtype_MAXp1_F;
   1562   1.1  mrg   d += (UWtype)u;
   1563   1.1  mrg   return d;
   1564   1.1  mrg }
   1565   1.3  mrg #endif
   1566   1.1  mrg 
   1567   1.1  mrg #if defined(L_floatunditf) && LIBGCC2_HAS_TF_MODE
   1568   1.1  mrg TFtype
   1569   1.1  mrg __floatunditf (UDWtype u)
   1570   1.1  mrg {
   1571   1.1  mrg #if W_TYPE_SIZE > __LIBGCC_TF_MANT_DIG__
   1572   1.1  mrg # error
   1573   1.1  mrg #endif
   1574   1.1  mrg   TFtype d = (UWtype) (u >> W_TYPE_SIZE);
   1575   1.1  mrg   d *= Wtype_MAXp1_F;
   1576   1.1  mrg   d += (UWtype)u;
   1577   1.3  mrg   return d;
   1578   1.3  mrg }
   1579   1.3  mrg #endif
   1580   1.1  mrg 
   1581   1.3  mrg #if (defined(L_floatdisf) && LIBGCC2_HAS_SF_MODE)	\
   1582   1.3  mrg      || (defined(L_floatdidf) && LIBGCC2_HAS_DF_MODE)
   1583   1.1  mrg #define DI_SIZE (W_TYPE_SIZE * 2)
   1584   1.3  mrg #define F_MODE_OK(SIZE) \
   1585   1.3  mrg   (SIZE < DI_SIZE							\
   1586   1.1  mrg    && SIZE > (DI_SIZE - SIZE + FSSIZE)					\
   1587   1.3  mrg    && !AVOID_FP_TYPE_CONVERSION(SIZE))
   1588   1.3  mrg #if defined(L_floatdisf)
   1589   1.1  mrg #define FUNC __floatdisf
   1590   1.1  mrg #define FSTYPE SFtype
   1591   1.1  mrg #define FSSIZE __LIBGCC_SF_MANT_DIG__
   1592   1.1  mrg #else
   1593   1.1  mrg #define FUNC __floatdidf
   1594   1.1  mrg #define FSTYPE DFtype
   1595   1.1  mrg #define FSSIZE __LIBGCC_DF_MANT_DIG__
   1596   1.1  mrg #endif
   1597   1.1  mrg 
   1598   1.1  mrg FSTYPE
   1599   1.1  mrg FUNC (DWtype u)
   1600   1.1  mrg {
   1601   1.1  mrg #if FSSIZE >= W_TYPE_SIZE
   1602   1.1  mrg   /* When the word size is small, we never get any rounding error.  */
   1603   1.1  mrg   FSTYPE f = (Wtype) (u >> W_TYPE_SIZE);
   1604   1.1  mrg   f *= Wtype_MAXp1_F;
   1605   1.1  mrg   f += (UWtype)u;
   1606   1.1  mrg   return f;
   1607   1.1  mrg #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))	\
   1608   1.1  mrg      || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))	\
   1609   1.1  mrg      || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
   1610   1.1  mrg 
   1611   1.1  mrg #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))
   1612   1.1  mrg # define FSIZE __LIBGCC_DF_MANT_DIG__
   1613   1.1  mrg # define FTYPE DFtype
   1614   1.1  mrg #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))
   1615   1.1  mrg # define FSIZE __LIBGCC_XF_MANT_DIG__
   1616   1.1  mrg # define FTYPE XFtype
   1617   1.1  mrg #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
   1618   1.1  mrg # define FSIZE __LIBGCC_TF_MANT_DIG__
   1619   1.1  mrg # define FTYPE TFtype
   1620   1.1  mrg #else
   1621   1.1  mrg # error
   1622   1.1  mrg #endif
   1623   1.1  mrg 
   1624   1.1  mrg #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE))
   1625   1.1  mrg 
   1626   1.1  mrg   /* Protect against double-rounding error.
   1627   1.1  mrg      Represent any low-order bits, that might be truncated by a bit that
   1628   1.1  mrg      won't be lost.  The bit can go in anywhere below the rounding position
   1629   1.1  mrg      of the FSTYPE.  A fixed mask and bit position handles all usual
   1630   1.1  mrg      configurations.  */
   1631   1.1  mrg   if (! (- ((DWtype) 1 << FSIZE) < u
   1632   1.1  mrg 	 && u < ((DWtype) 1 << FSIZE)))
   1633   1.3  mrg     {
   1634   1.1  mrg       if ((UDWtype) u & (REP_BIT - 1))
   1635   1.1  mrg 	{
   1636   1.8  mrg 	  u &= ~ (REP_BIT - 1);
   1637   1.8  mrg 	  u |= REP_BIT;
   1638   1.8  mrg 	}
   1639   1.8  mrg     }
   1640   1.8  mrg 
   1641   1.1  mrg   /* Do the calculation in a wider type so that we don't lose any of
   1642   1.1  mrg      the precision of the high word while multiplying it.  */
   1643   1.1  mrg   FTYPE f = (Wtype) (u >> W_TYPE_SIZE);
   1644   1.1  mrg   f *= Wtype_MAXp1_F;
   1645  1.10  mrg   f += (UWtype)u;
   1646   1.1  mrg   return (FSTYPE) f;
   1647   1.1  mrg #else
   1648   1.1  mrg #if FSSIZE >= W_TYPE_SIZE - 2
   1649   1.1  mrg # error
   1650   1.1  mrg #endif
   1651   1.1  mrg   /* Finally, the word size is larger than the number of bits in the
   1652   1.1  mrg      required FSTYPE, and we've got no suitable wider type.  The only
   1653   1.1  mrg      way to avoid double rounding is to special case the
   1654   1.1  mrg      extraction.  */
   1655   1.1  mrg 
   1656   1.1  mrg   /* If there are no high bits set, fall back to one conversion.  */
   1657   1.1  mrg   if ((Wtype)u == u)
   1658   1.1  mrg     return (FSTYPE)(Wtype)u;
   1659   1.1  mrg 
   1660   1.1  mrg   /* Otherwise, find the power of two.  */
   1661   1.1  mrg   Wtype hi = u >> W_TYPE_SIZE;
   1662   1.1  mrg   if (hi < 0)
   1663   1.1  mrg     hi = -(UWtype) hi;
   1664   1.1  mrg 
   1665   1.1  mrg   UWtype count, shift;
   1666   1.1  mrg #if !defined (COUNT_LEADING_ZEROS_0) || COUNT_LEADING_ZEROS_0 != W_TYPE_SIZE
   1667   1.1  mrg   if (hi == 0)
   1668   1.1  mrg     count = W_TYPE_SIZE;
   1669   1.1  mrg   else
   1670   1.1  mrg #endif
   1671   1.1  mrg   count_leading_zeros (count, hi);
   1672   1.1  mrg 
   1673   1.1  mrg   /* No leading bits means u == minimum.  */
   1674   1.1  mrg   if (count == 0)
   1675   1.1  mrg     return Wtype_MAXp1_F * (FSTYPE) (hi | ((UWtype) u != 0));
   1676   1.1  mrg 
   1677   1.1  mrg   shift = 1 + W_TYPE_SIZE - count;
   1678   1.1  mrg 
   1679   1.1  mrg   /* Shift down the most significant bits.  */
   1680   1.1  mrg   hi = u >> shift;
   1681   1.1  mrg 
   1682   1.3  mrg   /* If we lost any nonzero bits, set the lsb to ensure correct rounding.  */
   1683   1.1  mrg   if ((UWtype)u << (W_TYPE_SIZE - shift))
   1684   1.1  mrg     hi |= 1;
   1685   1.1  mrg 
   1686   1.3  mrg   /* Convert the one word of data, and rescale.  */
   1687   1.1  mrg   FSTYPE f = hi, e;
   1688   1.1  mrg   if (shift == W_TYPE_SIZE)
   1689   1.1  mrg     e = Wtype_MAXp1_F;
   1690   1.1  mrg   /* The following two cases could be merged if we knew that the target
   1691   1.1  mrg      supported a native unsigned->float conversion.  More often, we only
   1692   1.1  mrg      have a signed conversion, and have to add extra fixup code.  */
   1693   1.1  mrg   else if (shift == W_TYPE_SIZE - 1)
   1694   1.1  mrg     e = Wtype_MAXp1_F / 2;
   1695   1.1  mrg   else
   1696   1.1  mrg     e = (Wtype)1 << shift;
   1697   1.1  mrg   return f * e;
   1698   1.3  mrg #endif
   1699   1.3  mrg }
   1700   1.3  mrg #endif
   1701   1.1  mrg 
   1702   1.3  mrg #if (defined(L_floatundisf) && LIBGCC2_HAS_SF_MODE)	\
   1703   1.3  mrg      || (defined(L_floatundidf) && LIBGCC2_HAS_DF_MODE)
   1704   1.1  mrg #define DI_SIZE (W_TYPE_SIZE * 2)
   1705   1.3  mrg #define F_MODE_OK(SIZE) \
   1706   1.3  mrg   (SIZE < DI_SIZE							\
   1707   1.1  mrg    && SIZE > (DI_SIZE - SIZE + FSSIZE)					\
   1708   1.3  mrg    && !AVOID_FP_TYPE_CONVERSION(SIZE))
   1709   1.3  mrg #if defined(L_floatundisf)
   1710   1.1  mrg #define FUNC __floatundisf
   1711   1.1  mrg #define FSTYPE SFtype
   1712   1.1  mrg #define FSSIZE __LIBGCC_SF_MANT_DIG__
   1713   1.1  mrg #else
   1714   1.1  mrg #define FUNC __floatundidf
   1715   1.1  mrg #define FSTYPE DFtype
   1716   1.1  mrg #define FSSIZE __LIBGCC_DF_MANT_DIG__
   1717   1.1  mrg #endif
   1718   1.1  mrg 
   1719   1.1  mrg FSTYPE
   1720   1.1  mrg FUNC (UDWtype u)
   1721   1.1  mrg {
   1722   1.1  mrg #if FSSIZE >= W_TYPE_SIZE
   1723   1.1  mrg   /* When the word size is small, we never get any rounding error.  */
   1724   1.1  mrg   FSTYPE f = (UWtype) (u >> W_TYPE_SIZE);
   1725   1.1  mrg   f *= Wtype_MAXp1_F;
   1726   1.1  mrg   f += (UWtype)u;
   1727   1.1  mrg   return f;
   1728   1.1  mrg #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))	\
   1729   1.1  mrg      || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))	\
   1730   1.1  mrg      || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
   1731   1.1  mrg 
   1732   1.1  mrg #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))
   1733   1.1  mrg # define FSIZE __LIBGCC_DF_MANT_DIG__
   1734   1.1  mrg # define FTYPE DFtype
   1735   1.1  mrg #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))
   1736   1.1  mrg # define FSIZE __LIBGCC_XF_MANT_DIG__
   1737   1.1  mrg # define FTYPE XFtype
   1738   1.1  mrg #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
   1739   1.1  mrg # define FSIZE __LIBGCC_TF_MANT_DIG__
   1740   1.1  mrg # define FTYPE TFtype
   1741   1.1  mrg #else
   1742   1.1  mrg # error
   1743   1.1  mrg #endif
   1744   1.1  mrg 
   1745   1.1  mrg #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE))
   1746   1.1  mrg 
   1747   1.1  mrg   /* Protect against double-rounding error.
   1748   1.1  mrg      Represent any low-order bits, that might be truncated by a bit that
   1749   1.1  mrg      won't be lost.  The bit can go in anywhere below the rounding position
   1750   1.1  mrg      of the FSTYPE.  A fixed mask and bit position handles all usual
   1751   1.1  mrg      configurations.  */
   1752   1.1  mrg   if (u >= ((UDWtype) 1 << FSIZE))
   1753   1.1  mrg     {
   1754   1.1  mrg       if ((UDWtype) u & (REP_BIT - 1))
   1755   1.1  mrg 	{
   1756   1.1  mrg 	  u &= ~ (REP_BIT - 1);
   1757   1.1  mrg 	  u |= REP_BIT;
   1758   1.1  mrg 	}
   1759   1.1  mrg     }
   1760   1.1  mrg 
   1761   1.1  mrg   /* Do the calculation in a wider type so that we don't lose any of
   1762   1.1  mrg      the precision of the high word while multiplying it.  */
   1763   1.1  mrg   FTYPE f = (UWtype) (u >> W_TYPE_SIZE);
   1764   1.1  mrg   f *= Wtype_MAXp1_F;
   1765   1.1  mrg   f += (UWtype)u;
   1766   1.1  mrg   return (FSTYPE) f;
   1767   1.1  mrg #else
   1768   1.1  mrg #if FSSIZE == W_TYPE_SIZE - 1
   1769   1.1  mrg # error
   1770   1.1  mrg #endif
   1771   1.1  mrg   /* Finally, the word size is larger than the number of bits in the
   1772   1.1  mrg      required FSTYPE, and we've got no suitable wider type.  The only
   1773   1.1  mrg      way to avoid double rounding is to special case the
   1774   1.1  mrg      extraction.  */
   1775   1.1  mrg 
   1776   1.1  mrg   /* If there are no high bits set, fall back to one conversion.  */
   1777   1.1  mrg   if ((UWtype)u == u)
   1778   1.1  mrg     return (FSTYPE)(UWtype)u;
   1779   1.1  mrg 
   1780   1.1  mrg   /* Otherwise, find the power of two.  */
   1781   1.1  mrg   UWtype hi = u >> W_TYPE_SIZE;
   1782   1.1  mrg 
   1783   1.1  mrg   UWtype count, shift;
   1784   1.1  mrg   count_leading_zeros (count, hi);
   1785   1.1  mrg 
   1786   1.1  mrg   shift = W_TYPE_SIZE - count;
   1787   1.1  mrg 
   1788   1.1  mrg   /* Shift down the most significant bits.  */
   1789   1.1  mrg   hi = u >> shift;
   1790   1.1  mrg 
   1791   1.1  mrg   /* If we lost any nonzero bits, set the lsb to ensure correct rounding.  */
   1792   1.1  mrg   if ((UWtype)u << (W_TYPE_SIZE - shift))
   1793   1.1  mrg     hi |= 1;
   1794   1.1  mrg 
   1795   1.1  mrg   /* Convert the one word of data, and rescale.  */
   1796   1.1  mrg   FSTYPE f = hi, e;
   1797   1.1  mrg   if (shift == W_TYPE_SIZE)
   1798   1.1  mrg     e = Wtype_MAXp1_F;
   1799   1.1  mrg   /* The following two cases could be merged if we knew that the target
   1800   1.1  mrg      supported a native unsigned->float conversion.  More often, we only
   1801   1.1  mrg      have a signed conversion, and have to add extra fixup code.  */
   1802   1.1  mrg   else if (shift == W_TYPE_SIZE - 1)
   1803   1.1  mrg     e = Wtype_MAXp1_F / 2;
   1804   1.1  mrg   else
   1805   1.1  mrg     e = (Wtype)1 << shift;
   1806   1.1  mrg   return f * e;
   1807   1.1  mrg #endif
   1808   1.1  mrg }
   1809   1.1  mrg #endif
   1810   1.1  mrg 
   1811   1.1  mrg #if defined(L_fixunsxfsi) && LIBGCC2_HAS_XF_MODE
   1812   1.1  mrg UWtype
   1813   1.1  mrg __fixunsxfSI (XFtype a)
   1814   1.1  mrg {
   1815   1.1  mrg   if (a >= - (DFtype) Wtype_MIN)
   1816   1.1  mrg     return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
   1817   1.1  mrg   return (Wtype) a;
   1818   1.1  mrg }
   1819   1.1  mrg #endif
   1820   1.1  mrg 
   1821   1.1  mrg #if defined(L_fixunsdfsi) && LIBGCC2_HAS_DF_MODE
   1822   1.1  mrg UWtype
   1823   1.1  mrg __fixunsdfSI (DFtype a)
   1824   1.1  mrg {
   1825   1.1  mrg   if (a >= - (DFtype) Wtype_MIN)
   1826   1.1  mrg     return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
   1827   1.1  mrg   return (Wtype) a;
   1828   1.1  mrg }
   1829   1.1  mrg #endif
   1830   1.1  mrg 
   1831   1.1  mrg #if defined(L_fixunssfsi) && LIBGCC2_HAS_SF_MODE
   1832   1.1  mrg UWtype
   1833   1.1  mrg __fixunssfSI (SFtype a)
   1834   1.1  mrg {
   1835   1.1  mrg   if (a >= - (SFtype) Wtype_MIN)
   1836   1.1  mrg     return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
   1837  1.12  mrg   return (Wtype) a;
   1838   1.1  mrg }
   1839   1.1  mrg #endif
   1840   1.1  mrg 
   1841   1.1  mrg /* Integer power helper used from __builtin_powi for non-constant
   1843   1.1  mrg    exponents.  */
   1844   1.1  mrg 
   1845   1.1  mrg #if (defined(L_powisf2) && LIBGCC2_HAS_SF_MODE) \
   1846   1.1  mrg     || (defined(L_powidf2) && LIBGCC2_HAS_DF_MODE) \
   1847   1.1  mrg     || (defined(L_powixf2) && LIBGCC2_HAS_XF_MODE) \
   1848   1.1  mrg     || (defined(L_powitf2) && LIBGCC2_HAS_TF_MODE)
   1849   1.1  mrg # if defined(L_powisf2)
   1850   1.8  mrg #  define TYPE SFtype
   1851   1.8  mrg #  define NAME __powisf2
   1852   1.1  mrg # elif defined(L_powidf2)
   1853   1.1  mrg #  define TYPE DFtype
   1854   1.1  mrg #  define NAME __powidf2
   1855   1.1  mrg # elif defined(L_powixf2)
   1856   1.1  mrg #  define TYPE XFtype
   1857   1.1  mrg #  define NAME __powixf2
   1858   1.1  mrg # elif defined(L_powitf2)
   1859   1.1  mrg #  define TYPE TFtype
   1860   1.8  mrg #  define NAME __powitf2
   1861   1.8  mrg # endif
   1862   1.8  mrg 
   1863  1.12  mrg #undef int
   1864   1.8  mrg #undef unsigned
   1865   1.8  mrg TYPE
   1866   1.8  mrg NAME (TYPE x, int m)
   1867   1.8  mrg {
   1868   1.1  mrg   unsigned int n = m < 0 ? -(unsigned int) m : (unsigned int) m;
   1869   1.1  mrg   TYPE y = n % 2 ? x : 1;
   1870  1.12  mrg   while (n >>= 1)
   1871   1.1  mrg     {
   1872   1.3  mrg       x = x * x;
   1873   1.4  mrg       if (n % 2)
   1874  1.12  mrg 	y = y * x;
   1875  1.12  mrg     }
   1876  1.12  mrg   return m < 0 ? 1/y : y;
   1877  1.12  mrg }
   1878  1.12  mrg 
   1879   1.1  mrg #endif
   1880   1.1  mrg 
   1881   1.1  mrg #if((defined(L_mulhc3) || defined(L_divhc3)) && LIBGCC2_HAS_HF_MODE) \
   1883   1.3  mrg     || ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \
   1884   1.4  mrg     || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \
   1885  1.12  mrg     || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \
   1886  1.12  mrg     || ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE)
   1887  1.12  mrg 
   1888  1.12  mrg #undef float
   1889  1.12  mrg #undef double
   1890   1.1  mrg #undef long
   1891   1.1  mrg 
   1892   1.1  mrg #if defined(L_mulhc3) || defined(L_divhc3)
   1893   1.1  mrg # define MTYPE	HFtype
   1894   1.3  mrg # define CTYPE	HCtype
   1895   1.4  mrg # define AMTYPE SFtype
   1896  1.12  mrg # define MODE	hc
   1897  1.12  mrg # define CEXT	__LIBGCC_HF_FUNC_EXT__
   1898  1.12  mrg # define NOTRUNC (!__LIBGCC_HF_EXCESS_PRECISION__)
   1899  1.12  mrg #elif defined(L_mulsc3) || defined(L_divsc3)
   1900  1.12  mrg # define MTYPE	SFtype
   1901   1.1  mrg # define CTYPE	SCtype
   1902   1.1  mrg # define AMTYPE DFtype
   1903   1.1  mrg # define MODE	sc
   1904   1.1  mrg # define CEXT	__LIBGCC_SF_FUNC_EXT__
   1905   1.3  mrg # define NOTRUNC (!__LIBGCC_SF_EXCESS_PRECISION__)
   1906   1.4  mrg # define RBIG	(__LIBGCC_SF_MAX__ / 2)
   1907  1.12  mrg # define RMIN	(__LIBGCC_SF_MIN__)
   1908  1.12  mrg # define RMIN2	(__LIBGCC_SF_EPSILON__)
   1909  1.12  mrg # define RMINSCAL (1 / __LIBGCC_SF_EPSILON__)
   1910  1.12  mrg # define RMAX2	(RBIG * RMIN2)
   1911  1.12  mrg #elif defined(L_muldc3) || defined(L_divdc3)
   1912  1.12  mrg # define MTYPE	DFtype
   1913  1.12  mrg # define CTYPE	DCtype
   1914  1.12  mrg # define MODE	dc
   1915  1.12  mrg # define CEXT	__LIBGCC_DF_FUNC_EXT__
   1916  1.12  mrg # define NOTRUNC (!__LIBGCC_DF_EXCESS_PRECISION__)
   1917  1.12  mrg # define RBIG	(__LIBGCC_DF_MAX__ / 2)
   1918  1.12  mrg # define RMIN	(__LIBGCC_DF_MIN__)
   1919   1.1  mrg # define RMIN2	(__LIBGCC_DF_EPSILON__)
   1920   1.1  mrg # define RMINSCAL (1 / __LIBGCC_DF_EPSILON__)
   1921   1.1  mrg # define RMAX2  (RBIG * RMIN2)
   1922   1.1  mrg #elif defined(L_mulxc3) || defined(L_divxc3)
   1923   1.1  mrg # define MTYPE	XFtype
   1924   1.1  mrg # define CTYPE	XCtype
   1925   1.1  mrg # define MODE	xc
   1926   1.1  mrg # define CEXT	__LIBGCC_XF_FUNC_EXT__
   1927   1.1  mrg # define NOTRUNC (!__LIBGCC_XF_EXCESS_PRECISION__)
   1928   1.1  mrg # define RBIG	(__LIBGCC_XF_MAX__ / 2)
   1929  1.10  mrg # define RMIN	(__LIBGCC_XF_MIN__)
   1930  1.10  mrg # define RMIN2	(__LIBGCC_XF_EPSILON__)
   1931  1.10  mrg # define RMINSCAL (1 / __LIBGCC_XF_EPSILON__)
   1932   1.1  mrg # define RMAX2	(RBIG * RMIN2)
   1933   1.1  mrg #elif defined(L_multc3) || defined(L_divtc3)
   1934   1.1  mrg # define MTYPE	TFtype
   1935   1.1  mrg # define CTYPE	TCtype
   1936   1.1  mrg # define MODE	tc
   1937   1.1  mrg # define CEXT	__LIBGCC_TF_FUNC_EXT__
   1938   1.1  mrg # define NOTRUNC (!__LIBGCC_TF_EXCESS_PRECISION__)
   1939   1.1  mrg # if __LIBGCC_TF_MANT_DIG__ == 106
   1940   1.1  mrg #  define RBIG	(__LIBGCC_DF_MAX__ / 2)
   1941   1.1  mrg #  define RMIN	(__LIBGCC_DF_MIN__)
   1942   1.1  mrg #  define RMIN2  (__LIBGCC_DF_EPSILON__)
   1943   1.1  mrg #  define RMINSCAL (1 / __LIBGCC_DF_EPSILON__)
   1944   1.1  mrg # else
   1945   1.1  mrg #  define RBIG	(__LIBGCC_TF_MAX__ / 2)
   1946   1.1  mrg #  define RMIN	(__LIBGCC_TF_MIN__)
   1947   1.1  mrg #  define RMIN2	(__LIBGCC_TF_EPSILON__)
   1948   1.1  mrg #  define RMINSCAL (1 / __LIBGCC_TF_EPSILON__)
   1949   1.1  mrg # endif
   1950   1.8  mrg # define RMAX2	(RBIG * RMIN2)
   1951   1.1  mrg #else
   1952   1.1  mrg # error
   1953   1.1  mrg #endif
   1954   1.1  mrg 
   1955   1.1  mrg #define CONCAT3(A,B,C)	_CONCAT3(A,B,C)
   1956   1.1  mrg #define _CONCAT3(A,B,C)	A##B##C
   1957   1.1  mrg 
   1958   1.1  mrg #define CONCAT2(A,B)	_CONCAT2(A,B)
   1959   1.1  mrg #define _CONCAT2(A,B)	A##B
   1960   1.1  mrg 
   1961   1.1  mrg #define isnan(x)	__builtin_isnan (x)
   1962   1.1  mrg #define isfinite(x)	__builtin_isfinite (x)
   1963   1.1  mrg #define isinf(x)	__builtin_isinf (x)
   1964   1.1  mrg 
   1965   1.1  mrg #define INFINITY	CONCAT2(__builtin_huge_val, CEXT) ()
   1966   1.1  mrg #define I		1i
   1967   1.1  mrg 
   1968   1.1  mrg /* Helpers to make the following code slightly less gross.  */
   1969   1.1  mrg #define COPYSIGN	CONCAT2(__builtin_copysign, CEXT)
   1970   1.1  mrg #define FABS		CONCAT2(__builtin_fabs, CEXT)
   1971   1.1  mrg 
   1972   1.1  mrg /* Verify that MTYPE matches up with CEXT.  */
   1973   1.1  mrg extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1];
   1974   1.1  mrg 
   1975   1.1  mrg /* Ensure that we've lost any extra precision.  */
   1976   1.1  mrg #if NOTRUNC
   1977   1.1  mrg # define TRUNC(x)
   1978   1.1  mrg #else
   1979   1.1  mrg # define TRUNC(x)	__asm__ ("" : "=m"(x) : "m"(x))
   1980   1.1  mrg #endif
   1981   1.1  mrg 
   1982   1.1  mrg #if defined(L_mulhc3) || defined(L_mulsc3) || defined(L_muldc3) \
   1983   1.1  mrg     || defined(L_mulxc3) || defined(L_multc3)
   1984   1.1  mrg 
   1985   1.1  mrg CTYPE
   1986   1.1  mrg CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
   1987   1.1  mrg {
   1988   1.1  mrg   MTYPE ac, bd, ad, bc, x, y;
   1989   1.1  mrg   CTYPE res;
   1990   1.1  mrg 
   1991   1.1  mrg   ac = a * c;
   1992   1.1  mrg   bd = b * d;
   1993   1.1  mrg   ad = a * d;
   1994   1.1  mrg   bc = b * c;
   1995   1.1  mrg 
   1996   1.1  mrg   TRUNC (ac);
   1997   1.1  mrg   TRUNC (bd);
   1998   1.1  mrg   TRUNC (ad);
   1999   1.1  mrg   TRUNC (bc);
   2000   1.1  mrg 
   2001   1.1  mrg   x = ac - bd;
   2002   1.1  mrg   y = ad + bc;
   2003   1.1  mrg 
   2004   1.1  mrg   if (isnan (x) && isnan (y))
   2005   1.1  mrg     {
   2006   1.1  mrg       /* Recover infinities that computed as NaN + iNaN.  */
   2007   1.1  mrg       _Bool recalc = 0;
   2008   1.1  mrg       if (isinf (a) || isinf (b))
   2009   1.1  mrg 	{
   2010   1.1  mrg 	  /* z is infinite.  "Box" the infinity and change NaNs in
   2011   1.1  mrg 	     the other factor to 0.  */
   2012   1.1  mrg 	  a = COPYSIGN (isinf (a) ? 1 : 0, a);
   2013   1.1  mrg 	  b = COPYSIGN (isinf (b) ? 1 : 0, b);
   2014   1.1  mrg 	  if (isnan (c)) c = COPYSIGN (0, c);
   2015   1.1  mrg 	  if (isnan (d)) d = COPYSIGN (0, d);
   2016   1.1  mrg           recalc = 1;
   2017   1.1  mrg 	}
   2018   1.1  mrg      if (isinf (c) || isinf (d))
   2019   1.1  mrg 	{
   2020   1.8  mrg 	  /* w is infinite.  "Box" the infinity and change NaNs in
   2021   1.1  mrg 	     the other factor to 0.  */
   2022   1.1  mrg 	  c = COPYSIGN (isinf (c) ? 1 : 0, c);
   2023   1.1  mrg 	  d = COPYSIGN (isinf (d) ? 1 : 0, d);
   2024   1.1  mrg 	  if (isnan (a)) a = COPYSIGN (0, a);
   2025   1.1  mrg 	  if (isnan (b)) b = COPYSIGN (0, b);
   2026  1.12  mrg 	  recalc = 1;
   2027  1.12  mrg 	}
   2028  1.12  mrg      if (!recalc
   2029  1.12  mrg 	  && (isinf (ac) || isinf (bd)
   2030  1.12  mrg 	      || isinf (ad) || isinf (bc)))
   2031  1.12  mrg 	{
   2032  1.12  mrg 	  /* Recover infinities from overflow by changing NaNs to 0.  */
   2033  1.12  mrg 	  if (isnan (a)) a = COPYSIGN (0, a);
   2034  1.12  mrg 	  if (isnan (b)) b = COPYSIGN (0, b);
   2035  1.12  mrg 	  if (isnan (c)) c = COPYSIGN (0, c);
   2036  1.12  mrg 	  if (isnan (d)) d = COPYSIGN (0, d);
   2037  1.12  mrg 	  recalc = 1;
   2038  1.12  mrg 	}
   2039  1.12  mrg       if (recalc)
   2040  1.12  mrg 	{
   2041  1.12  mrg 	  x = INFINITY * (a * c - b * d);
   2042  1.12  mrg 	  y = INFINITY * (a * d + b * c);
   2043  1.12  mrg 	}
   2044  1.12  mrg     }
   2045  1.12  mrg 
   2046  1.12  mrg   __real__ res = x;
   2047  1.12  mrg   __imag__ res = y;
   2048  1.12  mrg   return res;
   2049  1.12  mrg }
   2050   1.1  mrg #endif /* complex multiply */
   2051   1.1  mrg 
   2052   1.1  mrg #if defined(L_divhc3) || defined(L_divsc3) || defined(L_divdc3) \
   2053  1.12  mrg     || defined(L_divxc3) || defined(L_divtc3)
   2054  1.12  mrg 
   2055  1.12  mrg CTYPE
   2056  1.12  mrg CONCAT3(__div,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
   2057  1.12  mrg {
   2058  1.12  mrg #if defined(L_divhc3)						\
   2059  1.12  mrg   || (defined(L_divsc3) && defined(__LIBGCC_HAVE_HWDBL__) )
   2060   1.1  mrg 
   2061   1.1  mrg   /* Half precision is handled with float precision.
   2062  1.12  mrg      float is handled with double precision when double precision
   2063  1.12  mrg      hardware is available.
   2064  1.12  mrg      Due to the additional precision, the simple complex divide
   2065  1.12  mrg      method (without Smith's method) is sufficient to get accurate
   2066  1.12  mrg      answers and runs slightly faster than Smith's method.  */
   2067  1.12  mrg 
   2068  1.12  mrg   AMTYPE aa, bb, cc, dd;
   2069  1.12  mrg   AMTYPE denom;
   2070  1.12  mrg   MTYPE x, y;
   2071  1.12  mrg   CTYPE res;
   2072  1.12  mrg   aa = a;
   2073  1.12  mrg   bb = b;
   2074  1.12  mrg   cc = c;
   2075  1.12  mrg   dd = d;
   2076  1.12  mrg 
   2077  1.12  mrg   denom = (cc * cc) + (dd * dd);
   2078  1.12  mrg   x = ((aa * cc) + (bb * dd)) / denom;
   2079  1.12  mrg   y = ((bb * cc) - (aa * dd)) / denom;
   2080  1.12  mrg 
   2081  1.12  mrg #else
   2082  1.12  mrg   MTYPE denom, ratio, x, y;
   2083  1.12  mrg   CTYPE res;
   2084  1.12  mrg 
   2085  1.12  mrg   /* double, extended, long double have significant potential
   2086  1.12  mrg      underflow/overflow errors that can be greatly reduced with
   2087  1.12  mrg      a limited number of tests and adjustments.  float is handled
   2088  1.12  mrg      the same way when no HW double is available.
   2089  1.12  mrg   */
   2090  1.12  mrg 
   2091  1.12  mrg   /* Scale by max(c,d) to reduce chances of denominator overflowing.  */
   2092   1.1  mrg   if (FABS (c) < FABS (d))
   2093   1.1  mrg     {
   2094  1.12  mrg       /* Prevent underflow when denominator is near max representable.  */
   2095  1.12  mrg       if (FABS (d) >= RBIG)
   2096  1.12  mrg 	{
   2097  1.12  mrg 	  a = a / 2;
   2098  1.12  mrg 	  b = b / 2;
   2099  1.12  mrg 	  c = c / 2;
   2100  1.12  mrg 	  d = d / 2;
   2101  1.12  mrg 	}
   2102  1.12  mrg       /* Avoid overflow/underflow issues when c and d are small.
   2103  1.12  mrg 	 Scaling up helps avoid some underflows.
   2104  1.12  mrg 	 No new overflow possible since c&d < RMIN2.  */
   2105   1.1  mrg       if (FABS (d) < RMIN2)
   2106   1.1  mrg 	{
   2107   1.1  mrg 	  a = a * RMINSCAL;
   2108  1.12  mrg 	  b = b * RMINSCAL;
   2109  1.12  mrg 	  c = c * RMINSCAL;
   2110  1.12  mrg 	  d = d * RMINSCAL;
   2111  1.12  mrg 	}
   2112  1.12  mrg       else
   2113  1.12  mrg 	{
   2114  1.12  mrg 	  if (((FABS (a) < RMIN) && (FABS (b) < RMAX2) && (FABS (d) < RMAX2))
   2115  1.12  mrg 	      || ((FABS (b) < RMIN) && (FABS (a) < RMAX2)
   2116  1.12  mrg 		  && (FABS (d) < RMAX2)))
   2117  1.12  mrg 	    {
   2118  1.12  mrg 	      a = a * RMINSCAL;
   2119  1.12  mrg 	      b = b * RMINSCAL;
   2120  1.12  mrg 	      c = c * RMINSCAL;
   2121  1.12  mrg 	      d = d * RMINSCAL;
   2122  1.12  mrg 	    }
   2123  1.12  mrg 	}
   2124  1.12  mrg       ratio = c / d;
   2125  1.12  mrg       denom = (c * ratio) + d;
   2126  1.12  mrg       /* Choose alternate order of computation if ratio is subnormal.  */
   2127  1.12  mrg       if (FABS (ratio) > RMIN)
   2128  1.12  mrg 	{
   2129  1.12  mrg 	  x = ((a * ratio) + b) / denom;
   2130  1.12  mrg 	  y = ((b * ratio) - a) / denom;
   2131  1.12  mrg 	}
   2132  1.12  mrg       else
   2133  1.12  mrg 	{
   2134  1.12  mrg 	  x = ((c * (a / d)) + b) / denom;
   2135  1.12  mrg 	  y = ((c * (b / d)) - a) / denom;
   2136  1.12  mrg 	}
   2137  1.12  mrg     }
   2138   1.1  mrg   else
   2139   1.1  mrg     {
   2140  1.12  mrg       /* Prevent underflow when denominator is near max representable.  */
   2141  1.12  mrg       if (FABS (c) >= RBIG)
   2142  1.12  mrg 	{
   2143  1.12  mrg 	  a = a / 2;
   2144  1.12  mrg 	  b = b / 2;
   2145  1.12  mrg 	  c = c / 2;
   2146  1.12  mrg 	  d = d / 2;
   2147  1.12  mrg 	}
   2148  1.12  mrg       /* Avoid overflow/underflow issues when both c and d are small.
   2149  1.12  mrg 	 Scaling up helps avoid some underflows.
   2150  1.12  mrg 	 No new overflow possible since both c&d are less than RMIN2.  */
   2151   1.1  mrg       if (FABS (c) < RMIN2)
   2152  1.12  mrg 	{
   2153   1.1  mrg 	  a = a * RMINSCAL;
   2154  1.12  mrg 	  b = b * RMINSCAL;
   2155  1.12  mrg 	  c = c * RMINSCAL;
   2156   1.1  mrg 	  d = d * RMINSCAL;
   2157   1.1  mrg 	}
   2158   1.1  mrg       else
   2159   1.1  mrg 	{
   2160   1.1  mrg 	  if (((FABS (a) < RMIN) && (FABS (b) < RMAX2) && (FABS (c) < RMAX2))
   2161   1.1  mrg 	      || ((FABS (b) < RMIN) && (FABS (a) < RMAX2)
   2162   1.1  mrg 		  && (FABS (c) < RMAX2)))
   2163   1.1  mrg 	    {
   2164   1.1  mrg 	      a = a * RMINSCAL;
   2165   1.1  mrg 	      b = b * RMINSCAL;
   2166   1.1  mrg 	      c = c * RMINSCAL;
   2167   1.1  mrg 	      d = d * RMINSCAL;
   2168   1.1  mrg 	    }
   2169   1.1  mrg 	}
   2170   1.1  mrg       ratio = d / c;
   2171   1.1  mrg       denom = (d * ratio) + c;
   2172   1.1  mrg       /* Choose alternate order of computation if ratio is subnormal.  */
   2173   1.1  mrg       if (FABS (ratio) > RMIN)
   2174   1.1  mrg 	{
   2175   1.1  mrg 	  x = ((b * ratio) + a) / denom;
   2176   1.1  mrg 	  y = (b - (a * ratio)) / denom;
   2177   1.1  mrg 	}
   2178   1.1  mrg       else
   2179   1.1  mrg 	{
   2180   1.1  mrg 	  x = (a + (d * (b / c))) / denom;
   2181   1.1  mrg 	  y = (b - (d * (a / c))) / denom;
   2182   1.1  mrg 	}
   2183   1.1  mrg     }
   2184   1.1  mrg #endif
   2185   1.1  mrg 
   2186   1.1  mrg   /* Recover infinities and zeros that computed as NaN+iNaN; the only
   2187   1.1  mrg      cases are nonzero/zero, infinite/finite, and finite/infinite.  */
   2188   1.1  mrg   if (isnan (x) && isnan (y))
   2189   1.1  mrg     {
   2190   1.1  mrg       if (c == 0.0 && d == 0.0 && (!isnan (a) || !isnan (b)))
   2191   1.1  mrg 	{
   2192   1.1  mrg 	  x = COPYSIGN (INFINITY, c) * a;
   2193   1.1  mrg 	  y = COPYSIGN (INFINITY, c) * b;
   2194   1.1  mrg 	}
   2195   1.1  mrg       else if ((isinf (a) || isinf (b)) && isfinite (c) && isfinite (d))
   2196   1.1  mrg 	{
   2197   1.1  mrg 	  a = COPYSIGN (isinf (a) ? 1 : 0, a);
   2198   1.1  mrg 	  b = COPYSIGN (isinf (b) ? 1 : 0, b);
   2199   1.1  mrg 	  x = INFINITY * (a * c + b * d);
   2200   1.1  mrg 	  y = INFINITY * (b * c - a * d);
   2201   1.1  mrg 	}
   2202   1.1  mrg       else if ((isinf (c) || isinf (d)) && isfinite (a) && isfinite (b))
   2203   1.1  mrg 	{
   2204   1.1  mrg 	  c = COPYSIGN (isinf (c) ? 1 : 0, c);
   2205   1.1  mrg 	  d = COPYSIGN (isinf (d) ? 1 : 0, d);
   2206   1.1  mrg 	  x = 0.0 * (a * c + b * d);
   2207   1.1  mrg 	  y = 0.0 * (b * c - a * d);
   2208   1.1  mrg 	}
   2209   1.1  mrg     }
   2210   1.1  mrg 
   2211   1.1  mrg   __real__ res = x;
   2212   1.1  mrg   __imag__ res = y;
   2213   1.1  mrg   return res;
   2214   1.1  mrg }
   2215   1.1  mrg #endif /* complex divide */
   2216   1.1  mrg 
   2217   1.1  mrg #endif /* all complex float routines */
   2218   1.1  mrg 
   2219   1.1  mrg /* From here on down, the routines use normal data types.  */
   2221   1.1  mrg 
   2222   1.1  mrg #define SItype bogus_type
   2223   1.1  mrg #define USItype bogus_type
   2224   1.1  mrg #define DItype bogus_type
   2225   1.1  mrg #define UDItype bogus_type
   2226   1.1  mrg #define SFtype bogus_type
   2227   1.1  mrg #define DFtype bogus_type
   2228   1.1  mrg #undef Wtype
   2229   1.1  mrg #undef UWtype
   2230   1.1  mrg #undef HWtype
   2231   1.1  mrg #undef UHWtype
   2232   1.1  mrg #undef DWtype
   2233   1.1  mrg #undef UDWtype
   2234   1.1  mrg 
   2235   1.1  mrg #undef char
   2236   1.1  mrg #undef short
   2237   1.1  mrg #undef int
   2238   1.1  mrg #undef long
   2239   1.1  mrg #undef unsigned
   2240   1.1  mrg #undef float
   2241   1.1  mrg #undef double
   2242   1.1  mrg 
   2243   1.1  mrg #ifdef L__gcc_bcmp
   2245   1.1  mrg 
   2246   1.1  mrg /* Like bcmp except the sign is meaningful.
   2247   1.1  mrg    Result is negative if S1 is less than S2,
   2248   1.1  mrg    positive if S1 is greater, 0 if S1 and S2 are equal.  */
   2249   1.1  mrg 
   2250   1.1  mrg int
   2251   1.1  mrg __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
   2252   1.1  mrg {
   2253   1.1  mrg   while (size > 0)
   2254   1.1  mrg     {
   2255   1.1  mrg       const unsigned char c1 = *s1++, c2 = *s2++;
   2256   1.1  mrg       if (c1 != c2)
   2257   1.1  mrg 	return c1 - c2;
   2258  1.10  mrg       size--;
   2259  1.10  mrg     }
   2260   1.1  mrg   return 0;
   2261   1.1  mrg }
   2262  1.10  mrg 
   2263  1.10  mrg #endif
   2264  1.10  mrg 
   2265  1.10  mrg /* __eprintf used to be used by GCC's private version of <assert.h>.
   2267   1.1  mrg    We no longer provide that header, but this routine remains in libgcc.a
   2268   1.1  mrg    for binary backward compatibility.  Note that it is not included in
   2269   1.1  mrg    the shared version of libgcc.  */
   2270   1.1  mrg #ifdef L_eprintf
   2271   1.1  mrg #ifndef inhibit_libc
   2272   1.1  mrg 
   2273   1.1  mrg #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch.  */
   2274   1.1  mrg #include <stdio.h>
   2275   1.1  mrg 
   2276   1.1  mrg void
   2277   1.1  mrg __eprintf (const char *string, const char *expression,
   2278   1.1  mrg 	   unsigned int line, const char *filename)
   2279   1.1  mrg {
   2280   1.1  mrg   fprintf (stderr, string, expression, line, filename);
   2281   1.1  mrg   fflush (stderr);
   2282   1.1  mrg   abort ();
   2283   1.1  mrg }
   2284   1.1  mrg 
   2285   1.1  mrg #endif
   2286   1.1  mrg #endif
   2287   1.1  mrg 
   2288   1.1  mrg 
   2289   1.1  mrg #ifdef L_clear_cache
   2291   1.1  mrg /* Clear part of an instruction cache.  */
   2292   1.1  mrg 
   2293   1.1  mrg void
   2294   1.1  mrg __clear_cache (void *beg __attribute__((__unused__)),
   2295   1.1  mrg 	       void *end __attribute__((__unused__)))
   2296   1.1  mrg {
   2297   1.1  mrg #ifdef CLEAR_INSN_CACHE
   2298   1.1  mrg   /* Cast the void* pointers to char* as some implementations
   2299   1.1  mrg      of the macro assume the pointers can be subtracted from
   2300   1.1  mrg      one another.  */
   2301   1.1  mrg   CLEAR_INSN_CACHE ((char *) beg, (char *) end);
   2302   1.1  mrg #endif /* CLEAR_INSN_CACHE */
   2303   1.1  mrg }
   2304   1.1  mrg 
   2305   1.1  mrg #endif /* L_clear_cache */
   2306   1.1  mrg 
   2307   1.1  mrg #ifdef L_trampoline
   2309   1.1  mrg 
   2310   1.1  mrg /* Jump to a trampoline, loading the static chain address.  */
   2311   1.1  mrg 
   2312   1.1  mrg #if defined(WINNT) && ! defined(__CYGWIN__)
   2313   1.1  mrg #include <windows.h>
   2314   1.1  mrg int getpagesize (void);
   2315   1.1  mrg int mprotect (char *,int, int);
   2316   1.1  mrg 
   2317   1.1  mrg int
   2318   1.1  mrg getpagesize (void)
   2319   1.1  mrg {
   2320   1.1  mrg #ifdef _ALPHA_
   2321   1.1  mrg   return 8192;
   2322   1.1  mrg #else
   2323   1.1  mrg   return 4096;
   2324   1.1  mrg #endif
   2325   1.1  mrg }
   2326   1.1  mrg 
   2327   1.1  mrg int
   2328   1.1  mrg mprotect (char *addr, int len, int prot)
   2329   1.1  mrg {
   2330   1.1  mrg   DWORD np, op;
   2331   1.1  mrg 
   2332   1.1  mrg   if (prot == 7)
   2333   1.1  mrg     np = 0x40;
   2334   1.1  mrg   else if (prot == 5)
   2335   1.1  mrg     np = 0x20;
   2336   1.1  mrg   else if (prot == 4)
   2337   1.3  mrg     np = 0x10;
   2338   1.3  mrg   else if (prot == 3)
   2339   1.1  mrg     np = 0x04;
   2340   1.1  mrg   else if (prot == 1)
   2341   1.1  mrg     np = 0x02;
   2342   1.1  mrg   else if (prot == 0)
   2343   1.1  mrg     np = 0x01;
   2344   1.1  mrg   else
   2345   1.1  mrg     return -1;
   2346   1.3  mrg 
   2347   1.3  mrg   if (VirtualProtect (addr, len, np, &op))
   2348   1.3  mrg     return 0;
   2349   1.3  mrg   else
   2350   1.3  mrg     return -1;
   2351   1.3  mrg }
   2352   1.1  mrg 
   2353   1.3  mrg #endif /* WINNT && ! __CYGWIN__ */
   2354   1.1  mrg 
   2355   1.1  mrg #ifdef TRANSFER_FROM_TRAMPOLINE
   2356   1.1  mrg TRANSFER_FROM_TRAMPOLINE
   2357   1.1  mrg #endif
   2358   1.1  mrg #endif /* L_trampoline */
   2359   1.1  mrg 
   2360   1.1  mrg #ifndef __CYGWIN__
   2362   1.1  mrg #ifdef L__main
   2363   1.1  mrg 
   2364   1.1  mrg #include "gbl-ctors.h"
   2365   1.1  mrg 
   2366   1.1  mrg /* Some systems use __main in a way incompatible with its use in gcc, in these
   2367   1.1  mrg    cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
   2368   1.1  mrg    give the same symbol without quotes for an alternative entry point.  You
   2369   1.1  mrg    must define both, or neither.  */
   2370   1.1  mrg #ifndef NAME__MAIN
   2371   1.1  mrg #define NAME__MAIN "__main"
   2372   1.1  mrg #define SYMBOL__MAIN __main
   2373   1.3  mrg #endif
   2374   1.1  mrg 
   2375   1.1  mrg #if defined (__LIBGCC_INIT_SECTION_ASM_OP__) \
   2376   1.1  mrg     || defined (__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__)
   2377   1.1  mrg #undef HAS_INIT_SECTION
   2378   1.1  mrg #define HAS_INIT_SECTION
   2379   1.1  mrg #endif
   2380   1.1  mrg 
   2381   1.1  mrg #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
   2382   1.1  mrg 
   2383   1.1  mrg /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
   2384   1.1  mrg    code to run constructors.  In that case, we need to handle EH here, too.
   2385   1.1  mrg    But MINGW32 is special because it handles CRTSTUFF and EH on its own.  */
   2386   1.1  mrg 
   2387   1.1  mrg #ifdef __MINGW32__
   2388   1.1  mrg #undef __LIBGCC_EH_FRAME_SECTION_NAME__
   2389   1.1  mrg #endif
   2390   1.1  mrg 
   2391   1.1  mrg #ifdef __LIBGCC_EH_FRAME_SECTION_NAME__
   2392   1.3  mrg #include "unwind-dw2-fde.h"
   2393   1.1  mrg extern unsigned char __EH_FRAME_BEGIN__[];
   2394   1.1  mrg #endif
   2395   1.1  mrg 
   2396   1.1  mrg /* Run all the global destructors on exit from the program.  */
   2397   1.1  mrg 
   2398   1.1  mrg void
   2399   1.1  mrg __do_global_dtors (void)
   2400   1.1  mrg {
   2401   1.1  mrg #ifdef DO_GLOBAL_DTORS_BODY
   2402   1.1  mrg   DO_GLOBAL_DTORS_BODY;
   2403   1.1  mrg #else
   2404   1.1  mrg   static func_ptr *p = __DTOR_LIST__ + 1;
   2405   1.1  mrg   while (*p)
   2406   1.1  mrg     {
   2407   1.1  mrg       p++;
   2408   1.1  mrg       (*(p-1)) ();
   2409   1.1  mrg     }
   2410   1.1  mrg #endif
   2411   1.1  mrg #if defined (__LIBGCC_EH_FRAME_SECTION_NAME__) && !defined (HAS_INIT_SECTION)
   2412   1.1  mrg   {
   2413   1.1  mrg     static int completed = 0;
   2414   1.1  mrg     if (! completed)
   2415   1.1  mrg       {
   2416   1.1  mrg 	completed = 1;
   2417   1.1  mrg 	__deregister_frame_info (__EH_FRAME_BEGIN__);
   2418   1.1  mrg       }
   2419   1.1  mrg   }
   2420   1.1  mrg #endif
   2421   1.1  mrg }
   2422   1.1  mrg #endif
   2423   1.1  mrg 
   2424   1.1  mrg #ifndef HAS_INIT_SECTION
   2425   1.1  mrg /* Run all the global constructors on entry to the program.  */
   2426   1.1  mrg 
   2427   1.1  mrg void
   2428   1.1  mrg __do_global_ctors (void)
   2429   1.1  mrg {
   2430   1.1  mrg #ifdef __LIBGCC_EH_FRAME_SECTION_NAME__
   2431   1.1  mrg   {
   2432   1.1  mrg     static struct object object;
   2433   1.1  mrg     __register_frame_info (__EH_FRAME_BEGIN__, &object);
   2434   1.1  mrg   }
   2435   1.1  mrg #endif
   2436   1.1  mrg   DO_GLOBAL_CTORS_BODY;
   2437   1.1  mrg   atexit (__do_global_dtors);
   2438   1.1  mrg }
   2439   1.1  mrg #endif /* no HAS_INIT_SECTION */
   2440   1.1  mrg 
   2441   1.1  mrg #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
   2442   1.1  mrg /* Subroutine called automatically by `main'.
   2443   1.1  mrg    Compiling a global function named `main'
   2444   1.1  mrg    produces an automatic call to this function at the beginning.
   2445   1.1  mrg 
   2446   1.8  mrg    For many systems, this routine calls __do_global_ctors.
   2447   1.1  mrg    For systems which support a .init section we use the .init section
   2448   1.1  mrg    to run __do_global_ctors, so we need not do anything here.  */
   2449   1.1  mrg 
   2450   1.1  mrg extern void SYMBOL__MAIN (void);
   2451   1.1  mrg void
   2452   1.1  mrg SYMBOL__MAIN (void)
   2453   1.1  mrg {
   2454   1.8  mrg   /* Support recursive calls to `main': run initializers just once.  */
   2455   1.1  mrg   static int initialized;
   2456   1.1  mrg   if (! initialized)
   2457                {
   2458                  initialized = 1;
   2459                  __do_global_ctors ();
   2460                }
   2461            }
   2462            #endif /* no HAS_INIT_SECTION or INVOKE__main */
   2463            
   2464            #endif /* L__main */
   2465            #endif /* __CYGWIN__ */
   2466            
   2467            #ifdef L_ctors
   2469            
   2470            #include "gbl-ctors.h"
   2471            
   2472            /* Provide default definitions for the lists of constructors and
   2473               destructors, so that we don't get linker errors.  These symbols are
   2474               intentionally bss symbols, so that gld and/or collect will provide
   2475               the right values.  */
   2476            
   2477            /* We declare the lists here with two elements each,
   2478               so that they are valid empty lists if no other definition is loaded.
   2479            
   2480               If we are using the old "set" extensions to have the gnu linker
   2481               collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
   2482               must be in the bss/common section.
   2483            
   2484               Long term no port should use those extensions.  But many still do.  */
   2485            #if !defined(__LIBGCC_INIT_SECTION_ASM_OP__)
   2486            #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
   2487            func_ptr __CTOR_LIST__[2] = {0, 0};
   2488            func_ptr __DTOR_LIST__[2] = {0, 0};
   2489            #else
   2490            func_ptr __CTOR_LIST__[2];
   2491            func_ptr __DTOR_LIST__[2];
   2492            #endif
   2493            #endif /* no __LIBGCC_INIT_SECTION_ASM_OP__ */
   2494            #endif /* L_ctors */
   2495            #endif /* LIBGCC2_UNITS_PER_WORD <= MIN_UNITS_PER_WORD */
   2496