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, 2008, 2009, 2010,
5 2011 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. */
30 #include "floatformat.h"
31 #include "gdb_assert.h"
32 #include "gdb_string.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. */
48 get_field (const bfd_byte *data, enum floatformat_byteorders order,
49 unsigned int total_len, unsigned int start, unsigned int len)
52 unsigned int cur_byte;
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);
70 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
71 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
72 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
73 - FLOATFORMAT_CHAR_BIT;
77 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
79 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
81 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
82 result = *(data + cur_byte) >> (-cur_bitshift);
85 cur_bitshift += FLOATFORMAT_CHAR_BIT;
86 if (order == floatformat_little)
91 /* Move towards the most significant part of the field. */
92 while (cur_bitshift < len)
94 result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
95 cur_bitshift += FLOATFORMAT_CHAR_BIT;
98 case floatformat_little:
101 case floatformat_big:
106 if (len < sizeof(result) * FLOATFORMAT_CHAR_BIT)
107 /* Mask out bits which are not part of the field. */
108 result &= ((1UL << len) - 1);
112 /* Normalize the byte order of FROM into TO. If no normalization is
113 needed then FMT->byteorder is returned and TO is not changed;
114 otherwise the format of the normalized form in TO is returned. */
116 static enum floatformat_byteorders
117 floatformat_normalize_byteorder (const struct floatformat *fmt,
118 const void *from, void *to)
120 const unsigned char *swapin;
121 unsigned char *swapout;
124 if (fmt->byteorder == floatformat_little
125 || fmt->byteorder == floatformat_big)
126 return fmt->byteorder;
128 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
131 swapout = (unsigned char *)to;
132 swapin = (const unsigned char *)from;
134 if (fmt->byteorder == floatformat_vax)
138 *swapout++ = swapin[1];
139 *swapout++ = swapin[0];
140 *swapout++ = swapin[3];
141 *swapout++ = swapin[2];
144 /* This may look weird, since VAX is little-endian, but it is
145 easier to translate to big-endian than to little-endian. */
146 return floatformat_big;
150 gdb_assert (fmt->byteorder == floatformat_littlebyte_bigword);
154 *swapout++ = swapin[3];
155 *swapout++ = swapin[2];
156 *swapout++ = swapin[1];
157 *swapout++ = swapin[0];
160 return floatformat_big;
164 /* Convert from FMT to a DOUBLEST.
165 FROM is the address of the extended float.
166 Store the DOUBLEST in *TO. */
169 convert_floatformat_to_doublest (const struct floatformat *fmt,
173 unsigned char *ufrom = (unsigned char *) from;
177 unsigned int mant_bits, mant_off;
179 int special_exponent; /* It's a NaN, denorm or zero. */
180 enum floatformat_byteorders order;
181 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
182 enum float_kind kind;
184 gdb_assert (fmt->totalsize
185 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
187 /* For non-numbers, reuse libiberty's logic to find the correct
188 format. We do not lose any precision in this case by passing
190 kind = floatformat_classify (fmt, from);
191 if (kind == float_infinite || kind == float_nan)
195 floatformat_to_double (fmt, from, &dto);
196 *to = (DOUBLEST) dto;
200 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
202 if (order != fmt->byteorder)
209 floatformat_to_doublest (fmt->split_half, ufrom, &dtop);
210 /* Preserve the sign of 0, which is the sign of the top
217 floatformat_to_doublest (fmt->split_half,
218 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2,
224 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
226 /* Note that if exponent indicates a NaN, we can't really do anything useful
227 (not knowing if the host has NaN's, or how to build one). So it will
228 end up as an infinity or something close; that is OK. */
230 mant_bits_left = fmt->man_len;
231 mant_off = fmt->man_start;
234 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
236 /* Don't bias NaNs. Use minimum exponent for denorms. For
237 simplicity, we don't check for zero as the exponent doesn't matter.
238 Note the cast to int; exp_bias is unsigned, so it's important to
239 make sure the operation is done in signed arithmetic. */
240 if (!special_exponent)
241 exponent -= fmt->exp_bias;
242 else if (exponent == 0)
243 exponent = 1 - fmt->exp_bias;
245 /* Build the result algebraically. Might go infinite, underflow, etc;
248 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
249 increment the exponent by one to account for the integer bit. */
251 if (!special_exponent)
253 if (fmt->intbit == floatformat_intbit_no)
254 dto = ldexp (1.0, exponent);
259 while (mant_bits_left > 0)
261 mant_bits = min (mant_bits_left, 32);
263 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
265 dto += ldexp ((double) mant, exponent - mant_bits);
266 exponent -= mant_bits;
267 mant_off += mant_bits;
268 mant_bits_left -= mant_bits;
271 /* Negate it if negative. */
272 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
277 /* Set a field which starts at START and is LEN bytes long. DATA and
278 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
280 put_field (unsigned char *data, enum floatformat_byteorders order,
281 unsigned int total_len, unsigned int start, unsigned int len,
282 unsigned long stuff_to_put)
284 unsigned int cur_byte;
287 /* Caller must byte-swap words before calling this routine. */
288 gdb_assert (order == floatformat_little || order == floatformat_big);
290 /* Start at the least significant part of the field. */
291 if (order == floatformat_little)
293 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
295 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
296 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
297 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
298 - FLOATFORMAT_CHAR_BIT;
302 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
304 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
306 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
308 *(data + cur_byte) &=
309 ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1)
311 *(data + cur_byte) |=
312 (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
314 cur_bitshift += FLOATFORMAT_CHAR_BIT;
315 if (order == floatformat_little)
320 /* Move towards the most significant part of the field. */
321 while (cur_bitshift < len)
323 if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
325 /* This is the last byte. */
326 *(data + cur_byte) &=
327 ~((1 << (len - cur_bitshift)) - 1);
328 *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
331 *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
332 & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
333 cur_bitshift += FLOATFORMAT_CHAR_BIT;
334 if (order == floatformat_little)
341 #ifdef HAVE_LONG_DOUBLE
342 /* Return the fractional part of VALUE, and put the exponent of VALUE in *EPTR.
343 The range of the returned value is >= 0.5 and < 1.0. This is equivalent to
344 frexp, but operates on the long double data type. */
346 static long double ldfrexp (long double value, int *eptr);
349 ldfrexp (long double value, int *eptr)
354 /* Unfortunately, there are no portable functions for extracting the
355 exponent of a long double, so we have to do it iteratively by
356 multiplying or dividing by two until the fraction is between 0.5
365 if (value >= tmp) /* Value >= 1.0 */
371 else if (value != 0.0l) /* Value < 1.0 and > 0.0 */
385 #endif /* HAVE_LONG_DOUBLE */
388 /* The converse: convert the DOUBLEST *FROM to an extended float and
389 store where TO points. Neither FROM nor TO have any alignment
393 convert_doublest_to_floatformat (CONST struct floatformat *fmt,
394 const DOUBLEST *from, void *to)
399 unsigned int mant_bits, mant_off;
401 unsigned char *uto = (unsigned char *) to;
402 enum floatformat_byteorders order = fmt->byteorder;
403 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
405 if (order != floatformat_little)
406 order = floatformat_big;
408 if (order != fmt->byteorder)
411 memcpy (&dfrom, from, sizeof (dfrom));
412 memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
413 / FLOATFORMAT_CHAR_BIT);
417 /* Use static volatile to ensure that any excess precision is
418 removed via storing in memory, and so the top half really is
419 the result of converting to double. */
420 static volatile double dtop, dbot;
421 DOUBLEST dtopnv, dbotnv;
423 dtop = (double) dfrom;
424 /* If the rounded top half is Inf, the bottom must be 0 not NaN
426 if (dtop + dtop == dtop && dtop != 0.0)
429 dbot = (double) (dfrom - (DOUBLEST) dtop);
432 floatformat_from_doublest (fmt->split_half, &dtopnv, uto);
433 floatformat_from_doublest (fmt->split_half, &dbotnv,
435 + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2));
440 return; /* Result is zero */
441 if (dfrom != dfrom) /* Result is NaN */
444 put_field (uto, order, fmt->totalsize, fmt->exp_start,
445 fmt->exp_len, fmt->exp_nan);
446 /* Be sure it's not infinity, but NaN value is irrel. */
447 put_field (uto, order, fmt->totalsize, fmt->man_start,
449 goto finalize_byteorder;
452 /* If negative, set the sign bit. */
455 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
459 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity. */
461 /* Infinity exponent is same as NaN's. */
462 put_field (uto, order, fmt->totalsize, fmt->exp_start,
463 fmt->exp_len, fmt->exp_nan);
464 /* Infinity mantissa is all zeroes. */
465 put_field (uto, order, fmt->totalsize, fmt->man_start,
467 goto finalize_byteorder;
470 #ifdef HAVE_LONG_DOUBLE
471 mant = ldfrexp (dfrom, &exponent);
473 mant = frexp (dfrom, &exponent);
476 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
477 exponent + fmt->exp_bias - 1);
479 mant_bits_left = fmt->man_len;
480 mant_off = fmt->man_start;
481 while (mant_bits_left > 0)
483 unsigned long mant_long;
485 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
487 mant *= 4294967296.0;
488 mant_long = ((unsigned long) mant) & 0xffffffffL;
491 /* If the integer bit is implicit, then we need to discard it.
492 If we are discarding a zero, we should be (but are not) creating
493 a denormalized number which means adjusting the exponent
495 if (mant_bits_left == fmt->man_len
496 && fmt->intbit == floatformat_intbit_no)
499 mant_long &= 0xffffffffL;
500 /* If we are processing the top 32 mantissa bits of a doublest
501 so as to convert to a float value with implied integer bit,
502 we will only be putting 31 of those 32 bits into the
503 final value due to the discarding of the top bit. In the
504 case of a small float value where the number of mantissa
505 bits is less than 32, discarding the top bit does not alter
506 the number of bits we will be adding to the result. */
513 /* The bits we want are in the most significant MANT_BITS bits of
514 mant_long. Move them to the least significant. */
515 mant_long >>= 32 - mant_bits;
518 put_field (uto, order, fmt->totalsize,
519 mant_off, mant_bits, mant_long);
520 mant_off += mant_bits;
521 mant_bits_left -= mant_bits;
525 /* Do we need to byte-swap the words in the result? */
526 if (order != fmt->byteorder)
527 floatformat_normalize_byteorder (fmt, newto, to);
530 /* Check if VAL (which is assumed to be a floating point number whose
531 format is described by FMT) is negative. */
534 floatformat_is_negative (const struct floatformat *fmt,
535 const bfd_byte *uval)
537 enum floatformat_byteorders order;
538 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
540 gdb_assert (fmt != NULL);
541 gdb_assert (fmt->totalsize
542 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
544 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
546 if (order != fmt->byteorder)
549 return get_field (uval, order, fmt->totalsize, fmt->sign_start, 1);
552 /* Check if VAL is "not a number" (NaN) for FMT. */
555 floatformat_classify (const struct floatformat *fmt,
556 const bfd_byte *uval)
560 unsigned int mant_bits, mant_off;
562 enum floatformat_byteorders order;
563 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
566 gdb_assert (fmt != NULL);
567 gdb_assert (fmt->totalsize
568 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
570 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
572 if (order != fmt->byteorder)
575 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
578 mant_bits_left = fmt->man_len;
579 mant_off = fmt->man_start;
582 while (mant_bits_left > 0)
584 mant_bits = min (mant_bits_left, 32);
586 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
588 /* If there is an explicit integer bit, mask it off. */
589 if (mant_off == fmt->man_start
590 && fmt->intbit == floatformat_intbit_yes)
591 mant &= ~(1 << (mant_bits - 1));
599 mant_off += mant_bits;
600 mant_bits_left -= mant_bits;
603 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
613 if (exponent == 0 && !mant_zero)
614 return float_subnormal;
616 if (exponent == fmt->exp_nan)
619 return float_infinite;
630 /* Convert the mantissa of VAL (which is assumed to be a floating
631 point number whose format is described by FMT) into a hexadecimal
632 and store it in a static string. Return a pointer to that string. */
635 floatformat_mantissa (const struct floatformat *fmt,
638 unsigned char *uval = (unsigned char *) val;
640 unsigned int mant_bits, mant_off;
645 enum floatformat_byteorders order;
646 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
648 gdb_assert (fmt != NULL);
649 gdb_assert (fmt->totalsize
650 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
652 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
654 if (order != fmt->byteorder)
660 /* Make sure we have enough room to store the mantissa. */
661 gdb_assert (sizeof res > ((fmt->man_len + 7) / 8) * 2);
663 mant_off = fmt->man_start;
664 mant_bits_left = fmt->man_len;
665 mant_bits = (mant_bits_left % 32) > 0 ? mant_bits_left % 32 : 32;
667 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
669 len = xsnprintf (res, sizeof res, "%lx", mant);
671 mant_off += mant_bits;
672 mant_bits_left -= mant_bits;
674 while (mant_bits_left > 0)
676 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
678 xsnprintf (buf, sizeof buf, "%08lx", mant);
679 gdb_assert (len + strlen (buf) <= sizeof res);
683 mant_bits_left -= 32;
690 /* Convert TO/FROM target to the hosts DOUBLEST floating-point format.
692 If the host and target formats agree, we just copy the raw data
693 into the appropriate type of variable and return, letting the host
694 increase precision as necessary. Otherwise, we call the conversion
695 routine and let it do the dirty work. */
697 static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
698 static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
699 static const struct floatformat *host_long_double_format
700 = GDB_HOST_LONG_DOUBLE_FORMAT;
703 floatformat_to_doublest (const struct floatformat *fmt,
704 const void *in, DOUBLEST *out)
706 gdb_assert (fmt != NULL);
707 if (fmt == host_float_format)
711 memcpy (&val, in, sizeof (val));
714 else if (fmt == host_double_format)
718 memcpy (&val, in, sizeof (val));
721 else if (fmt == host_long_double_format)
725 memcpy (&val, in, sizeof (val));
729 convert_floatformat_to_doublest (fmt, in, out);
733 floatformat_from_doublest (const struct floatformat *fmt,
734 const DOUBLEST *in, void *out)
736 gdb_assert (fmt != NULL);
737 if (fmt == host_float_format)
741 memcpy (out, &val, sizeof (val));
743 else if (fmt == host_double_format)
747 memcpy (out, &val, sizeof (val));
749 else if (fmt == host_long_double_format)
751 long double val = *in;
753 memcpy (out, &val, sizeof (val));
756 convert_doublest_to_floatformat (fmt, in, out);
760 /* Return a floating-point format for a floating-point variable of
761 length LEN. If no suitable floating-point format is found, an
764 We need this functionality since information about the
765 floating-point format of a type is not always available to GDB; the
766 debug information typically only tells us the size of a
769 FIXME: kettenis/2001-10-28: In many places, particularly in
770 target-dependent code, the format of floating-point types is known,
771 but not passed on by GDB. This should be fixed. */
773 static const struct floatformat *
774 floatformat_from_length (struct gdbarch *gdbarch, int len)
776 const struct floatformat *format;
778 if (len * TARGET_CHAR_BIT == gdbarch_half_bit (gdbarch))
779 format = gdbarch_half_format (gdbarch)
780 [gdbarch_byte_order (gdbarch)];
781 else if (len * TARGET_CHAR_BIT == gdbarch_float_bit (gdbarch))
782 format = gdbarch_float_format (gdbarch)
783 [gdbarch_byte_order (gdbarch)];
784 else if (len * TARGET_CHAR_BIT == gdbarch_double_bit (gdbarch))
785 format = gdbarch_double_format (gdbarch)
786 [gdbarch_byte_order (gdbarch)];
787 else if (len * TARGET_CHAR_BIT == gdbarch_long_double_bit (gdbarch))
788 format = gdbarch_long_double_format (gdbarch)
789 [gdbarch_byte_order (gdbarch)];
790 /* On i386 the 'long double' type takes 96 bits,
791 while the real number of used bits is only 80,
792 both in processor and in memory.
793 The code below accepts the real bit size. */
794 else if ((gdbarch_long_double_format (gdbarch) != NULL)
795 && (len * TARGET_CHAR_BIT
796 == gdbarch_long_double_format (gdbarch)[0]->totalsize))
797 format = gdbarch_long_double_format (gdbarch)
798 [gdbarch_byte_order (gdbarch)];
802 error (_("Unrecognized %d-bit floating-point type."),
803 len * TARGET_CHAR_BIT);
807 const struct floatformat *
808 floatformat_from_type (const struct type *type)
810 struct gdbarch *gdbarch = get_type_arch (type);
812 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
813 if (TYPE_FLOATFORMAT (type) != NULL)
814 return TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)];
816 return floatformat_from_length (gdbarch, TYPE_LENGTH (type));
819 /* Extract a floating-point number of type TYPE from a target-order
820 byte-stream at ADDR. Returns the value as type DOUBLEST. */
823 extract_typed_floating (const void *addr, const struct type *type)
825 const struct floatformat *fmt = floatformat_from_type (type);
828 floatformat_to_doublest (fmt, addr, &retval);
832 /* Store VAL as a floating-point number of type TYPE to a target-order
833 byte-stream at ADDR. */
836 store_typed_floating (void *addr, const struct type *type, DOUBLEST val)
838 const struct floatformat *fmt = floatformat_from_type (type);
840 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
841 zero out any remaining bytes in the target buffer when TYPE is
842 longer than the actual underlying floating-point format. Perhaps
843 we should store a fixed bitpattern in those remaining bytes,
844 instead of zero, or perhaps we shouldn't touch those remaining
847 NOTE: cagney/2001-10-28: With the way things currently work, it
848 isn't a good idea to leave the end bits undefined. This is
849 because GDB writes out the entire sizeof(<floating>) bits of the
850 floating-point type even though the value might only be stored
851 in, and the target processor may only refer to, the first N <
852 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
853 initialized, GDB would write undefined data to the target. An
854 errant program, refering to that undefined data, would then
855 become non-deterministic.
857 See also the function convert_typed_floating below. */
858 memset (addr, 0, TYPE_LENGTH (type));
860 floatformat_from_doublest (fmt, &val, addr);
863 /* Convert a floating-point number of type FROM_TYPE from a
864 target-order byte-stream at FROM to a floating-point number of type
865 TO_TYPE, and store it to a target-order byte-stream at TO. */
868 convert_typed_floating (const void *from, const struct type *from_type,
869 void *to, const struct type *to_type)
871 const struct floatformat *from_fmt = floatformat_from_type (from_type);
872 const struct floatformat *to_fmt = floatformat_from_type (to_type);
874 if (from_fmt == NULL || to_fmt == NULL)
876 /* If we don't know the floating-point format of FROM_TYPE or
877 TO_TYPE, there's not much we can do. We might make the
878 assumption that if the length of FROM_TYPE and TO_TYPE match,
879 their floating-point format would match too, but that
880 assumption might be wrong on targets that support
881 floating-point types that only differ in endianness for
882 example. So we warn instead, and zero out the target buffer. */
883 warning (_("Can't convert floating-point number to desired type."));
884 memset (to, 0, TYPE_LENGTH (to_type));
886 else if (from_fmt == to_fmt)
888 /* We're in business. The floating-point format of FROM_TYPE
889 and TO_TYPE match. However, even though the floating-point
890 format matches, the length of the type might still be
891 different. Make sure we don't overrun any buffers. See
892 comment in store_typed_floating for a discussion about
893 zeroing out remaining bytes in the target buffer. */
894 memset (to, 0, TYPE_LENGTH (to_type));
895 memcpy (to, from, min (TYPE_LENGTH (from_type), TYPE_LENGTH (to_type)));
899 /* The floating-point types don't match. The best we can do
900 (apart from simulating the target FPU) is converting to the
901 widest floating-point type supported by the host, and then
902 again to the desired type. */
905 floatformat_to_doublest (from_fmt, from, &d);
906 floatformat_from_doublest (to_fmt, &d, to);
910 const struct floatformat *floatformat_ieee_single[BFD_ENDIAN_UNKNOWN];
911 const struct floatformat *floatformat_ieee_double[BFD_ENDIAN_UNKNOWN];
912 const struct floatformat *floatformat_ieee_quad[BFD_ENDIAN_UNKNOWN];
913 const struct floatformat *floatformat_arm_ext[BFD_ENDIAN_UNKNOWN];
914 const struct floatformat *floatformat_ia64_spill[BFD_ENDIAN_UNKNOWN];
916 extern void _initialize_doublest (void);
919 _initialize_doublest (void)
921 floatformat_ieee_single[BFD_ENDIAN_LITTLE] = &floatformat_ieee_single_little;
922 floatformat_ieee_single[BFD_ENDIAN_BIG] = &floatformat_ieee_single_big;
923 floatformat_ieee_double[BFD_ENDIAN_LITTLE] = &floatformat_ieee_double_little;
924 floatformat_ieee_double[BFD_ENDIAN_BIG] = &floatformat_ieee_double_big;
925 floatformat_arm_ext[BFD_ENDIAN_LITTLE]
926 = &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;