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