Raise WARNS to 6 and silence resulting warnings.
[dragonfly.git] / contrib / gdb-6 / gdb / doublest.c
blobc7ca993b24f5f4d647eec58a4a84b39d5f7a9bd7
1 /* Floating point routines for GDB, the GNU debugger.
3 Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
4 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007
5 Free Software Foundation, Inc.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 /* Support for converting target fp numbers into host DOUBLEST format. */
24 /* XXX - This code should really be in libiberty/floatformat.c,
25 however configuration issues with libiberty made this very
26 difficult to do in the available time. */
28 #include "defs.h"
29 #include "doublest.h"
30 #include "floatformat.h"
31 #include "gdb_assert.h"
32 #include "gdb_string.h"
33 #include "gdbtypes.h"
34 #include <math.h> /* ldexp */
36 /* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
37 going to bother with trying to muck around with whether it is defined in
38 a system header, what we do if not, etc. */
39 #define FLOATFORMAT_CHAR_BIT 8
41 /* The number of bytes that the largest floating-point type that we
42 can convert to doublest will need. */
43 #define FLOATFORMAT_LARGEST_BYTES 16
45 /* Extract a field which starts at START and is LEN bytes long. DATA and
46 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
47 static unsigned long
48 get_field (const bfd_byte *data, enum floatformat_byteorders order,
49 unsigned int total_len, unsigned int start, unsigned int len)
51 unsigned long result;
52 unsigned int cur_byte;
53 int cur_bitshift;
55 /* Caller must byte-swap words before calling this routine. */
56 gdb_assert (order == floatformat_little || order == floatformat_big);
58 /* Start at the least significant part of the field. */
59 if (order == floatformat_little)
61 /* We start counting from the other end (i.e, from the high bytes
62 rather than the low bytes). As such, we need to be concerned
63 with what happens if bit 0 doesn't start on a byte boundary.
64 I.e, we need to properly handle the case where total_len is
65 not evenly divisible by 8. So we compute ``excess'' which
66 represents the number of bits from the end of our starting
67 byte needed to get to bit 0. */
68 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
69 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
70 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
71 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
72 - FLOATFORMAT_CHAR_BIT;
74 else
76 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
77 cur_bitshift =
78 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
80 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
81 result = *(data + cur_byte) >> (-cur_bitshift);
82 else
83 result = 0;
84 cur_bitshift += FLOATFORMAT_CHAR_BIT;
85 if (order == floatformat_little)
86 ++cur_byte;
87 else
88 --cur_byte;
90 /* Move towards the most significant part of the field. */
91 while (cur_bitshift < len)
93 result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
94 cur_bitshift += FLOATFORMAT_CHAR_BIT;
95 switch (order)
97 case floatformat_little:
98 ++cur_byte;
99 break;
100 case floatformat_big:
101 --cur_byte;
102 break;
105 if (len < sizeof(result) * FLOATFORMAT_CHAR_BIT)
106 /* Mask out bits which are not part of the field */
107 result &= ((1UL << len) - 1);
108 return result;
111 /* Normalize the byte order of FROM into TO. If no normalization is
112 needed then FMT->byteorder is returned and TO is not changed;
113 otherwise the format of the normalized form in TO is returned. */
115 static enum floatformat_byteorders
116 floatformat_normalize_byteorder (const struct floatformat *fmt,
117 const void *from, void *to)
119 const unsigned char *swapin;
120 unsigned char *swapout;
121 int words;
123 if (fmt->byteorder == floatformat_little
124 || fmt->byteorder == floatformat_big)
125 return fmt->byteorder;
127 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
128 words >>= 2;
130 swapout = (unsigned char *)to;
131 swapin = (const unsigned char *)from;
133 if (fmt->byteorder == floatformat_vax)
135 while (words-- > 0)
137 *swapout++ = swapin[1];
138 *swapout++ = swapin[0];
139 *swapout++ = swapin[3];
140 *swapout++ = swapin[2];
141 swapin += 4;
143 /* This may look weird, since VAX is little-endian, but it is
144 easier to translate to big-endian than to little-endian. */
145 return floatformat_big;
147 else
149 gdb_assert (fmt->byteorder == floatformat_littlebyte_bigword);
151 while (words-- > 0)
153 *swapout++ = swapin[3];
154 *swapout++ = swapin[2];
155 *swapout++ = swapin[1];
156 *swapout++ = swapin[0];
157 swapin += 4;
159 return floatformat_big;
163 /* Convert from FMT to a DOUBLEST.
164 FROM is the address of the extended float.
165 Store the DOUBLEST in *TO. */
167 static void
168 convert_floatformat_to_doublest (const struct floatformat *fmt,
169 const void *from,
170 DOUBLEST *to)
172 unsigned char *ufrom = (unsigned char *) from;
173 DOUBLEST dto;
174 long exponent;
175 unsigned long mant;
176 unsigned int mant_bits, mant_off;
177 int mant_bits_left;
178 int special_exponent; /* It's a NaN, denorm or zero */
179 enum floatformat_byteorders order;
180 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
181 enum float_kind kind;
183 gdb_assert (fmt->totalsize
184 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
186 /* For non-numbers, reuse libiberty's logic to find the correct
187 format. We do not lose any precision in this case by passing
188 through a double. */
189 kind = floatformat_classify (fmt, from);
190 if (kind == float_infinite || kind == float_nan)
192 double dto;
193 floatformat_to_double (fmt, from, &dto);
194 *to = (DOUBLEST) dto;
195 return;
198 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
200 if (order != fmt->byteorder)
201 ufrom = newfrom;
203 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
204 fmt->exp_len);
205 /* Note that if exponent indicates a NaN, we can't really do anything useful
206 (not knowing if the host has NaN's, or how to build one). So it will
207 end up as an infinity or something close; that is OK. */
209 mant_bits_left = fmt->man_len;
210 mant_off = fmt->man_start;
211 dto = 0.0;
213 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
215 /* Don't bias NaNs. Use minimum exponent for denorms. For simplicity,
216 we don't check for zero as the exponent doesn't matter. Note the cast
217 to int; exp_bias is unsigned, so it's important to make sure the
218 operation is done in signed arithmetic. */
219 if (!special_exponent)
220 exponent -= fmt->exp_bias;
221 else if (exponent == 0)
222 exponent = 1 - fmt->exp_bias;
224 /* Build the result algebraically. Might go infinite, underflow, etc;
225 who cares. */
227 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
228 increment the exponent by one to account for the integer bit. */
230 if (!special_exponent)
232 if (fmt->intbit == floatformat_intbit_no)
233 dto = ldexp (1.0, exponent);
234 else
235 exponent++;
238 while (mant_bits_left > 0)
240 mant_bits = min (mant_bits_left, 32);
242 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
244 dto += ldexp ((double) mant, exponent - mant_bits);
245 exponent -= mant_bits;
246 mant_off += mant_bits;
247 mant_bits_left -= mant_bits;
250 /* Negate it if negative. */
251 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
252 dto = -dto;
253 *to = dto;
256 static void put_field (unsigned char *, enum floatformat_byteorders,
257 unsigned int,
258 unsigned int, unsigned int, unsigned long);
260 /* Set a field which starts at START and is LEN bytes long. DATA and
261 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
262 static void
263 put_field (unsigned char *data, enum floatformat_byteorders order,
264 unsigned int total_len, unsigned int start, unsigned int len,
265 unsigned long stuff_to_put)
267 unsigned int cur_byte;
268 int cur_bitshift;
270 /* Caller must byte-swap words before calling this routine. */
271 gdb_assert (order == floatformat_little || order == floatformat_big);
273 /* Start at the least significant part of the field. */
274 if (order == floatformat_little)
276 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
277 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
278 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
279 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
280 - FLOATFORMAT_CHAR_BIT;
282 else
284 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
285 cur_bitshift =
286 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
288 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
290 *(data + cur_byte) &=
291 ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1)
292 << (-cur_bitshift));
293 *(data + cur_byte) |=
294 (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
296 cur_bitshift += FLOATFORMAT_CHAR_BIT;
297 if (order == floatformat_little)
298 ++cur_byte;
299 else
300 --cur_byte;
302 /* Move towards the most significant part of the field. */
303 while (cur_bitshift < len)
305 if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
307 /* This is the last byte. */
308 *(data + cur_byte) &=
309 ~((1 << (len - cur_bitshift)) - 1);
310 *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
312 else
313 *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
314 & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
315 cur_bitshift += FLOATFORMAT_CHAR_BIT;
316 if (order == floatformat_little)
317 ++cur_byte;
318 else
319 --cur_byte;
323 #ifdef HAVE_LONG_DOUBLE
324 /* Return the fractional part of VALUE, and put the exponent of VALUE in *EPTR.
325 The range of the returned value is >= 0.5 and < 1.0. This is equivalent to
326 frexp, but operates on the long double data type. */
328 static long double ldfrexp (long double value, int *eptr);
330 static long double
331 ldfrexp (long double value, int *eptr)
333 long double tmp;
334 int exp;
336 /* Unfortunately, there are no portable functions for extracting the exponent
337 of a long double, so we have to do it iteratively by multiplying or dividing
338 by two until the fraction is between 0.5 and 1.0. */
340 if (value < 0.0l)
341 value = -value;
343 tmp = 1.0l;
344 exp = 0;
346 if (value >= tmp) /* Value >= 1.0 */
347 while (value >= tmp)
349 tmp *= 2.0l;
350 exp++;
352 else if (value != 0.0l) /* Value < 1.0 and > 0.0 */
354 while (value < tmp)
356 tmp /= 2.0l;
357 exp--;
359 tmp *= 2.0l;
360 exp++;
363 *eptr = exp;
364 return value / tmp;
366 #endif /* HAVE_LONG_DOUBLE */
369 /* The converse: convert the DOUBLEST *FROM to an extended float and
370 store where TO points. Neither FROM nor TO have any alignment
371 restrictions. */
373 static void
374 convert_doublest_to_floatformat (CONST struct floatformat *fmt,
375 const DOUBLEST *from, void *to)
377 DOUBLEST dfrom;
378 int exponent;
379 DOUBLEST mant;
380 unsigned int mant_bits, mant_off;
381 int mant_bits_left;
382 unsigned char *uto = (unsigned char *) to;
383 enum floatformat_byteorders order = fmt->byteorder;
384 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
386 if (order != floatformat_little)
387 order = floatformat_big;
389 if (order != fmt->byteorder)
390 uto = newto;
392 memcpy (&dfrom, from, sizeof (dfrom));
393 memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
394 / FLOATFORMAT_CHAR_BIT);
395 if (dfrom == 0)
396 return; /* Result is zero */
397 if (dfrom != dfrom) /* Result is NaN */
399 /* From is NaN */
400 put_field (uto, order, fmt->totalsize, fmt->exp_start,
401 fmt->exp_len, fmt->exp_nan);
402 /* Be sure it's not infinity, but NaN value is irrel */
403 put_field (uto, order, fmt->totalsize, fmt->man_start,
404 32, 1);
405 goto finalize_byteorder;
408 /* If negative, set the sign bit. */
409 if (dfrom < 0)
411 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
412 dfrom = -dfrom;
415 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity */
417 /* Infinity exponent is same as NaN's. */
418 put_field (uto, order, fmt->totalsize, fmt->exp_start,
419 fmt->exp_len, fmt->exp_nan);
420 /* Infinity mantissa is all zeroes. */
421 put_field (uto, order, fmt->totalsize, fmt->man_start,
422 fmt->man_len, 0);
423 goto finalize_byteorder;
426 #ifdef HAVE_LONG_DOUBLE
427 mant = ldfrexp (dfrom, &exponent);
428 #else
429 mant = frexp (dfrom, &exponent);
430 #endif
432 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
433 exponent + fmt->exp_bias - 1);
435 mant_bits_left = fmt->man_len;
436 mant_off = fmt->man_start;
437 while (mant_bits_left > 0)
439 unsigned long mant_long;
440 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
442 mant *= 4294967296.0;
443 mant_long = ((unsigned long) mant) & 0xffffffffL;
444 mant -= mant_long;
446 /* If the integer bit is implicit, then we need to discard it.
447 If we are discarding a zero, we should be (but are not) creating
448 a denormalized number which means adjusting the exponent
449 (I think). */
450 if (mant_bits_left == fmt->man_len
451 && fmt->intbit == floatformat_intbit_no)
453 mant_long <<= 1;
454 mant_long &= 0xffffffffL;
455 /* If we are processing the top 32 mantissa bits of a doublest
456 so as to convert to a float value with implied integer bit,
457 we will only be putting 31 of those 32 bits into the
458 final value due to the discarding of the top bit. In the
459 case of a small float value where the number of mantissa
460 bits is less than 32, discarding the top bit does not alter
461 the number of bits we will be adding to the result. */
462 if (mant_bits == 32)
463 mant_bits -= 1;
466 if (mant_bits < 32)
468 /* The bits we want are in the most significant MANT_BITS bits of
469 mant_long. Move them to the least significant. */
470 mant_long >>= 32 - mant_bits;
473 put_field (uto, order, fmt->totalsize,
474 mant_off, mant_bits, mant_long);
475 mant_off += mant_bits;
476 mant_bits_left -= mant_bits;
479 finalize_byteorder:
480 /* Do we need to byte-swap the words in the result? */
481 if (order != fmt->byteorder)
482 floatformat_normalize_byteorder (fmt, newto, to);
485 /* Check if VAL (which is assumed to be a floating point number whose
486 format is described by FMT) is negative. */
489 floatformat_is_negative (const struct floatformat *fmt,
490 const bfd_byte *uval)
492 enum floatformat_byteorders order;
493 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
495 gdb_assert (fmt != NULL);
496 gdb_assert (fmt->totalsize
497 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
499 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
501 if (order != fmt->byteorder)
502 uval = newfrom;
504 return get_field (uval, order, fmt->totalsize, fmt->sign_start, 1);
507 /* Check if VAL is "not a number" (NaN) for FMT. */
509 enum float_kind
510 floatformat_classify (const struct floatformat *fmt,
511 const bfd_byte *uval)
513 long exponent;
514 unsigned long mant;
515 unsigned int mant_bits, mant_off;
516 int mant_bits_left;
517 enum floatformat_byteorders order;
518 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
519 int mant_zero;
521 gdb_assert (fmt != NULL);
522 gdb_assert (fmt->totalsize
523 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
525 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
527 if (order != fmt->byteorder)
528 uval = newfrom;
530 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
531 fmt->exp_len);
533 mant_bits_left = fmt->man_len;
534 mant_off = fmt->man_start;
536 mant_zero = 1;
537 while (mant_bits_left > 0)
539 mant_bits = min (mant_bits_left, 32);
541 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
543 /* If there is an explicit integer bit, mask it off. */
544 if (mant_off == fmt->man_start
545 && fmt->intbit == floatformat_intbit_yes)
546 mant &= ~(1 << (mant_bits - 1));
548 if (mant)
550 mant_zero = 0;
551 break;
554 mant_off += mant_bits;
555 mant_bits_left -= mant_bits;
558 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
559 supported. */
560 if (! fmt->exp_nan)
562 if (mant_zero)
563 return float_zero;
564 else
565 return float_normal;
568 if (exponent == 0 && !mant_zero)
569 return float_subnormal;
571 if (exponent == fmt->exp_nan)
573 if (mant_zero)
574 return float_infinite;
575 else
576 return float_nan;
579 if (mant_zero)
580 return float_zero;
582 return float_normal;
585 /* Convert the mantissa of VAL (which is assumed to be a floating
586 point number whose format is described by FMT) into a hexadecimal
587 and store it in a static string. Return a pointer to that string. */
589 const char *
590 floatformat_mantissa (const struct floatformat *fmt,
591 const bfd_byte *val)
593 unsigned char *uval = (unsigned char *) val;
594 unsigned long mant;
595 unsigned int mant_bits, mant_off;
596 int mant_bits_left;
597 static char res[50];
598 char buf[9];
599 int len;
600 enum floatformat_byteorders order;
601 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
603 gdb_assert (fmt != NULL);
604 gdb_assert (fmt->totalsize
605 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
607 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
609 if (order != fmt->byteorder)
610 uval = newfrom;
612 if (! fmt->exp_nan)
613 return 0;
615 /* Make sure we have enough room to store the mantissa. */
616 gdb_assert (sizeof res > ((fmt->man_len + 7) / 8) * 2);
618 mant_off = fmt->man_start;
619 mant_bits_left = fmt->man_len;
620 mant_bits = (mant_bits_left % 32) > 0 ? mant_bits_left % 32 : 32;
622 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
624 len = xsnprintf (res, sizeof res, "%lx", mant);
626 mant_off += mant_bits;
627 mant_bits_left -= mant_bits;
629 while (mant_bits_left > 0)
631 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
633 xsnprintf (buf, sizeof buf, "%08lx", mant);
634 gdb_assert (len + strlen (buf) <= sizeof res);
635 strcat (res, buf);
637 mant_off += 32;
638 mant_bits_left -= 32;
641 return res;
645 /* Convert TO/FROM target to the hosts DOUBLEST floating-point format.
647 If the host and target formats agree, we just copy the raw data
648 into the appropriate type of variable and return, letting the host
649 increase precision as necessary. Otherwise, we call the conversion
650 routine and let it do the dirty work. */
652 static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
653 static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
654 static const struct floatformat *host_long_double_format = GDB_HOST_LONG_DOUBLE_FORMAT;
656 void
657 floatformat_to_doublest (const struct floatformat *fmt,
658 const void *in, DOUBLEST *out)
660 gdb_assert (fmt != NULL);
661 if (fmt == host_float_format)
663 float val;
664 memcpy (&val, in, sizeof (val));
665 *out = val;
667 else if (fmt == host_double_format)
669 double val;
670 memcpy (&val, in, sizeof (val));
671 *out = val;
673 else if (fmt == host_long_double_format)
675 long double val;
676 memcpy (&val, in, sizeof (val));
677 *out = val;
679 else
680 convert_floatformat_to_doublest (fmt, in, out);
683 void
684 floatformat_from_doublest (const struct floatformat *fmt,
685 const DOUBLEST *in, void *out)
687 gdb_assert (fmt != NULL);
688 if (fmt == host_float_format)
690 float val = *in;
691 memcpy (out, &val, sizeof (val));
693 else if (fmt == host_double_format)
695 double val = *in;
696 memcpy (out, &val, sizeof (val));
698 else if (fmt == host_long_double_format)
700 long double val = *in;
701 memcpy (out, &val, sizeof (val));
703 else
704 convert_doublest_to_floatformat (fmt, in, out);
708 /* Return a floating-point format for a floating-point variable of
709 length LEN. If no suitable floating-point format is found, an
710 error is thrown.
712 We need this functionality since information about the
713 floating-point format of a type is not always available to GDB; the
714 debug information typically only tells us the size of a
715 floating-point type.
717 FIXME: kettenis/2001-10-28: In many places, particularly in
718 target-dependent code, the format of floating-point types is known,
719 but not passed on by GDB. This should be fixed. */
721 static const struct floatformat *
722 floatformat_from_length (int len)
724 const struct floatformat *format;
725 if (len * TARGET_CHAR_BIT == gdbarch_float_bit (current_gdbarch))
726 format = gdbarch_float_format (current_gdbarch)
727 [gdbarch_byte_order (current_gdbarch)];
728 else if (len * TARGET_CHAR_BIT == gdbarch_double_bit (current_gdbarch))
729 format = gdbarch_double_format (current_gdbarch)
730 [gdbarch_byte_order (current_gdbarch)];
731 else if (len * TARGET_CHAR_BIT == gdbarch_long_double_bit (current_gdbarch))
732 format = gdbarch_long_double_format (current_gdbarch)
733 [gdbarch_byte_order (current_gdbarch)];
734 /* On i386 the 'long double' type takes 96 bits,
735 while the real number of used bits is only 80,
736 both in processor and in memory.
737 The code below accepts the real bit size. */
738 else if ((gdbarch_long_double_format (current_gdbarch) != NULL)
739 && (len * TARGET_CHAR_BIT ==
740 gdbarch_long_double_format (current_gdbarch)[0]->totalsize))
741 format = gdbarch_long_double_format (current_gdbarch)
742 [gdbarch_byte_order (current_gdbarch)];
743 else
744 format = NULL;
745 if (format == NULL)
746 error (_("Unrecognized %d-bit floating-point type."),
747 len * TARGET_CHAR_BIT);
748 return format;
751 const struct floatformat *
752 floatformat_from_type (const struct type *type)
754 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
755 if (TYPE_FLOATFORMAT (type) != NULL)
756 return TYPE_FLOATFORMAT (type)[gdbarch_byte_order (current_gdbarch)];
757 else
758 return floatformat_from_length (TYPE_LENGTH (type));
761 /* If the host doesn't define NAN, use zero instead. */
762 #ifndef NAN
763 #define NAN 0.0
764 #endif
766 /* Extract a floating-point number of length LEN from a target-order
767 byte-stream at ADDR. Returns the value as type DOUBLEST. */
769 static DOUBLEST
770 extract_floating_by_length (const void *addr, int len)
772 const struct floatformat *fmt = floatformat_from_length (len);
773 DOUBLEST val;
775 floatformat_to_doublest (fmt, addr, &val);
776 return val;
779 DOUBLEST
780 deprecated_extract_floating (const void *addr, int len)
782 return extract_floating_by_length (addr, len);
785 /* Store VAL as a floating-point number of length LEN to a
786 target-order byte-stream at ADDR. */
788 static void
789 store_floating_by_length (void *addr, int len, DOUBLEST val)
791 const struct floatformat *fmt = floatformat_from_length (len);
793 floatformat_from_doublest (fmt, &val, addr);
796 void
797 deprecated_store_floating (void *addr, int len, DOUBLEST val)
799 store_floating_by_length (addr, len, val);
802 /* Extract a floating-point number of type TYPE from a target-order
803 byte-stream at ADDR. Returns the value as type DOUBLEST. */
805 DOUBLEST
806 extract_typed_floating (const void *addr, const struct type *type)
808 DOUBLEST retval;
810 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
812 if (TYPE_FLOATFORMAT (type) == NULL)
813 /* Not all code remembers to set the FLOATFORMAT (language
814 specific code? stabs?) so handle that here as a special case. */
815 return extract_floating_by_length (addr, TYPE_LENGTH (type));
817 floatformat_to_doublest
818 (TYPE_FLOATFORMAT (type)[gdbarch_byte_order (current_gdbarch)],
819 addr, &retval);
820 return retval;
823 /* Store VAL as a floating-point number of type TYPE to a target-order
824 byte-stream at ADDR. */
826 void
827 store_typed_floating (void *addr, const struct type *type, DOUBLEST val)
829 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
831 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
832 zero out any remaining bytes in the target buffer when TYPE is
833 longer than the actual underlying floating-point format. Perhaps
834 we should store a fixed bitpattern in those remaining bytes,
835 instead of zero, or perhaps we shouldn't touch those remaining
836 bytes at all.
838 NOTE: cagney/2001-10-28: With the way things currently work, it
839 isn't a good idea to leave the end bits undefined. This is
840 because GDB writes out the entire sizeof(<floating>) bits of the
841 floating-point type even though the value might only be stored
842 in, and the target processor may only refer to, the first N <
843 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
844 initialized, GDB would write undefined data to the target. An
845 errant program, refering to that undefined data, would then
846 become non-deterministic.
848 See also the function convert_typed_floating below. */
849 memset (addr, 0, TYPE_LENGTH (type));
851 if (TYPE_FLOATFORMAT (type) == NULL)
852 /* Not all code remembers to set the FLOATFORMAT (language
853 specific code? stabs?) so handle that here as a special case. */
854 store_floating_by_length (addr, TYPE_LENGTH (type), val);
855 else
856 floatformat_from_doublest
857 (TYPE_FLOATFORMAT (type)[gdbarch_byte_order (current_gdbarch)],
858 &val, addr);
861 /* Convert a floating-point number of type FROM_TYPE from a
862 target-order byte-stream at FROM to a floating-point number of type
863 TO_TYPE, and store it to a target-order byte-stream at TO. */
865 void
866 convert_typed_floating (const void *from, const struct type *from_type,
867 void *to, const struct type *to_type)
869 const struct floatformat *from_fmt = floatformat_from_type (from_type);
870 const struct floatformat *to_fmt = floatformat_from_type (to_type);
872 gdb_assert (TYPE_CODE (from_type) == TYPE_CODE_FLT);
873 gdb_assert (TYPE_CODE (to_type) == TYPE_CODE_FLT);
875 if (from_fmt == NULL || to_fmt == NULL)
877 /* If we don't know the floating-point format of FROM_TYPE or
878 TO_TYPE, there's not much we can do. We might make the
879 assumption that if the length of FROM_TYPE and TO_TYPE match,
880 their floating-point format would match too, but that
881 assumption might be wrong on targets that support
882 floating-point types that only differ in endianness for
883 example. So we warn instead, and zero out the target buffer. */
884 warning (_("Can't convert floating-point number to desired type."));
885 memset (to, 0, TYPE_LENGTH (to_type));
887 else if (from_fmt == to_fmt)
889 /* We're in business. The floating-point format of FROM_TYPE
890 and TO_TYPE match. However, even though the floating-point
891 format matches, the length of the type might still be
892 different. Make sure we don't overrun any buffers. See
893 comment in store_typed_floating for a discussion about
894 zeroing out remaining bytes in the target buffer. */
895 memset (to, 0, TYPE_LENGTH (to_type));
896 memcpy (to, from, min (TYPE_LENGTH (from_type), TYPE_LENGTH (to_type)));
898 else
900 /* The floating-point types don't match. The best we can do
901 (aport from simulating the target FPU) is converting to the
902 widest floating-point type supported by the host, and then
903 again to the desired type. */
904 DOUBLEST d;
906 floatformat_to_doublest (from_fmt, from, &d);
907 floatformat_from_doublest (to_fmt, &d, to);
911 const struct floatformat *floatformat_ieee_single[BFD_ENDIAN_UNKNOWN];
912 const struct floatformat *floatformat_ieee_double[BFD_ENDIAN_UNKNOWN];
913 const struct floatformat *floatformat_ieee_quad[BFD_ENDIAN_UNKNOWN];
914 const struct floatformat *floatformat_arm_ext[BFD_ENDIAN_UNKNOWN];
915 const struct floatformat *floatformat_ia64_spill[BFD_ENDIAN_UNKNOWN];
917 extern void _initialize_doublest (void);
919 extern void
920 _initialize_doublest (void)
922 floatformat_ieee_single[BFD_ENDIAN_LITTLE] = &floatformat_ieee_single_little;
923 floatformat_ieee_single[BFD_ENDIAN_BIG] = &floatformat_ieee_single_big;
924 floatformat_ieee_double[BFD_ENDIAN_LITTLE] = &floatformat_ieee_double_little;
925 floatformat_ieee_double[BFD_ENDIAN_BIG] = &floatformat_ieee_double_big;
926 floatformat_arm_ext[BFD_ENDIAN_LITTLE] = &floatformat_arm_ext_littlebyte_bigword;
927 floatformat_arm_ext[BFD_ENDIAN_BIG] = &floatformat_arm_ext_big;
928 floatformat_ia64_spill[BFD_ENDIAN_LITTLE] = &floatformat_ia64_spill_little;
929 floatformat_ia64_spill[BFD_ENDIAN_BIG] = &floatformat_ia64_spill_big;
930 floatformat_ieee_quad[BFD_ENDIAN_LITTLE] = &floatformat_ia64_quad_little;
931 floatformat_ieee_quad[BFD_ENDIAN_BIG] = &floatformat_ia64_quad_big;