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