(root)/
binutils-2.41/
gas/
config/
atof-ieee.c
       1  /* atof_ieee.c - turn a Flonum into an IEEE floating point number
       2     Copyright (C) 1987-2023 Free Software Foundation, Inc.
       3  
       4     This file is part of GAS, the GNU Assembler.
       5  
       6     GAS is free software; you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3, or (at your option)
       9     any later version.
      10  
      11     GAS is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with GAS; see the file COPYING.  If not, write to the Free
      18     Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
      19     02110-1301, USA.  */
      20  
      21  #include "as.h"
      22  #include "safe-ctype.h"
      23  
      24  /* Flonums returned here.  */
      25  extern FLONUM_TYPE generic_floating_point_number;
      26  
      27  /* Precision in LittleNums.  */
      28  /* Don't count the gap in the m68k extended precision format.  */
      29  #define MAX_PRECISION  5
      30  #define H_PRECISION    1
      31  #define B_PRECISION    1 /* Not strictly IEEE, but handled here anyway.  */
      32  #define F_PRECISION    2
      33  #define D_PRECISION    4
      34  #define X_PRECISION    5
      35  #ifndef X_PRECISION_PAD
      36  #define X_PRECISION_PAD 0
      37  #endif
      38  #define P_PRECISION    5
      39  #ifndef P_PRECISION_PAD
      40  #define P_PRECISION_PAD X_PRECISION_PAD
      41  #endif
      42  
      43  /* Length in LittleNums of guard bits.  */
      44  #define GUARD          2
      45  
      46  #ifndef TC_LARGEST_EXPONENT_IS_NORMAL
      47  #define TC_LARGEST_EXPONENT_IS_NORMAL(PRECISION) 0
      48  #endif
      49  
      50  static const unsigned long mask[] =
      51  {
      52    0x00000000,
      53    0x00000001,
      54    0x00000003,
      55    0x00000007,
      56    0x0000000f,
      57    0x0000001f,
      58    0x0000003f,
      59    0x0000007f,
      60    0x000000ff,
      61    0x000001ff,
      62    0x000003ff,
      63    0x000007ff,
      64    0x00000fff,
      65    0x00001fff,
      66    0x00003fff,
      67    0x00007fff,
      68    0x0000ffff,
      69    0x0001ffff,
      70    0x0003ffff,
      71    0x0007ffff,
      72    0x000fffff,
      73    0x001fffff,
      74    0x003fffff,
      75    0x007fffff,
      76    0x00ffffff,
      77    0x01ffffff,
      78    0x03ffffff,
      79    0x07ffffff,
      80    0x0fffffff,
      81    0x1fffffff,
      82    0x3fffffff,
      83    0x7fffffff,
      84    0xffffffff,
      85  };
      86  
      87  static int bits_left_in_littlenum;
      88  static int littlenums_left;
      89  static LITTLENUM_TYPE *littlenum_pointer;
      90  
      91  static int
      92  next_bits (int number_of_bits)
      93  {
      94    int return_value;
      95  
      96    if (!littlenums_left)
      97      return 0;
      98  
      99    if (number_of_bits >= bits_left_in_littlenum)
     100      {
     101        return_value = mask[bits_left_in_littlenum] & *littlenum_pointer;
     102        number_of_bits -= bits_left_in_littlenum;
     103        return_value <<= number_of_bits;
     104  
     105        if (--littlenums_left)
     106  	{
     107  	  bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS - number_of_bits;
     108  	  --littlenum_pointer;
     109  	  return_value |=
     110  	    (*littlenum_pointer >> bits_left_in_littlenum)
     111  	    & mask[number_of_bits];
     112  	}
     113      }
     114    else
     115      {
     116        bits_left_in_littlenum -= number_of_bits;
     117        return_value =
     118  	mask[number_of_bits] & (*littlenum_pointer >> bits_left_in_littlenum);
     119      }
     120    return return_value;
     121  }
     122  
     123  /* Num had better be less than LITTLENUM_NUMBER_OF_BITS.  */
     124  
     125  static void
     126  unget_bits (int num)
     127  {
     128    if (!littlenums_left)
     129      {
     130        ++littlenum_pointer;
     131        ++littlenums_left;
     132        bits_left_in_littlenum = num;
     133      }
     134    else if (bits_left_in_littlenum + num > LITTLENUM_NUMBER_OF_BITS)
     135      {
     136        bits_left_in_littlenum =
     137  	num - (LITTLENUM_NUMBER_OF_BITS - bits_left_in_littlenum);
     138        ++littlenum_pointer;
     139        ++littlenums_left;
     140      }
     141    else
     142      bits_left_in_littlenum += num;
     143  }
     144  
     145  static void
     146  make_invalid_floating_point_number (LITTLENUM_TYPE *words)
     147  {
     148    as_bad (_("cannot create floating-point number"));
     149    /* Zero the leftmost bit.  */
     150    words[0] = (LITTLENUM_TYPE) ((unsigned) -1) >> 1;
     151    words[1] = (LITTLENUM_TYPE) -1;
     152    words[2] = (LITTLENUM_TYPE) -1;
     153    words[3] = (LITTLENUM_TYPE) -1;
     154    words[4] = (LITTLENUM_TYPE) -1;
     155    words[5] = (LITTLENUM_TYPE) -1;
     156  }
     157  
     158  /* Build a floating point constant at str into a IEEE floating
     159     point number.  This function does the same thing as atof_ieee
     160     however it allows more control over the exact format, i.e.
     161     explicitly specifying the precision and number of exponent bits
     162     instead of relying on this infomation being deduced from a given type.
     163  
     164     If generic_float_info is not NULL then it will be set to contain generic
     165     infomation about the parsed floating point number.
     166  
     167     Returns pointer past text consumed. */
     168  char *
     169  atof_ieee_detail (char * str,
     170  		  int precision,
     171  		  int exponent_bits,
     172  		  LITTLENUM_TYPE * words,
     173  		  FLONUM_TYPE * generic_float_info)
     174  {
     175    /* Extra bits for zeroed low-order bits.
     176       The 1st MAX_PRECISION are zeroed, the last contain flonum bits.  */
     177    static LITTLENUM_TYPE bits[MAX_PRECISION + MAX_PRECISION + GUARD];
     178    char *return_value;
     179  
     180    /* Number of 16-bit words in the format.  */
     181    FLONUM_TYPE save_gen_flonum;
     182  
     183    /* We have to save the generic_floating_point_number because it
     184       contains storage allocation about the array of LITTLENUMs where
     185       the value is actually stored.  We will allocate our own array of
     186       littlenums below, but have to restore the global one on exit.  */
     187    save_gen_flonum = generic_floating_point_number;
     188  
     189    return_value = str;
     190    generic_floating_point_number.low = bits + MAX_PRECISION;
     191    generic_floating_point_number.high = NULL;
     192    generic_floating_point_number.leader = NULL;
     193    generic_floating_point_number.exponent = 0;
     194    generic_floating_point_number.sign = '\0';
     195  
     196    /* Use more LittleNums than seems necessary: the highest flonum may
     197       have 15 leading 0 bits, so could be useless.  */
     198  
     199    memset (bits, '\0', sizeof (LITTLENUM_TYPE) * MAX_PRECISION);
     200  
     201    generic_floating_point_number.high
     202      = generic_floating_point_number.low + precision - 1 + GUARD;
     203  
     204    if (atof_generic (&return_value, ".", EXP_CHARS,
     205  		    &generic_floating_point_number))
     206      {
     207        make_invalid_floating_point_number (words);
     208        return NULL;
     209      }
     210  
     211    if (generic_float_info)
     212      *generic_float_info = generic_floating_point_number;
     213  
     214    gen_to_words (words, precision, exponent_bits);
     215  
     216    /* Restore the generic_floating_point_number's storage alloc (and
     217       everything else).  */
     218    generic_floating_point_number = save_gen_flonum;
     219  
     220    return return_value;
     221  }
     222  
     223  /* Warning: This returns 16-bit LITTLENUMs.  It is up to the caller to
     224     figure out any alignment problems and to conspire for the
     225     bytes/word to be emitted in the right order.  Bigendians beware!  */
     226  
     227  /* Note that atof-ieee always has X and P precisions enabled.  it is up
     228     to md_atof to filter them out if the target machine does not support
     229     them.  */
     230  
     231  /* Returns pointer past text consumed.  */
     232  char *
     233  atof_ieee (char *str,			/* Text to convert to binary.  */
     234  	   int what_kind,		/* 'd', 'f', 'x', 'p'.  */
     235  	   LITTLENUM_TYPE *words)	/* Build the binary here.  */
     236  {
     237    int precision;
     238    long exponent_bits;
     239  
     240    switch (what_kind)
     241      {
     242      case 'h':
     243      case 'H':
     244        precision = H_PRECISION;
     245        exponent_bits = 5;
     246        break;
     247  
     248      case 'b':
     249      case 'B':
     250        precision = B_PRECISION;
     251        exponent_bits = 8;
     252        break;
     253  
     254      case 'f':
     255      case 'F':
     256      case 's':
     257      case 'S':
     258        precision = F_PRECISION;
     259        exponent_bits = 8;
     260        break;
     261  
     262      case 'd':
     263      case 'D':
     264      case 'r':
     265      case 'R':
     266        precision = D_PRECISION;
     267        exponent_bits = 11;
     268        break;
     269  
     270      case 'x':
     271      case 'X':
     272      case 'e':
     273      case 'E':
     274        precision = X_PRECISION;
     275        exponent_bits = 15;
     276        break;
     277  
     278      case 'p':
     279      case 'P':
     280        precision = P_PRECISION;
     281        exponent_bits = -1;
     282        break;
     283  
     284      default:
     285        make_invalid_floating_point_number (words);
     286        return (NULL);
     287      }
     288  
     289    return atof_ieee_detail (str, precision, exponent_bits, words, NULL);
     290  }
     291  
     292  /* Turn generic_floating_point_number into a real float/double/extended.  */
     293  
     294  int
     295  gen_to_words (LITTLENUM_TYPE *words, int precision, long exponent_bits)
     296  {
     297    int return_value = 0;
     298  
     299    long exponent_1;
     300    long exponent_2;
     301    long exponent_3;
     302    long exponent_4;
     303    int exponent_skippage;
     304    LITTLENUM_TYPE word1;
     305    LITTLENUM_TYPE *lp;
     306    LITTLENUM_TYPE *words_end;
     307  
     308    words_end = words + precision;
     309  #ifdef TC_M68K
     310    if (precision == X_PRECISION)
     311      /* On the m68k the extended precision format has a gap of 16 bits
     312         between the exponent and the mantissa.  */
     313      words_end++;
     314  #endif
     315  
     316    if (generic_floating_point_number.low > generic_floating_point_number.leader)
     317      {
     318        /* 0.0e0 seen.  */
     319        if (generic_floating_point_number.sign == '+')
     320  	words[0] = 0x0000;
     321        else
     322  	words[0] = 0x8000;
     323        memset (&words[1], '\0',
     324  	      (words_end - words - 1) * sizeof (LITTLENUM_TYPE));
     325        return return_value;
     326      }
     327  
     328    switch (generic_floating_point_number.sign)
     329      {
     330      /* NaN:  Do the right thing.  */
     331      case 0:
     332      case 'Q': case 'q':
     333      case 'S': case 's':
     334        if (TC_LARGEST_EXPONENT_IS_NORMAL (precision))
     335  	as_warn (_("NaNs are not supported by this target"));
     336  
     337        if (precision == H_PRECISION)
     338  	{
     339  	  if (TOUPPER (generic_floating_point_number.sign) != 'S')
     340  	    words[0] = 0x7fff;
     341  	  else
     342  	    words[0] = exponent_bits == 5 ? 0x7dff : 0x7fbf;
     343  	}
     344        else if (precision == F_PRECISION)
     345  	{
     346  	  words[0] = TOUPPER (generic_floating_point_number.sign) == 'S'
     347  	             ? 0x7fbf : 0x7fff;
     348  	  words[1] = 0xffff;
     349  	}
     350        else if (precision == X_PRECISION)
     351  	{
     352  #ifdef TC_M68K
     353  	  if (generic_floating_point_number.sign)
     354  	    as_warn (_("NaN flavors are not supported by this target"));
     355  
     356  	  words[0] = 0x7fff;
     357  	  words[1] = 0;
     358  	  words[2] = 0xffff;
     359  	  words[3] = 0xffff;
     360  	  words[4] = 0xffff;
     361  	  words[5] = 0xffff;
     362  #else /* ! TC_M68K  */
     363  #ifdef TC_I386
     364  	  words[0] = 0x7fff;
     365  	  words[1] = TOUPPER (generic_floating_point_number.sign) == 'S'
     366  		     ? 0xbfff : 0xffff;
     367  	  words[2] = 0xffff;
     368  	  words[3] = 0xffff;
     369  	  words[4] = 0xffff;
     370  #else /* ! TC_I386  */
     371  	  abort ();
     372  #endif /* ! TC_I386  */
     373  #endif /* ! TC_M68K  */
     374  	}
     375        else
     376  	{
     377  	  words[0] = TOUPPER (generic_floating_point_number.sign) == 'S'
     378  	             ? 0x7ff7 : 0x7fff;
     379  	  words[1] = 0xffff;
     380  	  words[2] = 0xffff;
     381  	  words[3] = 0xffff;
     382  	}
     383  
     384        if (ISLOWER (generic_floating_point_number.sign))
     385  	words[0] |= 0x8000;
     386  
     387        return return_value;
     388  
     389      case 'P':
     390      case 'N':
     391        if (TC_LARGEST_EXPONENT_IS_NORMAL (precision))
     392  	as_warn (_("Infinities are not supported by this target"));
     393  
     394        /* +INF:  Do the right thing.  */
     395        if (precision == H_PRECISION /* also B_PRECISION */)
     396  	{
     397  	  words[0] = exponent_bits == 5 ? 0x7c00 : 0x7f80;
     398  	}
     399        else if (precision == F_PRECISION)
     400  	{
     401  	  words[0] = 0x7f80;
     402  	  words[1] = 0;
     403  	}
     404        else if (precision == X_PRECISION)
     405  	{
     406  #ifdef TC_M68K
     407  	  words[0] = 0x7fff;
     408  	  words[1] = 0;
     409  	  words[2] = 0;
     410  	  words[3] = 0;
     411  	  words[4] = 0;
     412  	  words[5] = 0;
     413  #else /* ! TC_M68K  */
     414  #ifdef TC_I386
     415  	  words[0] = 0x7fff;
     416  	  words[1] = 0x8000;
     417  	  words[2] = 0;
     418  	  words[3] = 0;
     419  	  words[4] = 0;
     420  #else /* ! TC_I386  */
     421  	  abort ();
     422  #endif /* ! TC_I386  */
     423  #endif /* ! TC_M68K  */
     424  	}
     425        else
     426  	{
     427  	  words[0] = 0x7ff0;
     428  	  words[1] = 0;
     429  	  words[2] = 0;
     430  	  words[3] = 0;
     431  	}
     432  
     433        if (generic_floating_point_number.sign == 'N')
     434  	words[0] |= 0x8000;
     435  
     436        return return_value;
     437      }
     438  
     439    /* The floating point formats we support have:
     440       Bit 15 is sign bit.
     441       Bits 14:n are excess-whatever exponent.
     442       Bits n-1:0 (if any) are most significant bits of fraction.
     443       Bits 15:0 of the next word(s) are the next most significant bits.
     444  
     445       So we need: number of bits of exponent, number of bits of
     446       mantissa.  */
     447    bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS;
     448    littlenum_pointer = generic_floating_point_number.leader;
     449    littlenums_left = (1
     450  		     + generic_floating_point_number.leader
     451  		     - generic_floating_point_number.low);
     452  
     453    /* Seek (and forget) 1st significant bit.  */
     454    for (exponent_skippage = 0; !next_bits (1); ++exponent_skippage);
     455    exponent_1 = (generic_floating_point_number.exponent
     456  		+ generic_floating_point_number.leader
     457  		+ 1
     458  		- generic_floating_point_number.low);
     459  
     460    /* Radix LITTLENUM_RADIX, point just higher than
     461       generic_floating_point_number.leader.  */
     462    exponent_2 = exponent_1 * LITTLENUM_NUMBER_OF_BITS;
     463  
     464    /* Radix 2.  */
     465    exponent_3 = exponent_2 - exponent_skippage;
     466  
     467    /* Forget leading zeros, forget 1st bit.  */
     468    exponent_4 = exponent_3 + ((1 << (exponent_bits - 1)) - 2);
     469  
     470    /* Offset exponent.  */
     471    lp = words;
     472  
     473    /* Word 1.  Sign, exponent and perhaps high bits.  */
     474    word1 = ((generic_floating_point_number.sign == '+')
     475  	   ? 0
     476  	   : (1 << (LITTLENUM_NUMBER_OF_BITS - 1)));
     477  
     478    /* Assume 2's complement integers.  */
     479    if (exponent_4 <= 0)
     480      {
     481        int prec_bits;
     482        int num_bits;
     483  
     484        unget_bits (1);
     485        num_bits = -exponent_4;
     486        prec_bits =
     487  	LITTLENUM_NUMBER_OF_BITS * precision - (exponent_bits + 1 + num_bits);
     488  #ifdef TC_I386
     489        if (precision == X_PRECISION && exponent_bits == 15)
     490  	{
     491  	  /* On the i386 a denormalized extended precision float is
     492  	     shifted down by one, effectively decreasing the exponent
     493  	     bias by one.  */
     494  	  prec_bits -= 1;
     495  	  num_bits += 1;
     496  	}
     497  #endif
     498  
     499        if (num_bits >= LITTLENUM_NUMBER_OF_BITS - exponent_bits)
     500  	{
     501  	  /* Bigger than one littlenum.  */
     502  	  num_bits -= (LITTLENUM_NUMBER_OF_BITS - 1) - exponent_bits;
     503  	  *lp++ = word1;
     504  	  if (num_bits + exponent_bits + 1
     505  	      > precision * LITTLENUM_NUMBER_OF_BITS)
     506  	    {
     507  	      /* Exponent overflow.  */
     508  	      make_invalid_floating_point_number (words);
     509  	      return return_value;
     510  	    }
     511  #ifdef TC_M68K
     512  	  if (precision == X_PRECISION && exponent_bits == 15)
     513  	    *lp++ = 0;
     514  #endif
     515  	  while (num_bits >= LITTLENUM_NUMBER_OF_BITS)
     516  	    {
     517  	      num_bits -= LITTLENUM_NUMBER_OF_BITS;
     518  	      *lp++ = 0;
     519  	    }
     520  	  if (num_bits)
     521  	    *lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS - (num_bits));
     522  	}
     523        else
     524  	{
     525  	  if (precision == X_PRECISION && exponent_bits == 15)
     526  	    {
     527  	      *lp++ = word1;
     528  #ifdef TC_M68K
     529  	      *lp++ = 0;
     530  #endif
     531  	      *lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS - num_bits);
     532  	    }
     533  	  else
     534  	    {
     535  	      word1 |= next_bits ((LITTLENUM_NUMBER_OF_BITS - 1)
     536  				  - (exponent_bits + num_bits));
     537  	      *lp++ = word1;
     538  	    }
     539  	}
     540        while (lp < words_end)
     541  	*lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS);
     542  
     543        /* Round the mantissa up, but don't change the number.  */
     544        if (next_bits (1))
     545  	{
     546  	  --lp;
     547  	  if (prec_bits >= LITTLENUM_NUMBER_OF_BITS)
     548  	    {
     549  	      int n = 0;
     550  	      int tmp_bits;
     551  
     552  	      n = 0;
     553  	      tmp_bits = prec_bits;
     554  	      while (tmp_bits > LITTLENUM_NUMBER_OF_BITS)
     555  		{
     556  		  if (lp[n] != (LITTLENUM_TYPE) - 1)
     557  		    break;
     558  		  --n;
     559  		  tmp_bits -= LITTLENUM_NUMBER_OF_BITS;
     560  		}
     561  	      if (tmp_bits > LITTLENUM_NUMBER_OF_BITS
     562  		  || (lp[n] & mask[tmp_bits]) != mask[tmp_bits]
     563  		  || (prec_bits != (precision * LITTLENUM_NUMBER_OF_BITS
     564  				    - exponent_bits - 1)
     565  #ifdef TC_I386
     566  		      /* An extended precision float with only the integer
     567  			 bit set would be invalid.  That must be converted
     568  			 to the smallest normalized number.  */
     569  		      && !(precision == X_PRECISION
     570  			   && prec_bits == (precision * LITTLENUM_NUMBER_OF_BITS
     571  					    - exponent_bits - 2))
     572  #endif
     573  		      ))
     574  		{
     575  		  unsigned long carry;
     576  
     577  		  for (carry = 1; carry && (lp >= words); lp--)
     578  		    {
     579  		      carry = *lp + carry;
     580  		      *lp = carry;
     581  		      carry >>= LITTLENUM_NUMBER_OF_BITS;
     582  		    }
     583  		}
     584  	      else
     585  		{
     586  		  /* This is an overflow of the denormal numbers.  We
     587                       need to forget what we have produced, and instead
     588                       generate the smallest normalized number.  */
     589  		  lp = words;
     590  		  word1 = ((generic_floating_point_number.sign == '+')
     591  			   ? 0
     592  			   : (1 << (LITTLENUM_NUMBER_OF_BITS - 1)));
     593  		  word1 |= (1
     594  			    << ((LITTLENUM_NUMBER_OF_BITS - 1)
     595  				- exponent_bits));
     596  		  *lp++ = word1;
     597  #ifdef TC_I386
     598  		  /* Set the integer bit in the extended precision format.
     599  		     This cannot happen on the m68k where the mantissa
     600  		     just overflows into the integer bit above.  */
     601  		  if (precision == X_PRECISION)
     602  		    *lp++ = 1 << (LITTLENUM_NUMBER_OF_BITS - 1);
     603  #endif
     604  		  while (lp < words_end)
     605  		    *lp++ = 0;
     606  		}
     607  	    }
     608  	  else
     609  	    *lp += 1;
     610  	}
     611  
     612        return return_value;
     613      }
     614    else if ((unsigned long) exponent_4 > mask[exponent_bits]
     615  	   || (! TC_LARGEST_EXPONENT_IS_NORMAL (precision)
     616  	       && (unsigned long) exponent_4 == mask[exponent_bits]))
     617      {
     618        /* Exponent overflow.  Lose immediately.  */
     619  
     620        /* We leave return_value alone: admit we read the
     621  	 number, but return a floating exception
     622  	 because we can't encode the number.  */
     623        make_invalid_floating_point_number (words);
     624        return return_value;
     625      }
     626    else
     627      {
     628        word1 |= (exponent_4 << ((LITTLENUM_NUMBER_OF_BITS - 1) - exponent_bits))
     629  	| next_bits ((LITTLENUM_NUMBER_OF_BITS - 1) - exponent_bits);
     630      }
     631  
     632    *lp++ = word1;
     633  
     634    /* X_PRECISION is special: on the 68k, it has 16 bits of zero in the
     635       middle.  Either way, it is then followed by a 1 bit.  */
     636    if (exponent_bits == 15 && precision == X_PRECISION)
     637      {
     638  #ifdef TC_M68K
     639        *lp++ = 0;
     640  #endif
     641        *lp++ = (1 << (LITTLENUM_NUMBER_OF_BITS - 1)
     642  	       | next_bits (LITTLENUM_NUMBER_OF_BITS - 1));
     643      }
     644  
     645    /* The rest of the words are just mantissa bits.  */
     646    while (lp < words_end)
     647      *lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS);
     648  
     649    if (next_bits (1))
     650      {
     651        unsigned long carry;
     652        /* Since the NEXT bit is a 1, round UP the mantissa.
     653  	 The cunning design of these hidden-1 floats permits
     654  	 us to let the mantissa overflow into the exponent, and
     655  	 it 'does the right thing'. However, we lose if the
     656  	 highest-order bit of the lowest-order word flips.
     657  	 Is that clear?  */
     658  
     659        /* #if (sizeof(carry)) < ((sizeof(bits[0]) * BITS_PER_CHAR) + 2)
     660  	 Please allow at least 1 more bit in carry than is in a LITTLENUM.
     661  	 We need that extra bit to hold a carry during a LITTLENUM carry
     662  	 propagation. Another extra bit (kept 0) will assure us that we
     663  	 don't get a sticky sign bit after shifting right, and that
     664  	 permits us to propagate the carry without any masking of bits.
     665  	 #endif */
     666        for (carry = 1, lp--; carry; lp--)
     667  	{
     668  	  carry = *lp + carry;
     669  	  *lp = carry;
     670  	  carry >>= LITTLENUM_NUMBER_OF_BITS;
     671  	  if (lp == words)
     672  	    break;
     673  	}
     674        if (precision == X_PRECISION && exponent_bits == 15)
     675  	{
     676  	  /* Extended precision numbers have an explicit integer bit
     677  	     that we may have to restore.  */
     678  	  if (lp == words)
     679  	    {
     680  #ifdef TC_M68K
     681  	      /* On the m68k there is a gap of 16 bits.  We must
     682  		 explicitly propagate the carry into the exponent.  */
     683  	      words[0] += words[1];
     684  	      words[1] = 0;
     685  	      lp++;
     686  #endif
     687  	      /* Put back the integer bit.  */
     688  	      lp[1] |= 1 << (LITTLENUM_NUMBER_OF_BITS - 1);
     689  	    }
     690  	}
     691        if ((word1 ^ *words) & (1 << (LITTLENUM_NUMBER_OF_BITS - 1)))
     692  	{
     693  	  /* We leave return_value alone: admit we read the number,
     694  	     but return a floating exception because we can't encode
     695  	     the number.  */
     696  	  *words &= ~(1 << (LITTLENUM_NUMBER_OF_BITS - 1));
     697  	}
     698      }
     699    return return_value;
     700  }
     701  
     702  #ifdef TEST
     703  char *
     704  print_gen (gen)
     705       FLONUM_TYPE *gen;
     706  {
     707    FLONUM_TYPE f;
     708    LITTLENUM_TYPE arr[10];
     709    double dv;
     710    float fv;
     711    static char sbuf[40];
     712  
     713    if (gen)
     714      {
     715        f = generic_floating_point_number;
     716        generic_floating_point_number = *gen;
     717      }
     718    gen_to_words (&arr[0], 4, 11);
     719    memcpy (&dv, &arr[0], sizeof (double));
     720    sprintf (sbuf, "%x %x %x %x %.14G   ", arr[0], arr[1], arr[2], arr[3], dv);
     721    gen_to_words (&arr[0], 2, 8);
     722    memcpy (&fv, &arr[0], sizeof (float));
     723    sprintf (sbuf + strlen (sbuf), "%x %x %.12g\n", arr[0], arr[1], fv);
     724  
     725    if (gen)
     726      generic_floating_point_number = f;
     727  
     728    return (sbuf);
     729  }
     730  #endif
     731  
     732  /* This is a utility function called from various tc-*.c files.  It
     733     is here in order to reduce code duplication.
     734  
     735     Turn a string at input_line_pointer into a floating point constant
     736     of type TYPE (a character found in the FLT_CHARS macro), and store
     737     it as LITTLENUMS in the bytes buffer LITP.  The number of chars
     738     emitted is stored in *SIZEP.  BIG_WORDIAN is TRUE if the littlenums
     739     should be emitted most significant littlenum first.
     740  
     741     An error message is returned, or a NULL pointer if everything went OK.  */
     742  
     743  const char *
     744  ieee_md_atof (int type,
     745  	      char *litP,
     746  	      int *sizeP,
     747  	      bool big_wordian)
     748  {
     749    LITTLENUM_TYPE words[MAX_LITTLENUMS];
     750    LITTLENUM_TYPE *wordP;
     751    char *t;
     752    int prec = 0, pad = 0;
     753  
     754    if (strchr (FLT_CHARS, type) != NULL)
     755      {
     756        switch (type)
     757  	{
     758  	case 'H':
     759  	case 'h':
     760  	  prec = H_PRECISION;
     761  	  break;
     762  
     763  	case 'B':
     764  	case 'b':
     765  	  prec = B_PRECISION;
     766  	  break;
     767  
     768  	case 'f':
     769  	case 'F':
     770  	case 's':
     771  	case 'S':
     772  	  prec = F_PRECISION;
     773  	  break;
     774  
     775  	case 'd':
     776  	case 'D':
     777  	case 'r':
     778  	case 'R':
     779  	  prec = D_PRECISION;
     780  	  break;
     781  
     782  	case 't':
     783  	case 'T':
     784  	  prec = X_PRECISION;
     785  	  pad = X_PRECISION_PAD;
     786  	  type = 'x';		/* This is what atof_ieee() understands.  */
     787  	  break;
     788  
     789  	case 'x':
     790  	case 'X':
     791  	case 'p':
     792  	case 'P':
     793  #ifdef TC_M68K
     794  	  /* Note: on the m68k there is a gap of 16 bits (one littlenum)
     795  	     between the exponent and mantissa.  Hence the precision is
     796  	     6 and not 5.  */
     797  	  prec = P_PRECISION + 1;
     798  #else
     799  	  prec = P_PRECISION;
     800  #endif
     801  	  pad = P_PRECISION_PAD;
     802  	  break;
     803  
     804  	default:
     805  	  break;
     806  	}
     807      }
     808    /* The 'f' and 'd' types are always recognised, even if the target has
     809       not put them into the FLT_CHARS macro.  This is because the 'f' type
     810       can come from the .dc.s, .dcb.s, .float or .single pseudo-ops and the
     811       'd' type from the .dc.d, .dbc.d or .double pseudo-ops.
     812  
     813       The 'x' type is not implicitly recognised however, even though it can
     814       be generated by the .dc.x and .dbc.x pseudo-ops because not all targets
     815       can support floating point values that big.  ie the target has to
     816       explicitly allow them by putting them into FLT_CHARS.  */
     817    else if (type == 'f')
     818      prec = F_PRECISION;
     819    else if (type == 'd')
     820      prec = D_PRECISION;
     821  
     822    if (prec == 0)
     823      {
     824        *sizeP = 0;
     825        return _("Unrecognized or unsupported floating point constant");
     826      }
     827  
     828    gas_assert (prec <= MAX_LITTLENUMS);
     829  
     830    t = atof_ieee (input_line_pointer, type, words);
     831    if (t)
     832      input_line_pointer = t;
     833  
     834    *sizeP = (prec + pad) * sizeof (LITTLENUM_TYPE);
     835  
     836    if (big_wordian)
     837      {
     838        for (wordP = words; prec --;)
     839  	{
     840  	  md_number_to_chars (litP, (valueT) (* wordP ++), sizeof (LITTLENUM_TYPE));
     841  	  litP += sizeof (LITTLENUM_TYPE);
     842  	}
     843      }
     844    else
     845      {
     846        for (wordP = words + prec; prec --;)
     847  	{
     848  	  md_number_to_chars (litP, (valueT) (* -- wordP), sizeof (LITTLENUM_TYPE));
     849  	  litP += sizeof (LITTLENUM_TYPE);
     850  	}
     851      }
     852  
     853    memset (litP, 0, pad * sizeof (LITTLENUM_TYPE));
     854    litP += pad * sizeof (LITTLENUM_TYPE);
     855  
     856    return NULL;
     857  }