1 /* Floating point routines for GDB, the GNU debugger.
3 Copyright (C) 1986-2016 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 /* Support for converting target fp numbers into host DOUBLEST format. */
22 /* XXX - This code should really be in libiberty/floatformat.c,
23 however configuration issues with libiberty made this very
24 difficult to do in the available time. */
28 #include "floatformat.h"
30 #include <math.h> /* ldexp */
32 /* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
33 going to bother with trying to muck around with whether it is defined in
34 a system header, what we do if not, etc. */
35 #define FLOATFORMAT_CHAR_BIT 8
37 /* The number of bytes that the largest floating-point type that we
38 can convert to doublest will need. */
39 #define FLOATFORMAT_LARGEST_BYTES 16
41 /* Extract a field which starts at START and is LEN bytes long. DATA and
42 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
44 get_field (const bfd_byte *data, enum floatformat_byteorders order,
45 unsigned int total_len, unsigned int start, unsigned int len)
48 unsigned int cur_byte;
51 /* Caller must byte-swap words before calling this routine. */
52 gdb_assert (order == floatformat_little || order == floatformat_big);
54 /* Start at the least significant part of the field. */
55 if (order == floatformat_little)
57 /* We start counting from the other end (i.e, from the high bytes
58 rather than the low bytes). As such, we need to be concerned
59 with what happens if bit 0 doesn't start on a byte boundary.
60 I.e, we need to properly handle the case where total_len is
61 not evenly divisible by 8. So we compute ``excess'' which
62 represents the number of bits from the end of our starting
63 byte needed to get to bit 0. */
64 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
66 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
67 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
68 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
69 - FLOATFORMAT_CHAR_BIT;
73 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
75 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
77 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
78 result = *(data + cur_byte) >> (-cur_bitshift);
81 cur_bitshift += FLOATFORMAT_CHAR_BIT;
82 if (order == floatformat_little)
87 /* Move towards the most significant part of the field. */
88 while (cur_bitshift < len)
90 result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
91 cur_bitshift += FLOATFORMAT_CHAR_BIT;
94 case floatformat_little:
102 if (len < sizeof(result) * FLOATFORMAT_CHAR_BIT)
103 /* Mask out bits which are not part of the field. */
104 result &= ((1UL << len) - 1);
108 /* Normalize the byte order of FROM into TO. If no normalization is
109 needed then FMT->byteorder is returned and TO is not changed;
110 otherwise the format of the normalized form in TO is returned. */
112 static enum floatformat_byteorders
113 floatformat_normalize_byteorder (const struct floatformat *fmt,
114 const void *from, void *to)
116 const unsigned char *swapin;
117 unsigned char *swapout;
120 if (fmt->byteorder == floatformat_little
121 || fmt->byteorder == floatformat_big)
122 return fmt->byteorder;
124 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
127 swapout = (unsigned char *)to;
128 swapin = (const unsigned char *)from;
130 if (fmt->byteorder == floatformat_vax)
134 *swapout++ = swapin[1];
135 *swapout++ = swapin[0];
136 *swapout++ = swapin[3];
137 *swapout++ = swapin[2];
140 /* This may look weird, since VAX is little-endian, but it is
141 easier to translate to big-endian than to little-endian. */
142 return floatformat_big;
146 gdb_assert (fmt->byteorder == floatformat_littlebyte_bigword);
150 *swapout++ = swapin[3];
151 *swapout++ = swapin[2];
152 *swapout++ = swapin[1];
153 *swapout++ = swapin[0];
156 return floatformat_big;
160 /* Convert from FMT to a DOUBLEST.
161 FROM is the address of the extended float.
162 Store the DOUBLEST in *TO. */
165 convert_floatformat_to_doublest (const struct floatformat *fmt,
169 unsigned char *ufrom = (unsigned char *) from;
173 unsigned int mant_bits, mant_off;
175 int special_exponent; /* It's a NaN, denorm or zero. */
176 enum floatformat_byteorders order;
177 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
178 enum float_kind kind;
180 gdb_assert (fmt->totalsize
181 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
183 /* For non-numbers, reuse libiberty's logic to find the correct
184 format. We do not lose any precision in this case by passing
186 kind = floatformat_classify (fmt, (const bfd_byte *) from);
187 if (kind == float_infinite || kind == float_nan)
191 floatformat_to_double (fmt->split_half ? fmt->split_half : fmt,
193 *to = (DOUBLEST) dto;
197 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
199 if (order != fmt->byteorder)
206 floatformat_to_doublest (fmt->split_half, ufrom, &dtop);
207 /* Preserve the sign of 0, which is the sign of the top
214 floatformat_to_doublest (fmt->split_half,
215 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2,
221 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
223 /* Note that if exponent indicates a NaN, we can't really do anything useful
224 (not knowing if the host has NaN's, or how to build one). So it will
225 end up as an infinity or something close; that is OK. */
227 mant_bits_left = fmt->man_len;
228 mant_off = fmt->man_start;
231 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
233 /* Don't bias NaNs. Use minimum exponent for denorms. For
234 simplicity, we don't check for zero as the exponent doesn't matter.
235 Note the cast to int; exp_bias is unsigned, so it's important to
236 make sure the operation is done in signed arithmetic. */
237 if (!special_exponent)
238 exponent -= fmt->exp_bias;
239 else if (exponent == 0)
240 exponent = 1 - fmt->exp_bias;
242 /* Build the result algebraically. Might go infinite, underflow, etc;
245 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
246 increment the exponent by one to account for the integer bit. */
248 if (!special_exponent)
250 if (fmt->intbit == floatformat_intbit_no)
251 dto = ldexp (1.0, exponent);
256 while (mant_bits_left > 0)
258 mant_bits = min (mant_bits_left, 32);
260 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
262 dto += ldexp ((double) mant, exponent - mant_bits);
263 exponent -= mant_bits;
264 mant_off += mant_bits;
265 mant_bits_left -= mant_bits;
268 /* Negate it if negative. */
269 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
274 /* Set a field which starts at START and is LEN bytes long. DATA and
275 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
277 put_field (unsigned char *data, enum floatformat_byteorders order,
278 unsigned int total_len, unsigned int start, unsigned int len,
279 unsigned long stuff_to_put)
281 unsigned int cur_byte;
284 /* Caller must byte-swap words before calling this routine. */
285 gdb_assert (order == floatformat_little || order == floatformat_big);
287 /* Start at the least significant part of the field. */
288 if (order == floatformat_little)
290 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
292 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
293 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
294 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
295 - FLOATFORMAT_CHAR_BIT;
299 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
301 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
303 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
305 *(data + cur_byte) &=
306 ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1)
308 *(data + cur_byte) |=
309 (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
311 cur_bitshift += FLOATFORMAT_CHAR_BIT;
312 if (order == floatformat_little)
317 /* Move towards the most significant part of the field. */
318 while (cur_bitshift < len)
320 if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
322 /* This is the last byte. */
323 *(data + cur_byte) &=
324 ~((1 << (len - cur_bitshift)) - 1);
325 *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
328 *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
329 & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
330 cur_bitshift += FLOATFORMAT_CHAR_BIT;
331 if (order == floatformat_little)
338 /* The converse: convert the DOUBLEST *FROM to an extended float and
339 store where TO points. Neither FROM nor TO have any alignment
343 convert_doublest_to_floatformat (const struct floatformat *fmt,
344 const DOUBLEST *from, void *to)
349 unsigned int mant_bits, mant_off;
351 unsigned char *uto = (unsigned char *) to;
352 enum floatformat_byteorders order = fmt->byteorder;
353 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
355 if (order != floatformat_little)
356 order = floatformat_big;
358 if (order != fmt->byteorder)
361 memcpy (&dfrom, from, sizeof (dfrom));
362 memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
363 / FLOATFORMAT_CHAR_BIT);
367 /* Use static volatile to ensure that any excess precision is
368 removed via storing in memory, and so the top half really is
369 the result of converting to double. */
370 static volatile double dtop, dbot;
371 DOUBLEST dtopnv, dbotnv;
373 dtop = (double) dfrom;
374 /* If the rounded top half is Inf, the bottom must be 0 not NaN
376 if (dtop + dtop == dtop && dtop != 0.0)
379 dbot = (double) (dfrom - (DOUBLEST) dtop);
382 floatformat_from_doublest (fmt->split_half, &dtopnv, uto);
383 floatformat_from_doublest (fmt->split_half, &dbotnv,
385 + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2));
390 return; /* Result is zero */
391 if (dfrom != dfrom) /* Result is NaN */
394 put_field (uto, order, fmt->totalsize, fmt->exp_start,
395 fmt->exp_len, fmt->exp_nan);
396 /* Be sure it's not infinity, but NaN value is irrel. */
397 put_field (uto, order, fmt->totalsize, fmt->man_start,
399 goto finalize_byteorder;
402 /* If negative, set the sign bit. */
405 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
409 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity. */
411 /* Infinity exponent is same as NaN's. */
412 put_field (uto, order, fmt->totalsize, fmt->exp_start,
413 fmt->exp_len, fmt->exp_nan);
414 /* Infinity mantissa is all zeroes. */
415 put_field (uto, order, fmt->totalsize, fmt->man_start,
417 goto finalize_byteorder;
420 #ifdef HAVE_LONG_DOUBLE
421 mant = frexpl (dfrom, &exponent);
423 mant = frexp (dfrom, &exponent);
426 if (exponent + fmt->exp_bias <= 0)
428 /* The value is too small to be expressed in the destination
429 type (not enough bits in the exponent. Treat as 0. */
430 put_field (uto, order, fmt->totalsize, fmt->exp_start,
432 put_field (uto, order, fmt->totalsize, fmt->man_start,
434 goto finalize_byteorder;
437 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
439 /* The value is too large to fit into the destination.
440 Treat as infinity. */
441 put_field (uto, order, fmt->totalsize, fmt->exp_start,
442 fmt->exp_len, fmt->exp_nan);
443 put_field (uto, order, fmt->totalsize, fmt->man_start,
445 goto finalize_byteorder;
448 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
449 exponent + fmt->exp_bias - 1);
451 mant_bits_left = fmt->man_len;
452 mant_off = fmt->man_start;
453 while (mant_bits_left > 0)
455 unsigned long mant_long;
457 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
459 mant *= 4294967296.0;
460 mant_long = ((unsigned long) mant) & 0xffffffffL;
463 /* If the integer bit is implicit, then we need to discard it.
464 If we are discarding a zero, we should be (but are not) creating
465 a denormalized number which means adjusting the exponent
467 if (mant_bits_left == fmt->man_len
468 && fmt->intbit == floatformat_intbit_no)
471 mant_long &= 0xffffffffL;
472 /* If we are processing the top 32 mantissa bits of a doublest
473 so as to convert to a float value with implied integer bit,
474 we will only be putting 31 of those 32 bits into the
475 final value due to the discarding of the top bit. In the
476 case of a small float value where the number of mantissa
477 bits is less than 32, discarding the top bit does not alter
478 the number of bits we will be adding to the result. */
485 /* The bits we want are in the most significant MANT_BITS bits of
486 mant_long. Move them to the least significant. */
487 mant_long >>= 32 - mant_bits;
490 put_field (uto, order, fmt->totalsize,
491 mant_off, mant_bits, mant_long);
492 mant_off += mant_bits;
493 mant_bits_left -= mant_bits;
497 /* Do we need to byte-swap the words in the result? */
498 if (order != fmt->byteorder)
499 floatformat_normalize_byteorder (fmt, newto, to);
502 /* Check if VAL (which is assumed to be a floating point number whose
503 format is described by FMT) is negative. */
506 floatformat_is_negative (const struct floatformat *fmt,
507 const bfd_byte *uval)
509 enum floatformat_byteorders order;
510 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
512 gdb_assert (fmt != NULL);
513 gdb_assert (fmt->totalsize
514 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
516 /* An IBM long double (a two element array of double) always takes the
517 sign of the first double. */
519 fmt = fmt->split_half;
521 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
523 if (order != fmt->byteorder)
526 return get_field (uval, order, fmt->totalsize, fmt->sign_start, 1);
529 /* Check if VAL is "not a number" (NaN) for FMT. */
532 floatformat_classify (const struct floatformat *fmt,
533 const bfd_byte *uval)
537 unsigned int mant_bits, mant_off;
539 enum floatformat_byteorders order;
540 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
543 gdb_assert (fmt != NULL);
544 gdb_assert (fmt->totalsize
545 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
547 /* An IBM long double (a two element array of double) can be classified
548 by looking at the first double. inf and nan are specified as
549 ignoring the second double. zero and subnormal will always have
550 the second double 0.0 if the long double is correctly rounded. */
552 fmt = fmt->split_half;
554 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
556 if (order != fmt->byteorder)
559 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
562 mant_bits_left = fmt->man_len;
563 mant_off = fmt->man_start;
566 while (mant_bits_left > 0)
568 mant_bits = min (mant_bits_left, 32);
570 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
572 /* If there is an explicit integer bit, mask it off. */
573 if (mant_off == fmt->man_start
574 && fmt->intbit == floatformat_intbit_yes)
575 mant &= ~(1 << (mant_bits - 1));
583 mant_off += mant_bits;
584 mant_bits_left -= mant_bits;
587 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
597 if (exponent == 0 && !mant_zero)
598 return float_subnormal;
600 if (exponent == fmt->exp_nan)
603 return float_infinite;
614 /* Convert the mantissa of VAL (which is assumed to be a floating
615 point number whose format is described by FMT) into a hexadecimal
616 and store it in a static string. Return a pointer to that string. */
619 floatformat_mantissa (const struct floatformat *fmt,
622 unsigned char *uval = (unsigned char *) val;
624 unsigned int mant_bits, mant_off;
629 enum floatformat_byteorders order;
630 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
632 gdb_assert (fmt != NULL);
633 gdb_assert (fmt->totalsize
634 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
636 /* For IBM long double (a two element array of double), return the
637 mantissa of the first double. The problem with returning the
638 actual mantissa from both doubles is that there can be an
639 arbitrary number of implied 0's or 1's between the mantissas
640 of the first and second double. In any case, this function
641 is only used for dumping out nans, and a nan is specified to
642 ignore the value in the second double. */
644 fmt = fmt->split_half;
646 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
648 if (order != fmt->byteorder)
654 /* Make sure we have enough room to store the mantissa. */
655 gdb_assert (sizeof res > ((fmt->man_len + 7) / 8) * 2);
657 mant_off = fmt->man_start;
658 mant_bits_left = fmt->man_len;
659 mant_bits = (mant_bits_left % 32) > 0 ? mant_bits_left % 32 : 32;
661 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
663 len = xsnprintf (res, sizeof res, "%lx", mant);
665 mant_off += mant_bits;
666 mant_bits_left -= mant_bits;
668 while (mant_bits_left > 0)
670 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
672 xsnprintf (buf, sizeof buf, "%08lx", mant);
673 gdb_assert (len + strlen (buf) <= sizeof res);
677 mant_bits_left -= 32;
684 /* Convert TO/FROM target to the hosts DOUBLEST floating-point format.
686 If the host and target formats agree, we just copy the raw data
687 into the appropriate type of variable and return, letting the host
688 increase precision as necessary. Otherwise, we call the conversion
689 routine and let it do the dirty work. */
691 static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
692 static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
693 static const struct floatformat *host_long_double_format
694 = GDB_HOST_LONG_DOUBLE_FORMAT;
697 floatformat_to_doublest (const struct floatformat *fmt,
698 const void *in, DOUBLEST *out)
700 gdb_assert (fmt != NULL);
701 if (fmt == host_float_format)
705 memcpy (&val, in, sizeof (val));
708 else if (fmt == host_double_format)
712 memcpy (&val, in, sizeof (val));
715 else if (fmt == host_long_double_format)
719 memcpy (&val, in, sizeof (val));
723 convert_floatformat_to_doublest (fmt, in, out);
727 floatformat_from_doublest (const struct floatformat *fmt,
728 const DOUBLEST *in, void *out)
730 gdb_assert (fmt != NULL);
731 if (fmt == host_float_format)
735 memcpy (out, &val, sizeof (val));
737 else if (fmt == host_double_format)
741 memcpy (out, &val, sizeof (val));
743 else if (fmt == host_long_double_format)
745 long double val = *in;
747 memcpy (out, &val, sizeof (val));
750 convert_doublest_to_floatformat (fmt, in, out);
754 /* Return a floating-point format for a floating-point variable of
755 length LEN. If no suitable floating-point format is found, an
758 We need this functionality since information about the
759 floating-point format of a type is not always available to GDB; the
760 debug information typically only tells us the size of a
763 FIXME: kettenis/2001-10-28: In many places, particularly in
764 target-dependent code, the format of floating-point types is known,
765 but not passed on by GDB. This should be fixed. */
767 static const struct floatformat *
768 floatformat_from_length (struct gdbarch *gdbarch, int len)
770 const struct floatformat *format;
772 if (len * TARGET_CHAR_BIT == gdbarch_half_bit (gdbarch))
773 format = gdbarch_half_format (gdbarch)
774 [gdbarch_byte_order (gdbarch)];
775 else if (len * TARGET_CHAR_BIT == gdbarch_float_bit (gdbarch))
776 format = gdbarch_float_format (gdbarch)
777 [gdbarch_byte_order (gdbarch)];
778 else if (len * TARGET_CHAR_BIT == gdbarch_double_bit (gdbarch))
779 format = gdbarch_double_format (gdbarch)
780 [gdbarch_byte_order (gdbarch)];
781 else if (len * TARGET_CHAR_BIT == gdbarch_long_double_bit (gdbarch))
782 format = gdbarch_long_double_format (gdbarch)
783 [gdbarch_byte_order (gdbarch)];
784 /* On i386 the 'long double' type takes 96 bits,
785 while the real number of used bits is only 80,
786 both in processor and in memory.
787 The code below accepts the real bit size. */
788 else if ((gdbarch_long_double_format (gdbarch) != NULL)
789 && (len * TARGET_CHAR_BIT
790 == gdbarch_long_double_format (gdbarch)[0]->totalsize))
791 format = gdbarch_long_double_format (gdbarch)
792 [gdbarch_byte_order (gdbarch)];
796 error (_("Unrecognized %d-bit floating-point type."),
797 len * TARGET_CHAR_BIT);
801 const struct floatformat *
802 floatformat_from_type (const struct type *type)
804 struct gdbarch *gdbarch = get_type_arch (type);
806 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
807 if (TYPE_FLOATFORMAT (type) != NULL)
808 return TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)];
810 return floatformat_from_length (gdbarch, TYPE_LENGTH (type));
813 /* Extract a floating-point number of type TYPE from a target-order
814 byte-stream at ADDR. Returns the value as type DOUBLEST. */
817 extract_typed_floating (const void *addr, const struct type *type)
819 const struct floatformat *fmt = floatformat_from_type (type);
822 floatformat_to_doublest (fmt, addr, &retval);
826 /* Store VAL as a floating-point number of type TYPE to a target-order
827 byte-stream at ADDR. */
830 store_typed_floating (void *addr, const struct type *type, DOUBLEST val)
832 const struct floatformat *fmt = floatformat_from_type (type);
834 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
835 zero out any remaining bytes in the target buffer when TYPE is
836 longer than the actual underlying floating-point format. Perhaps
837 we should store a fixed bitpattern in those remaining bytes,
838 instead of zero, or perhaps we shouldn't touch those remaining
841 NOTE: cagney/2001-10-28: With the way things currently work, it
842 isn't a good idea to leave the end bits undefined. This is
843 because GDB writes out the entire sizeof(<floating>) bits of the
844 floating-point type even though the value might only be stored
845 in, and the target processor may only refer to, the first N <
846 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
847 initialized, GDB would write undefined data to the target. An
848 errant program, refering to that undefined data, would then
849 become non-deterministic.
851 See also the function convert_typed_floating below. */
852 memset (addr, 0, TYPE_LENGTH (type));
854 floatformat_from_doublest (fmt, &val, addr);
857 /* Convert a floating-point number of type FROM_TYPE from a
858 target-order byte-stream at FROM to a floating-point number of type
859 TO_TYPE, and store it to a target-order byte-stream at TO. */
862 convert_typed_floating (const void *from, const struct type *from_type,
863 void *to, const struct type *to_type)
865 const struct floatformat *from_fmt = floatformat_from_type (from_type);
866 const struct floatformat *to_fmt = floatformat_from_type (to_type);
868 if (from_fmt == NULL || to_fmt == NULL)
870 /* If we don't know the floating-point format of FROM_TYPE or
871 TO_TYPE, there's not much we can do. We might make the
872 assumption that if the length of FROM_TYPE and TO_TYPE match,
873 their floating-point format would match too, but that
874 assumption might be wrong on targets that support
875 floating-point types that only differ in endianness for
876 example. So we warn instead, and zero out the target buffer. */
877 warning (_("Can't convert floating-point number to desired type."));
878 memset (to, 0, TYPE_LENGTH (to_type));
880 else if (from_fmt == to_fmt)
882 /* We're in business. The floating-point format of FROM_TYPE
883 and TO_TYPE match. However, even though the floating-point
884 format matches, the length of the type might still be
885 different. Make sure we don't overrun any buffers. See
886 comment in store_typed_floating for a discussion about
887 zeroing out remaining bytes in the target buffer. */
888 memset (to, 0, TYPE_LENGTH (to_type));
889 memcpy (to, from, min (TYPE_LENGTH (from_type), TYPE_LENGTH (to_type)));
893 /* The floating-point types don't match. The best we can do
894 (apart from simulating the target FPU) is converting to the
895 widest floating-point type supported by the host, and then
896 again to the desired type. */
899 floatformat_to_doublest (from_fmt, from, &d);
900 floatformat_from_doublest (to_fmt, &d, to);