1 /* Floating point routines for GDB, the GNU debugger.
3 Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
4 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
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 2 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, write to the Free Software
21 Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA. */
24 /* Support for converting target fp numbers into host DOUBLEST format. */
26 /* XXX - This code should really be in libiberty/floatformat.c,
27 however configuration issues with libiberty made this very
28 difficult to do in the available time. */
32 #include "floatformat.h"
33 #include "gdb_assert.h"
34 #include "gdb_string.h"
36 #include <math.h> /* ldexp */
38 /* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
39 going to bother with trying to muck around with whether it is defined in
40 a system header, what we do if not, etc. */
41 #define FLOATFORMAT_CHAR_BIT 8
43 /* The number of bytes that the largest floating-point type that we
44 can convert to doublest will need. */
45 #define FLOATFORMAT_LARGEST_BYTES 16
47 /* Extract a field which starts at START and is LEN bytes long. DATA and
48 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
50 get_field (const bfd_byte
*data
, enum floatformat_byteorders order
,
51 unsigned int total_len
, unsigned int start
, unsigned int len
)
54 unsigned int cur_byte
;
57 /* Caller must byte-swap words before calling this routine. */
58 gdb_assert (order
== floatformat_little
|| order
== floatformat_big
);
60 /* Start at the least significant part of the field. */
61 if (order
== floatformat_little
)
63 /* We start counting from the other end (i.e, from the high bytes
64 rather than the low bytes). As such, we need to be concerned
65 with what happens if bit 0 doesn't start on a byte boundary.
66 I.e, we need to properly handle the case where total_len is
67 not evenly divisible by 8. So we compute ``excess'' which
68 represents the number of bits from the end of our starting
69 byte needed to get to bit 0. */
70 int excess
= FLOATFORMAT_CHAR_BIT
- (total_len
% FLOATFORMAT_CHAR_BIT
);
71 cur_byte
= (total_len
/ FLOATFORMAT_CHAR_BIT
)
72 - ((start
+ len
+ excess
) / FLOATFORMAT_CHAR_BIT
);
73 cur_bitshift
= ((start
+ len
+ excess
) % FLOATFORMAT_CHAR_BIT
)
74 - FLOATFORMAT_CHAR_BIT
;
78 cur_byte
= (start
+ len
) / FLOATFORMAT_CHAR_BIT
;
80 ((start
+ len
) % FLOATFORMAT_CHAR_BIT
) - FLOATFORMAT_CHAR_BIT
;
82 if (cur_bitshift
> -FLOATFORMAT_CHAR_BIT
)
83 result
= *(data
+ cur_byte
) >> (-cur_bitshift
);
86 cur_bitshift
+= FLOATFORMAT_CHAR_BIT
;
87 if (order
== floatformat_little
)
92 /* Move towards the most significant part of the field. */
93 while (cur_bitshift
< len
)
95 result
|= (unsigned long)*(data
+ cur_byte
) << cur_bitshift
;
96 cur_bitshift
+= FLOATFORMAT_CHAR_BIT
;
99 case floatformat_little
:
102 case floatformat_big
:
107 if (len
< sizeof(result
) * FLOATFORMAT_CHAR_BIT
)
108 /* Mask out bits which are not part of the field */
109 result
&= ((1UL << len
) - 1);
113 /* Normalize the byte order of FROM into TO. If no normalization is
114 needed then FMT->byteorder is returned and TO is not changed;
115 otherwise the format of the normalized form in TO is returned. */
117 static enum floatformat_byteorders
118 floatformat_normalize_byteorder (const struct floatformat
*fmt
,
119 const void *from
, void *to
)
121 const unsigned char *swapin
;
122 unsigned char *swapout
;
125 if (fmt
->byteorder
== floatformat_little
126 || fmt
->byteorder
== floatformat_big
)
127 return fmt
->byteorder
;
129 words
= fmt
->totalsize
/ FLOATFORMAT_CHAR_BIT
;
132 swapout
= (unsigned char *)to
;
133 swapin
= (const unsigned char *)from
;
135 if (fmt
->byteorder
== floatformat_vax
)
139 *swapout
++ = swapin
[1];
140 *swapout
++ = swapin
[0];
141 *swapout
++ = swapin
[3];
142 *swapout
++ = swapin
[2];
145 /* This may look weird, since VAX is little-endian, but it is
146 easier to translate to big-endian than to little-endian. */
147 return floatformat_big
;
151 gdb_assert (fmt
->byteorder
== floatformat_littlebyte_bigword
);
155 *swapout
++ = swapin
[3];
156 *swapout
++ = swapin
[2];
157 *swapout
++ = swapin
[1];
158 *swapout
++ = swapin
[0];
161 return floatformat_big
;
165 /* Convert from FMT to a DOUBLEST.
166 FROM is the address of the extended float.
167 Store the DOUBLEST in *TO. */
170 convert_floatformat_to_doublest (const struct floatformat
*fmt
,
174 unsigned char *ufrom
= (unsigned char *) from
;
178 unsigned int mant_bits
, mant_off
;
180 int special_exponent
; /* It's a NaN, denorm or zero */
181 enum floatformat_byteorders order
;
182 unsigned char newfrom
[FLOATFORMAT_LARGEST_BYTES
];
184 gdb_assert (fmt
->totalsize
185 <= FLOATFORMAT_LARGEST_BYTES
* FLOATFORMAT_CHAR_BIT
);
187 order
= floatformat_normalize_byteorder (fmt
, ufrom
, newfrom
);
189 if (order
!= fmt
->byteorder
)
192 exponent
= get_field (ufrom
, order
, fmt
->totalsize
, fmt
->exp_start
,
194 /* Note that if exponent indicates a NaN, we can't really do anything useful
195 (not knowing if the host has NaN's, or how to build one). So it will
196 end up as an infinity or something close; that is OK. */
198 mant_bits_left
= fmt
->man_len
;
199 mant_off
= fmt
->man_start
;
202 special_exponent
= exponent
== 0 || exponent
== fmt
->exp_nan
;
204 /* Don't bias NaNs. Use minimum exponent for denorms. For simplicity,
205 we don't check for zero as the exponent doesn't matter. Note the cast
206 to int; exp_bias is unsigned, so it's important to make sure the
207 operation is done in signed arithmetic. */
208 if (!special_exponent
)
209 exponent
-= fmt
->exp_bias
;
210 else if (exponent
== 0)
211 exponent
= 1 - fmt
->exp_bias
;
213 /* Build the result algebraically. Might go infinite, underflow, etc;
216 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
217 increment the exponent by one to account for the integer bit. */
219 if (!special_exponent
)
221 if (fmt
->intbit
== floatformat_intbit_no
)
222 dto
= ldexp (1.0, exponent
);
227 while (mant_bits_left
> 0)
229 mant_bits
= min (mant_bits_left
, 32);
231 mant
= get_field (ufrom
, order
, fmt
->totalsize
, mant_off
, mant_bits
);
233 dto
+= ldexp ((double) mant
, exponent
- mant_bits
);
234 exponent
-= mant_bits
;
235 mant_off
+= mant_bits
;
236 mant_bits_left
-= mant_bits
;
239 /* Negate it if negative. */
240 if (get_field (ufrom
, order
, fmt
->totalsize
, fmt
->sign_start
, 1))
245 static void put_field (unsigned char *, enum floatformat_byteorders
,
247 unsigned int, unsigned int, unsigned long);
249 /* Set a field which starts at START and is LEN bytes long. DATA and
250 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
252 put_field (unsigned char *data
, enum floatformat_byteorders order
,
253 unsigned int total_len
, unsigned int start
, unsigned int len
,
254 unsigned long stuff_to_put
)
256 unsigned int cur_byte
;
259 /* Caller must byte-swap words before calling this routine. */
260 gdb_assert (order
== floatformat_little
|| order
== floatformat_big
);
262 /* Start at the least significant part of the field. */
263 if (order
== floatformat_little
)
265 int excess
= FLOATFORMAT_CHAR_BIT
- (total_len
% FLOATFORMAT_CHAR_BIT
);
266 cur_byte
= (total_len
/ FLOATFORMAT_CHAR_BIT
)
267 - ((start
+ len
+ excess
) / FLOATFORMAT_CHAR_BIT
);
268 cur_bitshift
= ((start
+ len
+ excess
) % FLOATFORMAT_CHAR_BIT
)
269 - FLOATFORMAT_CHAR_BIT
;
273 cur_byte
= (start
+ len
) / FLOATFORMAT_CHAR_BIT
;
275 ((start
+ len
) % FLOATFORMAT_CHAR_BIT
) - FLOATFORMAT_CHAR_BIT
;
277 if (cur_bitshift
> -FLOATFORMAT_CHAR_BIT
)
279 *(data
+ cur_byte
) &=
280 ~(((1 << ((start
+ len
) % FLOATFORMAT_CHAR_BIT
)) - 1)
282 *(data
+ cur_byte
) |=
283 (stuff_to_put
& ((1 << FLOATFORMAT_CHAR_BIT
) - 1)) << (-cur_bitshift
);
285 cur_bitshift
+= FLOATFORMAT_CHAR_BIT
;
286 if (order
== floatformat_little
)
291 /* Move towards the most significant part of the field. */
292 while (cur_bitshift
< len
)
294 if (len
- cur_bitshift
< FLOATFORMAT_CHAR_BIT
)
296 /* This is the last byte. */
297 *(data
+ cur_byte
) &=
298 ~((1 << (len
- cur_bitshift
)) - 1);
299 *(data
+ cur_byte
) |= (stuff_to_put
>> cur_bitshift
);
302 *(data
+ cur_byte
) = ((stuff_to_put
>> cur_bitshift
)
303 & ((1 << FLOATFORMAT_CHAR_BIT
) - 1));
304 cur_bitshift
+= FLOATFORMAT_CHAR_BIT
;
305 if (order
== floatformat_little
)
312 #ifdef HAVE_LONG_DOUBLE
313 /* Return the fractional part of VALUE, and put the exponent of VALUE in *EPTR.
314 The range of the returned value is >= 0.5 and < 1.0. This is equivalent to
315 frexp, but operates on the long double data type. */
317 static long double ldfrexp (long double value
, int *eptr
);
320 ldfrexp (long double value
, int *eptr
)
325 /* Unfortunately, there are no portable functions for extracting the exponent
326 of a long double, so we have to do it iteratively by multiplying or dividing
327 by two until the fraction is between 0.5 and 1.0. */
335 if (value
>= tmp
) /* Value >= 1.0 */
341 else if (value
!= 0.0l) /* Value < 1.0 and > 0.0 */
355 #endif /* HAVE_LONG_DOUBLE */
358 /* The converse: convert the DOUBLEST *FROM to an extended float and
359 store where TO points. Neither FROM nor TO have any alignment
363 convert_doublest_to_floatformat (CONST
struct floatformat
*fmt
,
364 const DOUBLEST
*from
, void *to
)
369 unsigned int mant_bits
, mant_off
;
371 unsigned char *uto
= (unsigned char *) to
;
372 enum floatformat_byteorders order
= fmt
->byteorder
;
373 unsigned char newto
[FLOATFORMAT_LARGEST_BYTES
];
375 if (order
!= floatformat_little
)
376 order
= floatformat_big
;
378 if (order
!= fmt
->byteorder
)
381 memcpy (&dfrom
, from
, sizeof (dfrom
));
382 memset (uto
, 0, (fmt
->totalsize
+ FLOATFORMAT_CHAR_BIT
- 1)
383 / FLOATFORMAT_CHAR_BIT
);
385 return; /* Result is zero */
386 if (dfrom
!= dfrom
) /* Result is NaN */
389 put_field (uto
, order
, fmt
->totalsize
, fmt
->exp_start
,
390 fmt
->exp_len
, fmt
->exp_nan
);
391 /* Be sure it's not infinity, but NaN value is irrel */
392 put_field (uto
, order
, fmt
->totalsize
, fmt
->man_start
,
394 goto finalize_byteorder
;
397 /* If negative, set the sign bit. */
400 put_field (uto
, order
, fmt
->totalsize
, fmt
->sign_start
, 1, 1);
404 if (dfrom
+ dfrom
== dfrom
&& dfrom
!= 0.0) /* Result is Infinity */
406 /* Infinity exponent is same as NaN's. */
407 put_field (uto
, order
, fmt
->totalsize
, fmt
->exp_start
,
408 fmt
->exp_len
, fmt
->exp_nan
);
409 /* Infinity mantissa is all zeroes. */
410 put_field (uto
, order
, fmt
->totalsize
, fmt
->man_start
,
412 goto finalize_byteorder
;
415 #ifdef HAVE_LONG_DOUBLE
416 mant
= ldfrexp (dfrom
, &exponent
);
418 mant
= frexp (dfrom
, &exponent
);
421 put_field (uto
, order
, fmt
->totalsize
, fmt
->exp_start
, fmt
->exp_len
,
422 exponent
+ fmt
->exp_bias
- 1);
424 mant_bits_left
= fmt
->man_len
;
425 mant_off
= fmt
->man_start
;
426 while (mant_bits_left
> 0)
428 unsigned long mant_long
;
429 mant_bits
= mant_bits_left
< 32 ? mant_bits_left
: 32;
431 mant
*= 4294967296.0;
432 mant_long
= ((unsigned long) mant
) & 0xffffffffL
;
435 /* If the integer bit is implicit, then we need to discard it.
436 If we are discarding a zero, we should be (but are not) creating
437 a denormalized number which means adjusting the exponent
439 if (mant_bits_left
== fmt
->man_len
440 && fmt
->intbit
== floatformat_intbit_no
)
443 mant_long
&= 0xffffffffL
;
444 /* If we are processing the top 32 mantissa bits of a doublest
445 so as to convert to a float value with implied integer bit,
446 we will only be putting 31 of those 32 bits into the
447 final value due to the discarding of the top bit. In the
448 case of a small float value where the number of mantissa
449 bits is less than 32, discarding the top bit does not alter
450 the number of bits we will be adding to the result. */
457 /* The bits we want are in the most significant MANT_BITS bits of
458 mant_long. Move them to the least significant. */
459 mant_long
>>= 32 - mant_bits
;
462 put_field (uto
, order
, fmt
->totalsize
,
463 mant_off
, mant_bits
, mant_long
);
464 mant_off
+= mant_bits
;
465 mant_bits_left
-= mant_bits
;
469 /* Do we need to byte-swap the words in the result? */
470 if (order
!= fmt
->byteorder
)
471 floatformat_normalize_byteorder (fmt
, newto
, to
);
474 /* Check if VAL (which is assumed to be a floating point number whose
475 format is described by FMT) is negative. */
478 floatformat_is_negative (const struct floatformat
*fmt
,
479 const bfd_byte
*uval
)
481 enum floatformat_byteorders order
;
482 unsigned char newfrom
[FLOATFORMAT_LARGEST_BYTES
];
484 gdb_assert (fmt
!= NULL
);
485 gdb_assert (fmt
->totalsize
486 <= FLOATFORMAT_LARGEST_BYTES
* FLOATFORMAT_CHAR_BIT
);
488 order
= floatformat_normalize_byteorder (fmt
, uval
, newfrom
);
490 if (order
!= fmt
->byteorder
)
493 return get_field (uval
, order
, fmt
->totalsize
, fmt
->sign_start
, 1);
496 /* Check if VAL is "not a number" (NaN) for FMT. */
499 floatformat_is_nan (const struct floatformat
*fmt
,
500 const bfd_byte
*uval
)
504 unsigned int mant_bits
, mant_off
;
506 enum floatformat_byteorders order
;
507 unsigned char newfrom
[FLOATFORMAT_LARGEST_BYTES
];
509 gdb_assert (fmt
!= NULL
);
510 gdb_assert (fmt
->totalsize
511 <= FLOATFORMAT_LARGEST_BYTES
* FLOATFORMAT_CHAR_BIT
);
513 order
= floatformat_normalize_byteorder (fmt
, uval
, newfrom
);
515 if (order
!= fmt
->byteorder
)
521 exponent
= get_field (uval
, order
, fmt
->totalsize
, fmt
->exp_start
,
524 if (exponent
!= fmt
->exp_nan
)
527 mant_bits_left
= fmt
->man_len
;
528 mant_off
= fmt
->man_start
;
530 while (mant_bits_left
> 0)
532 mant_bits
= min (mant_bits_left
, 32);
534 mant
= get_field (uval
, order
, fmt
->totalsize
, mant_off
, mant_bits
);
536 /* If there is an explicit integer bit, mask it off. */
537 if (mant_off
== fmt
->man_start
538 && fmt
->intbit
== floatformat_intbit_yes
)
539 mant
&= ~(1 << (mant_bits
- 1));
544 mant_off
+= mant_bits
;
545 mant_bits_left
-= mant_bits
;
551 /* Convert the mantissa of VAL (which is assumed to be a floating
552 point number whose format is described by FMT) into a hexadecimal
553 and store it in a static string. Return a pointer to that string. */
556 floatformat_mantissa (const struct floatformat
*fmt
,
559 unsigned char *uval
= (unsigned char *) val
;
561 unsigned int mant_bits
, mant_off
;
566 enum floatformat_byteorders order
;
567 unsigned char newfrom
[FLOATFORMAT_LARGEST_BYTES
];
569 gdb_assert (fmt
!= NULL
);
570 gdb_assert (fmt
->totalsize
571 <= FLOATFORMAT_LARGEST_BYTES
* FLOATFORMAT_CHAR_BIT
);
573 order
= floatformat_normalize_byteorder (fmt
, uval
, newfrom
);
575 if (order
!= fmt
->byteorder
)
581 /* Make sure we have enough room to store the mantissa. */
582 gdb_assert (sizeof res
> ((fmt
->man_len
+ 7) / 8) * 2);
584 mant_off
= fmt
->man_start
;
585 mant_bits_left
= fmt
->man_len
;
586 mant_bits
= (mant_bits_left
% 32) > 0 ? mant_bits_left
% 32 : 32;
588 mant
= get_field (uval
, order
, fmt
->totalsize
, mant_off
, mant_bits
);
590 len
= xsnprintf (res
, sizeof res
, "%lx", mant
);
592 mant_off
+= mant_bits
;
593 mant_bits_left
-= mant_bits
;
595 while (mant_bits_left
> 0)
597 mant
= get_field (uval
, order
, fmt
->totalsize
, mant_off
, 32);
599 xsnprintf (buf
, sizeof buf
, "%08lx", mant
);
600 gdb_assert (len
+ strlen (buf
) <= sizeof res
);
604 mant_bits_left
-= 32;
611 /* Convert TO/FROM target to the hosts DOUBLEST floating-point format.
613 If the host and target formats agree, we just copy the raw data
614 into the appropriate type of variable and return, letting the host
615 increase precision as necessary. Otherwise, we call the conversion
616 routine and let it do the dirty work. */
618 static const struct floatformat
*host_float_format
= GDB_HOST_FLOAT_FORMAT
;
619 static const struct floatformat
*host_double_format
= GDB_HOST_DOUBLE_FORMAT
;
620 static const struct floatformat
*host_long_double_format
= GDB_HOST_LONG_DOUBLE_FORMAT
;
623 floatformat_to_doublest (const struct floatformat
*fmt
,
624 const void *in
, DOUBLEST
*out
)
626 gdb_assert (fmt
!= NULL
);
627 if (fmt
== host_float_format
)
630 memcpy (&val
, in
, sizeof (val
));
633 else if (fmt
== host_double_format
)
636 memcpy (&val
, in
, sizeof (val
));
639 else if (fmt
== host_long_double_format
)
642 memcpy (&val
, in
, sizeof (val
));
646 convert_floatformat_to_doublest (fmt
, in
, out
);
650 floatformat_from_doublest (const struct floatformat
*fmt
,
651 const DOUBLEST
*in
, void *out
)
653 gdb_assert (fmt
!= NULL
);
654 if (fmt
== host_float_format
)
657 memcpy (out
, &val
, sizeof (val
));
659 else if (fmt
== host_double_format
)
662 memcpy (out
, &val
, sizeof (val
));
664 else if (fmt
== host_long_double_format
)
666 long double val
= *in
;
667 memcpy (out
, &val
, sizeof (val
));
670 convert_doublest_to_floatformat (fmt
, in
, out
);
674 /* Return a floating-point format for a floating-point variable of
675 length LEN. If no suitable floating-point format is found, an
678 We need this functionality since information about the
679 floating-point format of a type is not always available to GDB; the
680 debug information typically only tells us the size of a
683 FIXME: kettenis/2001-10-28: In many places, particularly in
684 target-dependent code, the format of floating-point types is known,
685 but not passed on by GDB. This should be fixed. */
687 static const struct floatformat
*
688 floatformat_from_length (int len
)
690 const struct floatformat
*format
;
691 if (len
* TARGET_CHAR_BIT
== TARGET_FLOAT_BIT
)
692 format
= TARGET_FLOAT_FORMAT
;
693 else if (len
* TARGET_CHAR_BIT
== TARGET_DOUBLE_BIT
)
694 format
= TARGET_DOUBLE_FORMAT
;
695 else if (len
* TARGET_CHAR_BIT
== TARGET_LONG_DOUBLE_BIT
)
696 format
= TARGET_LONG_DOUBLE_FORMAT
;
697 /* On i386 the 'long double' type takes 96 bits,
698 while the real number of used bits is only 80,
699 both in processor and in memory.
700 The code below accepts the real bit size. */
701 else if ((TARGET_LONG_DOUBLE_FORMAT
!= NULL
)
702 && (len
* TARGET_CHAR_BIT
==
703 TARGET_LONG_DOUBLE_FORMAT
->totalsize
))
704 format
= TARGET_LONG_DOUBLE_FORMAT
;
708 error (_("Unrecognized %d-bit floating-point type."),
709 len
* TARGET_CHAR_BIT
);
713 const struct floatformat
*
714 floatformat_from_type (const struct type
*type
)
716 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_FLT
);
717 if (TYPE_FLOATFORMAT (type
) != NULL
)
718 return TYPE_FLOATFORMAT (type
);
720 return floatformat_from_length (TYPE_LENGTH (type
));
723 /* If the host doesn't define NAN, use zero instead. */
728 /* Extract a floating-point number of length LEN from a target-order
729 byte-stream at ADDR. Returns the value as type DOUBLEST. */
732 extract_floating_by_length (const void *addr
, int len
)
734 const struct floatformat
*fmt
= floatformat_from_length (len
);
737 floatformat_to_doublest (fmt
, addr
, &val
);
742 deprecated_extract_floating (const void *addr
, int len
)
744 return extract_floating_by_length (addr
, len
);
747 /* Store VAL as a floating-point number of length LEN to a
748 target-order byte-stream at ADDR. */
751 store_floating_by_length (void *addr
, int len
, DOUBLEST val
)
753 const struct floatformat
*fmt
= floatformat_from_length (len
);
755 floatformat_from_doublest (fmt
, &val
, addr
);
759 deprecated_store_floating (void *addr
, int len
, DOUBLEST val
)
761 store_floating_by_length (addr
, len
, val
);
764 /* Extract a floating-point number of type TYPE from a target-order
765 byte-stream at ADDR. Returns the value as type DOUBLEST. */
768 extract_typed_floating (const void *addr
, const struct type
*type
)
772 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_FLT
);
774 if (TYPE_FLOATFORMAT (type
) == NULL
)
775 /* Not all code remembers to set the FLOATFORMAT (language
776 specific code? stabs?) so handle that here as a special case. */
777 return extract_floating_by_length (addr
, TYPE_LENGTH (type
));
779 floatformat_to_doublest (TYPE_FLOATFORMAT (type
), addr
, &retval
);
783 /* Store VAL as a floating-point number of type TYPE to a target-order
784 byte-stream at ADDR. */
787 store_typed_floating (void *addr
, const struct type
*type
, DOUBLEST val
)
789 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_FLT
);
791 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
792 zero out any remaining bytes in the target buffer when TYPE is
793 longer than the actual underlying floating-point format. Perhaps
794 we should store a fixed bitpattern in those remaining bytes,
795 instead of zero, or perhaps we shouldn't touch those remaining
798 NOTE: cagney/2001-10-28: With the way things currently work, it
799 isn't a good idea to leave the end bits undefined. This is
800 because GDB writes out the entire sizeof(<floating>) bits of the
801 floating-point type even though the value might only be stored
802 in, and the target processor may only refer to, the first N <
803 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
804 initialized, GDB would write undefined data to the target. An
805 errant program, refering to that undefined data, would then
806 become non-deterministic.
808 See also the function convert_typed_floating below. */
809 memset (addr
, 0, TYPE_LENGTH (type
));
811 if (TYPE_FLOATFORMAT (type
) == NULL
)
812 /* Not all code remembers to set the FLOATFORMAT (language
813 specific code? stabs?) so handle that here as a special case. */
814 store_floating_by_length (addr
, TYPE_LENGTH (type
), val
);
816 floatformat_from_doublest (TYPE_FLOATFORMAT (type
), &val
, addr
);
819 /* Convert a floating-point number of type FROM_TYPE from a
820 target-order byte-stream at FROM to a floating-point number of type
821 TO_TYPE, and store it to a target-order byte-stream at TO. */
824 convert_typed_floating (const void *from
, const struct type
*from_type
,
825 void *to
, const struct type
*to_type
)
827 const struct floatformat
*from_fmt
= floatformat_from_type (from_type
);
828 const struct floatformat
*to_fmt
= floatformat_from_type (to_type
);
830 gdb_assert (TYPE_CODE (from_type
) == TYPE_CODE_FLT
);
831 gdb_assert (TYPE_CODE (to_type
) == TYPE_CODE_FLT
);
833 if (from_fmt
== NULL
|| to_fmt
== NULL
)
835 /* If we don't know the floating-point format of FROM_TYPE or
836 TO_TYPE, there's not much we can do. We might make the
837 assumption that if the length of FROM_TYPE and TO_TYPE match,
838 their floating-point format would match too, but that
839 assumption might be wrong on targets that support
840 floating-point types that only differ in endianness for
841 example. So we warn instead, and zero out the target buffer. */
842 warning (_("Can't convert floating-point number to desired type."));
843 memset (to
, 0, TYPE_LENGTH (to_type
));
845 else if (from_fmt
== to_fmt
)
847 /* We're in business. The floating-point format of FROM_TYPE
848 and TO_TYPE match. However, even though the floating-point
849 format matches, the length of the type might still be
850 different. Make sure we don't overrun any buffers. See
851 comment in store_typed_floating for a discussion about
852 zeroing out remaining bytes in the target buffer. */
853 memset (to
, 0, TYPE_LENGTH (to_type
));
854 memcpy (to
, from
, min (TYPE_LENGTH (from_type
), TYPE_LENGTH (to_type
)));
858 /* The floating-point types don't match. The best we can do
859 (aport from simulating the target FPU) is converting to the
860 widest floating-point type supported by the host, and then
861 again to the desired type. */
864 floatformat_to_doublest (from_fmt
, from
, &d
);
865 floatformat_from_doublest (to_fmt
, &d
, to
);
869 const struct floatformat
*floatformat_ieee_single
[BFD_ENDIAN_UNKNOWN
];
870 const struct floatformat
*floatformat_ieee_double
[BFD_ENDIAN_UNKNOWN
];
871 const struct floatformat
*floatformat_ieee_quad
[BFD_ENDIAN_UNKNOWN
];
872 const struct floatformat
*floatformat_arm_ext
[BFD_ENDIAN_UNKNOWN
];
873 const struct floatformat
*floatformat_ia64_spill
[BFD_ENDIAN_UNKNOWN
];
875 extern void _initialize_doublest (void);
878 _initialize_doublest (void)
880 floatformat_ieee_single
[BFD_ENDIAN_LITTLE
] = &floatformat_ieee_single_little
;
881 floatformat_ieee_single
[BFD_ENDIAN_BIG
] = &floatformat_ieee_single_big
;
882 floatformat_ieee_double
[BFD_ENDIAN_LITTLE
] = &floatformat_ieee_double_little
;
883 floatformat_ieee_double
[BFD_ENDIAN_BIG
] = &floatformat_ieee_double_big
;
884 floatformat_arm_ext
[BFD_ENDIAN_LITTLE
] = &floatformat_arm_ext_littlebyte_bigword
;
885 floatformat_arm_ext
[BFD_ENDIAN_BIG
] = &floatformat_arm_ext_big
;
886 floatformat_ia64_spill
[BFD_ENDIAN_LITTLE
] = &floatformat_ia64_spill_little
;
887 floatformat_ia64_spill
[BFD_ENDIAN_BIG
] = &floatformat_ia64_spill_big
;
888 floatformat_ieee_quad
[BFD_ENDIAN_LITTLE
] = &floatformat_ia64_quad_little
;
889 floatformat_ieee_quad
[BFD_ENDIAN_BIG
] = &floatformat_ia64_quad_big
;