1 /* Floating point routines for GDB, the GNU debugger.
3 Copyright (C) 1986, 1988-2001, 2003-2005, 2007-2012 Free Software
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 /* Support for converting target fp numbers into host DOUBLEST format. */
23 /* XXX - This code should really be in libiberty/floatformat.c,
24 however configuration issues with libiberty made this very
25 difficult to do in the available time. */
29 #include "floatformat.h"
30 #include "gdb_assert.h"
31 #include "gdb_string.h"
33 #include <math.h> /* ldexp */
35 /* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
36 going to bother with trying to muck around with whether it is defined in
37 a system header, what we do if not, etc. */
38 #define FLOATFORMAT_CHAR_BIT 8
40 /* The number of bytes that the largest floating-point type that we
41 can convert to doublest will need. */
42 #define FLOATFORMAT_LARGEST_BYTES 16
44 /* Extract a field which starts at START and is LEN bytes long. DATA and
45 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
47 get_field (const bfd_byte *data, enum floatformat_byteorders order,
48 unsigned int total_len, unsigned int start, unsigned int len)
51 unsigned int cur_byte;
54 /* Caller must byte-swap words before calling this routine. */
55 gdb_assert (order == floatformat_little || order == floatformat_big);
57 /* Start at the least significant part of the field. */
58 if (order == floatformat_little)
60 /* We start counting from the other end (i.e, from the high bytes
61 rather than the low bytes). As such, we need to be concerned
62 with what happens if bit 0 doesn't start on a byte boundary.
63 I.e, we need to properly handle the case where total_len is
64 not evenly divisible by 8. So we compute ``excess'' which
65 represents the number of bits from the end of our starting
66 byte needed to get to bit 0. */
67 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;
76 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
78 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
80 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
81 result = *(data + cur_byte) >> (-cur_bitshift);
84 cur_bitshift += FLOATFORMAT_CHAR_BIT;
85 if (order == floatformat_little)
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;
97 case floatformat_little:
100 case floatformat_big:
105 if (len < sizeof(result) * FLOATFORMAT_CHAR_BIT)
106 /* Mask out bits which are not part of the field. */
107 result &= ((1UL << len) - 1);
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;
123 if (fmt->byteorder == floatformat_little
124 || fmt->byteorder == floatformat_big)
125 return fmt->byteorder;
127 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
130 swapout = (unsigned char *)to;
131 swapin = (const unsigned char *)from;
133 if (fmt->byteorder == floatformat_vax)
137 *swapout++ = swapin[1];
138 *swapout++ = swapin[0];
139 *swapout++ = swapin[3];
140 *swapout++ = swapin[2];
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;
149 gdb_assert (fmt->byteorder == floatformat_littlebyte_bigword);
153 *swapout++ = swapin[3];
154 *swapout++ = swapin[2];
155 *swapout++ = swapin[1];
156 *swapout++ = swapin[0];
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. */
168 convert_floatformat_to_doublest (const struct floatformat *fmt,
172 unsigned char *ufrom = (unsigned char *) from;
176 unsigned int mant_bits, mant_off;
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
189 kind = floatformat_classify (fmt, from);
190 if (kind == float_infinite || kind == float_nan)
194 floatformat_to_double (fmt, from, &dto);
195 *to = (DOUBLEST) dto;
199 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
201 if (order != fmt->byteorder)
208 floatformat_to_doublest (fmt->split_half, ufrom, &dtop);
209 /* Preserve the sign of 0, which is the sign of the top
216 floatformat_to_doublest (fmt->split_half,
217 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2,
223 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
225 /* Note that if exponent indicates a NaN, we can't really do anything useful
226 (not knowing if the host has NaN's, or how to build one). So it will
227 end up as an infinity or something close; that is OK. */
229 mant_bits_left = fmt->man_len;
230 mant_off = fmt->man_start;
233 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
235 /* Don't bias NaNs. Use minimum exponent for denorms. For
236 simplicity, we don't check for zero as the exponent doesn't matter.
237 Note the cast to int; exp_bias is unsigned, so it's important to
238 make sure the operation is done in signed arithmetic. */
239 if (!special_exponent)
240 exponent -= fmt->exp_bias;
241 else if (exponent == 0)
242 exponent = 1 - fmt->exp_bias;
244 /* Build the result algebraically. Might go infinite, underflow, etc;
247 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
248 increment the exponent by one to account for the integer bit. */
250 if (!special_exponent)
252 if (fmt->intbit == floatformat_intbit_no)
253 dto = ldexp (1.0, exponent);
258 while (mant_bits_left > 0)
260 mant_bits = min (mant_bits_left, 32);
262 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
264 dto += ldexp ((double) mant, exponent - mant_bits);
265 exponent -= mant_bits;
266 mant_off += mant_bits;
267 mant_bits_left -= mant_bits;
270 /* Negate it if negative. */
271 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
276 /* Set a field which starts at START and is LEN bytes long. DATA and
277 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
279 put_field (unsigned char *data, enum floatformat_byteorders order,
280 unsigned int total_len, unsigned int start, unsigned int len,
281 unsigned long stuff_to_put)
283 unsigned int cur_byte;
286 /* Caller must byte-swap words before calling this routine. */
287 gdb_assert (order == floatformat_little || order == floatformat_big);
289 /* Start at the least significant part of the field. */
290 if (order == floatformat_little)
292 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
294 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
295 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
296 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
297 - FLOATFORMAT_CHAR_BIT;
301 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
303 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
305 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
307 *(data + cur_byte) &=
308 ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1)
310 *(data + cur_byte) |=
311 (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
313 cur_bitshift += FLOATFORMAT_CHAR_BIT;
314 if (order == floatformat_little)
319 /* Move towards the most significant part of the field. */
320 while (cur_bitshift < len)
322 if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
324 /* This is the last byte. */
325 *(data + cur_byte) &=
326 ~((1 << (len - cur_bitshift)) - 1);
327 *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
330 *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
331 & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
332 cur_bitshift += FLOATFORMAT_CHAR_BIT;
333 if (order == floatformat_little)
340 #ifdef HAVE_LONG_DOUBLE
341 /* Return the fractional part of VALUE, and put the exponent of VALUE in *EPTR.
342 The range of the returned value is >= 0.5 and < 1.0. This is equivalent to
343 frexp, but operates on the long double data type. */
345 static long double ldfrexp (long double value, int *eptr);
348 ldfrexp (long double value, int *eptr)
353 /* Unfortunately, there are no portable functions for extracting the
354 exponent of a long double, so we have to do it iteratively by
355 multiplying or dividing by two until the fraction is between 0.5
364 if (value >= tmp) /* Value >= 1.0 */
370 else if (value != 0.0l) /* Value < 1.0 and > 0.0 */
384 #endif /* HAVE_LONG_DOUBLE */
387 /* The converse: convert the DOUBLEST *FROM to an extended float and
388 store where TO points. Neither FROM nor TO have any alignment
392 convert_doublest_to_floatformat (CONST struct floatformat *fmt,
393 const DOUBLEST *from, void *to)
398 unsigned int mant_bits, mant_off;
400 unsigned char *uto = (unsigned char *) to;
401 enum floatformat_byteorders order = fmt->byteorder;
402 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
404 if (order != floatformat_little)
405 order = floatformat_big;
407 if (order != fmt->byteorder)
410 memcpy (&dfrom, from, sizeof (dfrom));
411 memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
412 / FLOATFORMAT_CHAR_BIT);
416 /* Use static volatile to ensure that any excess precision is
417 removed via storing in memory, and so the top half really is
418 the result of converting to double. */
419 static volatile double dtop, dbot;
420 DOUBLEST dtopnv, dbotnv;
422 dtop = (double) dfrom;
423 /* If the rounded top half is Inf, the bottom must be 0 not NaN
425 if (dtop + dtop == dtop && dtop != 0.0)
428 dbot = (double) (dfrom - (DOUBLEST) dtop);
431 floatformat_from_doublest (fmt->split_half, &dtopnv, uto);
432 floatformat_from_doublest (fmt->split_half, &dbotnv,
434 + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2));
439 return; /* Result is zero */
440 if (dfrom != dfrom) /* Result is NaN */
443 put_field (uto, order, fmt->totalsize, fmt->exp_start,
444 fmt->exp_len, fmt->exp_nan);
445 /* Be sure it's not infinity, but NaN value is irrel. */
446 put_field (uto, order, fmt->totalsize, fmt->man_start,
448 goto finalize_byteorder;
451 /* If negative, set the sign bit. */
454 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
458 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity. */
460 /* Infinity exponent is same as NaN's. */
461 put_field (uto, order, fmt->totalsize, fmt->exp_start,
462 fmt->exp_len, fmt->exp_nan);
463 /* Infinity mantissa is all zeroes. */
464 put_field (uto, order, fmt->totalsize, fmt->man_start,
466 goto finalize_byteorder;
469 #ifdef HAVE_LONG_DOUBLE
470 mant = ldfrexp (dfrom, &exponent);
472 mant = frexp (dfrom, &exponent);
475 if (exponent + fmt->exp_bias <= 0)
477 /* The value is too small to be expressed in the destination
478 type (not enough bits in the exponent. Treat as 0. */
479 put_field (uto, order, fmt->totalsize, fmt->exp_start,
481 put_field (uto, order, fmt->totalsize, fmt->man_start,
483 goto finalize_byteorder;
486 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
488 /* The value is too large to fit into the destination.
489 Treat as infinity. */
490 put_field (uto, order, fmt->totalsize, fmt->exp_start,
491 fmt->exp_len, fmt->exp_nan);
492 put_field (uto, order, fmt->totalsize, fmt->man_start,
494 goto finalize_byteorder;
497 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
498 exponent + fmt->exp_bias - 1);
500 mant_bits_left = fmt->man_len;
501 mant_off = fmt->man_start;
502 while (mant_bits_left > 0)
504 unsigned long mant_long;
506 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
508 mant *= 4294967296.0;
509 mant_long = ((unsigned long) mant) & 0xffffffffL;
512 /* If the integer bit is implicit, then we need to discard it.
513 If we are discarding a zero, we should be (but are not) creating
514 a denormalized number which means adjusting the exponent
516 if (mant_bits_left == fmt->man_len
517 && fmt->intbit == floatformat_intbit_no)
520 mant_long &= 0xffffffffL;
521 /* If we are processing the top 32 mantissa bits of a doublest
522 so as to convert to a float value with implied integer bit,
523 we will only be putting 31 of those 32 bits into the
524 final value due to the discarding of the top bit. In the
525 case of a small float value where the number of mantissa
526 bits is less than 32, discarding the top bit does not alter
527 the number of bits we will be adding to the result. */
534 /* The bits we want are in the most significant MANT_BITS bits of
535 mant_long. Move them to the least significant. */
536 mant_long >>= 32 - mant_bits;
539 put_field (uto, order, fmt->totalsize,
540 mant_off, mant_bits, mant_long);
541 mant_off += mant_bits;
542 mant_bits_left -= mant_bits;
546 /* Do we need to byte-swap the words in the result? */
547 if (order != fmt->byteorder)
548 floatformat_normalize_byteorder (fmt, newto, to);
551 /* Check if VAL (which is assumed to be a floating point number whose
552 format is described by FMT) is negative. */
555 floatformat_is_negative (const struct floatformat *fmt,
556 const bfd_byte *uval)
558 enum floatformat_byteorders order;
559 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
561 gdb_assert (fmt != NULL);
562 gdb_assert (fmt->totalsize
563 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
565 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
567 if (order != fmt->byteorder)
570 return get_field (uval, order, fmt->totalsize, fmt->sign_start, 1);
573 /* Check if VAL is "not a number" (NaN) for FMT. */
576 floatformat_classify (const struct floatformat *fmt,
577 const bfd_byte *uval)
581 unsigned int mant_bits, mant_off;
583 enum floatformat_byteorders order;
584 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
587 gdb_assert (fmt != NULL);
588 gdb_assert (fmt->totalsize
589 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
591 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
593 if (order != fmt->byteorder)
596 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
599 mant_bits_left = fmt->man_len;
600 mant_off = fmt->man_start;
603 while (mant_bits_left > 0)
605 mant_bits = min (mant_bits_left, 32);
607 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
609 /* If there is an explicit integer bit, mask it off. */
610 if (mant_off == fmt->man_start
611 && fmt->intbit == floatformat_intbit_yes)
612 mant &= ~(1 << (mant_bits - 1));
620 mant_off += mant_bits;
621 mant_bits_left -= mant_bits;
624 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
634 if (exponent == 0 && !mant_zero)
635 return float_subnormal;
637 if (exponent == fmt->exp_nan)
640 return float_infinite;
651 /* Convert the mantissa of VAL (which is assumed to be a floating
652 point number whose format is described by FMT) into a hexadecimal
653 and store it in a static string. Return a pointer to that string. */
656 floatformat_mantissa (const struct floatformat *fmt,
659 unsigned char *uval = (unsigned char *) val;
661 unsigned int mant_bits, mant_off;
666 enum floatformat_byteorders order;
667 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
669 gdb_assert (fmt != NULL);
670 gdb_assert (fmt->totalsize
671 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
673 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
675 if (order != fmt->byteorder)
681 /* Make sure we have enough room to store the mantissa. */
682 gdb_assert (sizeof res > ((fmt->man_len + 7) / 8) * 2);
684 mant_off = fmt->man_start;
685 mant_bits_left = fmt->man_len;
686 mant_bits = (mant_bits_left % 32) > 0 ? mant_bits_left % 32 : 32;
688 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
690 len = xsnprintf (res, sizeof res, "%lx", mant);
692 mant_off += mant_bits;
693 mant_bits_left -= mant_bits;
695 while (mant_bits_left > 0)
697 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
699 xsnprintf (buf, sizeof buf, "%08lx", mant);
700 gdb_assert (len + strlen (buf) <= sizeof res);
704 mant_bits_left -= 32;
711 /* Convert TO/FROM target to the hosts DOUBLEST floating-point format.
713 If the host and target formats agree, we just copy the raw data
714 into the appropriate type of variable and return, letting the host
715 increase precision as necessary. Otherwise, we call the conversion
716 routine and let it do the dirty work. */
718 static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
719 static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
720 static const struct floatformat *host_long_double_format
721 = GDB_HOST_LONG_DOUBLE_FORMAT;
724 floatformat_to_doublest (const struct floatformat *fmt,
725 const void *in, DOUBLEST *out)
727 gdb_assert (fmt != NULL);
728 if (fmt == host_float_format)
732 memcpy (&val, in, sizeof (val));
735 else if (fmt == host_double_format)
739 memcpy (&val, in, sizeof (val));
742 else if (fmt == host_long_double_format)
746 memcpy (&val, in, sizeof (val));
750 convert_floatformat_to_doublest (fmt, in, out);
754 floatformat_from_doublest (const struct floatformat *fmt,
755 const DOUBLEST *in, void *out)
757 gdb_assert (fmt != NULL);
758 if (fmt == host_float_format)
762 memcpy (out, &val, sizeof (val));
764 else if (fmt == host_double_format)
768 memcpy (out, &val, sizeof (val));
770 else if (fmt == host_long_double_format)
772 long double val = *in;
774 memcpy (out, &val, sizeof (val));
777 convert_doublest_to_floatformat (fmt, in, out);
781 /* Return a floating-point format for a floating-point variable of
782 length LEN. If no suitable floating-point format is found, an
785 We need this functionality since information about the
786 floating-point format of a type is not always available to GDB; the
787 debug information typically only tells us the size of a
790 FIXME: kettenis/2001-10-28: In many places, particularly in
791 target-dependent code, the format of floating-point types is known,
792 but not passed on by GDB. This should be fixed. */
794 static const struct floatformat *
795 floatformat_from_length (struct gdbarch *gdbarch, int len)
797 const struct floatformat *format;
799 if (len * TARGET_CHAR_BIT == gdbarch_half_bit (gdbarch))
800 format = gdbarch_half_format (gdbarch)
801 [gdbarch_byte_order (gdbarch)];
802 else if (len * TARGET_CHAR_BIT == gdbarch_float_bit (gdbarch))
803 format = gdbarch_float_format (gdbarch)
804 [gdbarch_byte_order (gdbarch)];
805 else if (len * TARGET_CHAR_BIT == gdbarch_double_bit (gdbarch))
806 format = gdbarch_double_format (gdbarch)
807 [gdbarch_byte_order (gdbarch)];
808 else if (len * TARGET_CHAR_BIT == gdbarch_long_double_bit (gdbarch))
809 format = gdbarch_long_double_format (gdbarch)
810 [gdbarch_byte_order (gdbarch)];
811 /* On i386 the 'long double' type takes 96 bits,
812 while the real number of used bits is only 80,
813 both in processor and in memory.
814 The code below accepts the real bit size. */
815 else if ((gdbarch_long_double_format (gdbarch) != NULL)
816 && (len * TARGET_CHAR_BIT
817 == gdbarch_long_double_format (gdbarch)[0]->totalsize))
818 format = gdbarch_long_double_format (gdbarch)
819 [gdbarch_byte_order (gdbarch)];
823 error (_("Unrecognized %d-bit floating-point type."),
824 len * TARGET_CHAR_BIT);
828 const struct floatformat *
829 floatformat_from_type (const struct type *type)
831 struct gdbarch *gdbarch = get_type_arch (type);
833 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
834 if (TYPE_FLOATFORMAT (type) != NULL)
835 return TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)];
837 return floatformat_from_length (gdbarch, TYPE_LENGTH (type));
840 /* Extract a floating-point number of type TYPE from a target-order
841 byte-stream at ADDR. Returns the value as type DOUBLEST. */
844 extract_typed_floating (const void *addr, const struct type *type)
846 const struct floatformat *fmt = floatformat_from_type (type);
849 floatformat_to_doublest (fmt, addr, &retval);
853 /* Store VAL as a floating-point number of type TYPE to a target-order
854 byte-stream at ADDR. */
857 store_typed_floating (void *addr, const struct type *type, DOUBLEST val)
859 const struct floatformat *fmt = floatformat_from_type (type);
861 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
862 zero out any remaining bytes in the target buffer when TYPE is
863 longer than the actual underlying floating-point format. Perhaps
864 we should store a fixed bitpattern in those remaining bytes,
865 instead of zero, or perhaps we shouldn't touch those remaining
868 NOTE: cagney/2001-10-28: With the way things currently work, it
869 isn't a good idea to leave the end bits undefined. This is
870 because GDB writes out the entire sizeof(<floating>) bits of the
871 floating-point type even though the value might only be stored
872 in, and the target processor may only refer to, the first N <
873 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
874 initialized, GDB would write undefined data to the target. An
875 errant program, refering to that undefined data, would then
876 become non-deterministic.
878 See also the function convert_typed_floating below. */
879 memset (addr, 0, TYPE_LENGTH (type));
881 floatformat_from_doublest (fmt, &val, addr);
884 /* Convert a floating-point number of type FROM_TYPE from a
885 target-order byte-stream at FROM to a floating-point number of type
886 TO_TYPE, and store it to a target-order byte-stream at TO. */
889 convert_typed_floating (const void *from, const struct type *from_type,
890 void *to, const struct type *to_type)
892 const struct floatformat *from_fmt = floatformat_from_type (from_type);
893 const struct floatformat *to_fmt = floatformat_from_type (to_type);
895 if (from_fmt == NULL || to_fmt == NULL)
897 /* If we don't know the floating-point format of FROM_TYPE or
898 TO_TYPE, there's not much we can do. We might make the
899 assumption that if the length of FROM_TYPE and TO_TYPE match,
900 their floating-point format would match too, but that
901 assumption might be wrong on targets that support
902 floating-point types that only differ in endianness for
903 example. So we warn instead, and zero out the target buffer. */
904 warning (_("Can't convert floating-point number to desired type."));
905 memset (to, 0, TYPE_LENGTH (to_type));
907 else if (from_fmt == to_fmt)
909 /* We're in business. The floating-point format of FROM_TYPE
910 and TO_TYPE match. However, even though the floating-point
911 format matches, the length of the type might still be
912 different. Make sure we don't overrun any buffers. See
913 comment in store_typed_floating for a discussion about
914 zeroing out remaining bytes in the target buffer. */
915 memset (to, 0, TYPE_LENGTH (to_type));
916 memcpy (to, from, min (TYPE_LENGTH (from_type), TYPE_LENGTH (to_type)));
920 /* The floating-point types don't match. The best we can do
921 (apart from simulating the target FPU) is converting to the
922 widest floating-point type supported by the host, and then
923 again to the desired type. */
926 floatformat_to_doublest (from_fmt, from, &d);
927 floatformat_from_doublest (to_fmt, &d, to);
931 const struct floatformat *floatformat_ieee_single[BFD_ENDIAN_UNKNOWN];
932 const struct floatformat *floatformat_ieee_double[BFD_ENDIAN_UNKNOWN];
933 const struct floatformat *floatformat_ieee_quad[BFD_ENDIAN_UNKNOWN];
934 const struct floatformat *floatformat_arm_ext[BFD_ENDIAN_UNKNOWN];
935 const struct floatformat *floatformat_ia64_spill[BFD_ENDIAN_UNKNOWN];
937 extern void _initialize_doublest (void);
940 _initialize_doublest (void)
942 floatformat_ieee_single[BFD_ENDIAN_LITTLE] = &floatformat_ieee_single_little;
943 floatformat_ieee_single[BFD_ENDIAN_BIG] = &floatformat_ieee_single_big;
944 floatformat_ieee_double[BFD_ENDIAN_LITTLE] = &floatformat_ieee_double_little;
945 floatformat_ieee_double[BFD_ENDIAN_BIG] = &floatformat_ieee_double_big;
946 floatformat_arm_ext[BFD_ENDIAN_LITTLE]
947 = &floatformat_arm_ext_littlebyte_bigword;
948 floatformat_arm_ext[BFD_ENDIAN_BIG] = &floatformat_arm_ext_big;
949 floatformat_ia64_spill[BFD_ENDIAN_LITTLE] = &floatformat_ia64_spill_little;
950 floatformat_ia64_spill[BFD_ENDIAN_BIG] = &floatformat_ia64_spill_big;
951 floatformat_ieee_quad[BFD_ENDIAN_LITTLE] = &floatformat_ia64_quad_little;
952 floatformat_ieee_quad[BFD_ENDIAN_BIG] = &floatformat_ia64_quad_big;