Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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