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