1 /* Floating point routines for GDB, the GNU debugger.
3 Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
4 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007
5 Free Software Foundation, Inc.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 /* Support for converting target fp numbers into host DOUBLEST format. */
24 /* XXX - This code should really be in libiberty/floatformat.c,
25 however configuration issues with libiberty made this very
26 difficult to do in the available time. */
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
);
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
)
193 floatformat_to_double (fmt
, from
, &dto
);
194 *to
= (DOUBLEST
) dto
;
198 order
= floatformat_normalize_byteorder (fmt
, ufrom
, newfrom
);
200 if (order
!= fmt
->byteorder
)
203 exponent
= get_field (ufrom
, order
, fmt
->totalsize
, fmt
->exp_start
,
205 /* Note that if exponent indicates a NaN, we can't really do anything useful
206 (not knowing if the host has NaN's, or how to build one). So it will
207 end up as an infinity or something close; that is OK. */
209 mant_bits_left
= fmt
->man_len
;
210 mant_off
= fmt
->man_start
;
213 special_exponent
= exponent
== 0 || exponent
== fmt
->exp_nan
;
215 /* Don't bias NaNs. Use minimum exponent for denorms. For simplicity,
216 we don't check for zero as the exponent doesn't matter. Note the cast
217 to int; exp_bias is unsigned, so it's important to make sure the
218 operation is done in signed arithmetic. */
219 if (!special_exponent
)
220 exponent
-= fmt
->exp_bias
;
221 else if (exponent
== 0)
222 exponent
= 1 - fmt
->exp_bias
;
224 /* Build the result algebraically. Might go infinite, underflow, etc;
227 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
228 increment the exponent by one to account for the integer bit. */
230 if (!special_exponent
)
232 if (fmt
->intbit
== floatformat_intbit_no
)
233 dto
= ldexp (1.0, exponent
);
238 while (mant_bits_left
> 0)
240 mant_bits
= min (mant_bits_left
, 32);
242 mant
= get_field (ufrom
, order
, fmt
->totalsize
, mant_off
, mant_bits
);
244 dto
+= ldexp ((double) mant
, exponent
- mant_bits
);
245 exponent
-= mant_bits
;
246 mant_off
+= mant_bits
;
247 mant_bits_left
-= mant_bits
;
250 /* Negate it if negative. */
251 if (get_field (ufrom
, order
, fmt
->totalsize
, fmt
->sign_start
, 1))
256 static void put_field (unsigned char *, enum floatformat_byteorders
,
258 unsigned int, unsigned int, unsigned long);
260 /* Set a field which starts at START and is LEN bytes long. DATA and
261 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
263 put_field (unsigned char *data
, enum floatformat_byteorders order
,
264 unsigned int total_len
, unsigned int start
, unsigned int len
,
265 unsigned long stuff_to_put
)
267 unsigned int cur_byte
;
270 /* Caller must byte-swap words before calling this routine. */
271 gdb_assert (order
== floatformat_little
|| order
== floatformat_big
);
273 /* Start at the least significant part of the field. */
274 if (order
== floatformat_little
)
276 int excess
= FLOATFORMAT_CHAR_BIT
- (total_len
% FLOATFORMAT_CHAR_BIT
);
277 cur_byte
= (total_len
/ FLOATFORMAT_CHAR_BIT
)
278 - ((start
+ len
+ excess
) / FLOATFORMAT_CHAR_BIT
);
279 cur_bitshift
= ((start
+ len
+ excess
) % FLOATFORMAT_CHAR_BIT
)
280 - FLOATFORMAT_CHAR_BIT
;
284 cur_byte
= (start
+ len
) / FLOATFORMAT_CHAR_BIT
;
286 ((start
+ len
) % FLOATFORMAT_CHAR_BIT
) - FLOATFORMAT_CHAR_BIT
;
288 if (cur_bitshift
> -FLOATFORMAT_CHAR_BIT
)
290 *(data
+ cur_byte
) &=
291 ~(((1 << ((start
+ len
) % FLOATFORMAT_CHAR_BIT
)) - 1)
293 *(data
+ cur_byte
) |=
294 (stuff_to_put
& ((1 << FLOATFORMAT_CHAR_BIT
) - 1)) << (-cur_bitshift
);
296 cur_bitshift
+= FLOATFORMAT_CHAR_BIT
;
297 if (order
== floatformat_little
)
302 /* Move towards the most significant part of the field. */
303 while (cur_bitshift
< len
)
305 if (len
- cur_bitshift
< FLOATFORMAT_CHAR_BIT
)
307 /* This is the last byte. */
308 *(data
+ cur_byte
) &=
309 ~((1 << (len
- cur_bitshift
)) - 1);
310 *(data
+ cur_byte
) |= (stuff_to_put
>> cur_bitshift
);
313 *(data
+ cur_byte
) = ((stuff_to_put
>> cur_bitshift
)
314 & ((1 << FLOATFORMAT_CHAR_BIT
) - 1));
315 cur_bitshift
+= FLOATFORMAT_CHAR_BIT
;
316 if (order
== floatformat_little
)
323 #ifdef HAVE_LONG_DOUBLE
324 /* Return the fractional part of VALUE, and put the exponent of VALUE in *EPTR.
325 The range of the returned value is >= 0.5 and < 1.0. This is equivalent to
326 frexp, but operates on the long double data type. */
328 static long double ldfrexp (long double value
, int *eptr
);
331 ldfrexp (long double value
, int *eptr
)
336 /* Unfortunately, there are no portable functions for extracting the exponent
337 of a long double, so we have to do it iteratively by multiplying or dividing
338 by two until the fraction is between 0.5 and 1.0. */
346 if (value
>= tmp
) /* Value >= 1.0 */
352 else if (value
!= 0.0l) /* Value < 1.0 and > 0.0 */
366 #endif /* HAVE_LONG_DOUBLE */
369 /* The converse: convert the DOUBLEST *FROM to an extended float and
370 store where TO points. Neither FROM nor TO have any alignment
374 convert_doublest_to_floatformat (CONST
struct floatformat
*fmt
,
375 const DOUBLEST
*from
, void *to
)
380 unsigned int mant_bits
, mant_off
;
382 unsigned char *uto
= (unsigned char *) to
;
383 enum floatformat_byteorders order
= fmt
->byteorder
;
384 unsigned char newto
[FLOATFORMAT_LARGEST_BYTES
];
386 if (order
!= floatformat_little
)
387 order
= floatformat_big
;
389 if (order
!= fmt
->byteorder
)
392 memcpy (&dfrom
, from
, sizeof (dfrom
));
393 memset (uto
, 0, (fmt
->totalsize
+ FLOATFORMAT_CHAR_BIT
- 1)
394 / FLOATFORMAT_CHAR_BIT
);
396 return; /* Result is zero */
397 if (dfrom
!= dfrom
) /* Result is NaN */
400 put_field (uto
, order
, fmt
->totalsize
, fmt
->exp_start
,
401 fmt
->exp_len
, fmt
->exp_nan
);
402 /* Be sure it's not infinity, but NaN value is irrel */
403 put_field (uto
, order
, fmt
->totalsize
, fmt
->man_start
,
405 goto finalize_byteorder
;
408 /* If negative, set the sign bit. */
411 put_field (uto
, order
, fmt
->totalsize
, fmt
->sign_start
, 1, 1);
415 if (dfrom
+ dfrom
== dfrom
&& dfrom
!= 0.0) /* Result is Infinity */
417 /* Infinity exponent is same as NaN's. */
418 put_field (uto
, order
, fmt
->totalsize
, fmt
->exp_start
,
419 fmt
->exp_len
, fmt
->exp_nan
);
420 /* Infinity mantissa is all zeroes. */
421 put_field (uto
, order
, fmt
->totalsize
, fmt
->man_start
,
423 goto finalize_byteorder
;
426 #ifdef HAVE_LONG_DOUBLE
427 mant
= ldfrexp (dfrom
, &exponent
);
429 mant
= frexp (dfrom
, &exponent
);
432 put_field (uto
, order
, fmt
->totalsize
, fmt
->exp_start
, fmt
->exp_len
,
433 exponent
+ fmt
->exp_bias
- 1);
435 mant_bits_left
= fmt
->man_len
;
436 mant_off
= fmt
->man_start
;
437 while (mant_bits_left
> 0)
439 unsigned long mant_long
;
440 mant_bits
= mant_bits_left
< 32 ? mant_bits_left
: 32;
442 mant
*= 4294967296.0;
443 mant_long
= ((unsigned long) mant
) & 0xffffffffL
;
446 /* If the integer bit is implicit, then we need to discard it.
447 If we are discarding a zero, we should be (but are not) creating
448 a denormalized number which means adjusting the exponent
450 if (mant_bits_left
== fmt
->man_len
451 && fmt
->intbit
== floatformat_intbit_no
)
454 mant_long
&= 0xffffffffL
;
455 /* If we are processing the top 32 mantissa bits of a doublest
456 so as to convert to a float value with implied integer bit,
457 we will only be putting 31 of those 32 bits into the
458 final value due to the discarding of the top bit. In the
459 case of a small float value where the number of mantissa
460 bits is less than 32, discarding the top bit does not alter
461 the number of bits we will be adding to the result. */
468 /* The bits we want are in the most significant MANT_BITS bits of
469 mant_long. Move them to the least significant. */
470 mant_long
>>= 32 - mant_bits
;
473 put_field (uto
, order
, fmt
->totalsize
,
474 mant_off
, mant_bits
, mant_long
);
475 mant_off
+= mant_bits
;
476 mant_bits_left
-= mant_bits
;
480 /* Do we need to byte-swap the words in the result? */
481 if (order
!= fmt
->byteorder
)
482 floatformat_normalize_byteorder (fmt
, newto
, to
);
485 /* Check if VAL (which is assumed to be a floating point number whose
486 format is described by FMT) is negative. */
489 floatformat_is_negative (const struct floatformat
*fmt
,
490 const bfd_byte
*uval
)
492 enum floatformat_byteorders order
;
493 unsigned char newfrom
[FLOATFORMAT_LARGEST_BYTES
];
495 gdb_assert (fmt
!= NULL
);
496 gdb_assert (fmt
->totalsize
497 <= FLOATFORMAT_LARGEST_BYTES
* FLOATFORMAT_CHAR_BIT
);
499 order
= floatformat_normalize_byteorder (fmt
, uval
, newfrom
);
501 if (order
!= fmt
->byteorder
)
504 return get_field (uval
, order
, fmt
->totalsize
, fmt
->sign_start
, 1);
507 /* Check if VAL is "not a number" (NaN) for FMT. */
510 floatformat_classify (const struct floatformat
*fmt
,
511 const bfd_byte
*uval
)
515 unsigned int mant_bits
, mant_off
;
517 enum floatformat_byteorders order
;
518 unsigned char newfrom
[FLOATFORMAT_LARGEST_BYTES
];
521 gdb_assert (fmt
!= NULL
);
522 gdb_assert (fmt
->totalsize
523 <= FLOATFORMAT_LARGEST_BYTES
* FLOATFORMAT_CHAR_BIT
);
525 order
= floatformat_normalize_byteorder (fmt
, uval
, newfrom
);
527 if (order
!= fmt
->byteorder
)
530 exponent
= get_field (uval
, order
, fmt
->totalsize
, fmt
->exp_start
,
533 mant_bits_left
= fmt
->man_len
;
534 mant_off
= fmt
->man_start
;
537 while (mant_bits_left
> 0)
539 mant_bits
= min (mant_bits_left
, 32);
541 mant
= get_field (uval
, order
, fmt
->totalsize
, mant_off
, mant_bits
);
543 /* If there is an explicit integer bit, mask it off. */
544 if (mant_off
== fmt
->man_start
545 && fmt
->intbit
== floatformat_intbit_yes
)
546 mant
&= ~(1 << (mant_bits
- 1));
554 mant_off
+= mant_bits
;
555 mant_bits_left
-= mant_bits
;
558 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
568 if (exponent
== 0 && !mant_zero
)
569 return float_subnormal
;
571 if (exponent
== fmt
->exp_nan
)
574 return float_infinite
;
585 /* Convert the mantissa of VAL (which is assumed to be a floating
586 point number whose format is described by FMT) into a hexadecimal
587 and store it in a static string. Return a pointer to that string. */
590 floatformat_mantissa (const struct floatformat
*fmt
,
593 unsigned char *uval
= (unsigned char *) val
;
595 unsigned int mant_bits
, mant_off
;
600 enum floatformat_byteorders order
;
601 unsigned char newfrom
[FLOATFORMAT_LARGEST_BYTES
];
603 gdb_assert (fmt
!= NULL
);
604 gdb_assert (fmt
->totalsize
605 <= FLOATFORMAT_LARGEST_BYTES
* FLOATFORMAT_CHAR_BIT
);
607 order
= floatformat_normalize_byteorder (fmt
, uval
, newfrom
);
609 if (order
!= fmt
->byteorder
)
615 /* Make sure we have enough room to store the mantissa. */
616 gdb_assert (sizeof res
> ((fmt
->man_len
+ 7) / 8) * 2);
618 mant_off
= fmt
->man_start
;
619 mant_bits_left
= fmt
->man_len
;
620 mant_bits
= (mant_bits_left
% 32) > 0 ? mant_bits_left
% 32 : 32;
622 mant
= get_field (uval
, order
, fmt
->totalsize
, mant_off
, mant_bits
);
624 len
= xsnprintf (res
, sizeof res
, "%lx", mant
);
626 mant_off
+= mant_bits
;
627 mant_bits_left
-= mant_bits
;
629 while (mant_bits_left
> 0)
631 mant
= get_field (uval
, order
, fmt
->totalsize
, mant_off
, 32);
633 xsnprintf (buf
, sizeof buf
, "%08lx", mant
);
634 gdb_assert (len
+ strlen (buf
) <= sizeof res
);
638 mant_bits_left
-= 32;
645 /* Convert TO/FROM target to the hosts DOUBLEST floating-point format.
647 If the host and target formats agree, we just copy the raw data
648 into the appropriate type of variable and return, letting the host
649 increase precision as necessary. Otherwise, we call the conversion
650 routine and let it do the dirty work. */
652 static const struct floatformat
*host_float_format
= GDB_HOST_FLOAT_FORMAT
;
653 static const struct floatformat
*host_double_format
= GDB_HOST_DOUBLE_FORMAT
;
654 static const struct floatformat
*host_long_double_format
= GDB_HOST_LONG_DOUBLE_FORMAT
;
657 floatformat_to_doublest (const struct floatformat
*fmt
,
658 const void *in
, DOUBLEST
*out
)
660 gdb_assert (fmt
!= NULL
);
661 if (fmt
== host_float_format
)
664 memcpy (&val
, in
, sizeof (val
));
667 else if (fmt
== host_double_format
)
670 memcpy (&val
, in
, sizeof (val
));
673 else if (fmt
== host_long_double_format
)
676 memcpy (&val
, in
, sizeof (val
));
680 convert_floatformat_to_doublest (fmt
, in
, out
);
684 floatformat_from_doublest (const struct floatformat
*fmt
,
685 const DOUBLEST
*in
, void *out
)
687 gdb_assert (fmt
!= NULL
);
688 if (fmt
== host_float_format
)
691 memcpy (out
, &val
, sizeof (val
));
693 else if (fmt
== host_double_format
)
696 memcpy (out
, &val
, sizeof (val
));
698 else if (fmt
== host_long_double_format
)
700 long double val
= *in
;
701 memcpy (out
, &val
, sizeof (val
));
704 convert_doublest_to_floatformat (fmt
, in
, out
);
708 /* Return a floating-point format for a floating-point variable of
709 length LEN. If no suitable floating-point format is found, an
712 We need this functionality since information about the
713 floating-point format of a type is not always available to GDB; the
714 debug information typically only tells us the size of a
717 FIXME: kettenis/2001-10-28: In many places, particularly in
718 target-dependent code, the format of floating-point types is known,
719 but not passed on by GDB. This should be fixed. */
721 static const struct floatformat
*
722 floatformat_from_length (int len
)
724 const struct floatformat
*format
;
725 if (len
* TARGET_CHAR_BIT
== gdbarch_float_bit (current_gdbarch
))
726 format
= gdbarch_float_format (current_gdbarch
)
727 [gdbarch_byte_order (current_gdbarch
)];
728 else if (len
* TARGET_CHAR_BIT
== gdbarch_double_bit (current_gdbarch
))
729 format
= gdbarch_double_format (current_gdbarch
)
730 [gdbarch_byte_order (current_gdbarch
)];
731 else if (len
* TARGET_CHAR_BIT
== gdbarch_long_double_bit (current_gdbarch
))
732 format
= gdbarch_long_double_format (current_gdbarch
)
733 [gdbarch_byte_order (current_gdbarch
)];
734 /* On i386 the 'long double' type takes 96 bits,
735 while the real number of used bits is only 80,
736 both in processor and in memory.
737 The code below accepts the real bit size. */
738 else if ((gdbarch_long_double_format (current_gdbarch
) != NULL
)
739 && (len
* TARGET_CHAR_BIT
==
740 gdbarch_long_double_format (current_gdbarch
)[0]->totalsize
))
741 format
= gdbarch_long_double_format (current_gdbarch
)
742 [gdbarch_byte_order (current_gdbarch
)];
746 error (_("Unrecognized %d-bit floating-point type."),
747 len
* TARGET_CHAR_BIT
);
751 const struct floatformat
*
752 floatformat_from_type (const struct type
*type
)
754 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_FLT
);
755 if (TYPE_FLOATFORMAT (type
) != NULL
)
756 return TYPE_FLOATFORMAT (type
)[gdbarch_byte_order (current_gdbarch
)];
758 return floatformat_from_length (TYPE_LENGTH (type
));
761 /* If the host doesn't define NAN, use zero instead. */
766 /* Extract a floating-point number of length LEN from a target-order
767 byte-stream at ADDR. Returns the value as type DOUBLEST. */
770 extract_floating_by_length (const void *addr
, int len
)
772 const struct floatformat
*fmt
= floatformat_from_length (len
);
775 floatformat_to_doublest (fmt
, addr
, &val
);
780 deprecated_extract_floating (const void *addr
, int len
)
782 return extract_floating_by_length (addr
, len
);
785 /* Store VAL as a floating-point number of length LEN to a
786 target-order byte-stream at ADDR. */
789 store_floating_by_length (void *addr
, int len
, DOUBLEST val
)
791 const struct floatformat
*fmt
= floatformat_from_length (len
);
793 floatformat_from_doublest (fmt
, &val
, addr
);
797 deprecated_store_floating (void *addr
, int len
, DOUBLEST val
)
799 store_floating_by_length (addr
, len
, val
);
802 /* Extract a floating-point number of type TYPE from a target-order
803 byte-stream at ADDR. Returns the value as type DOUBLEST. */
806 extract_typed_floating (const void *addr
, const struct type
*type
)
810 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_FLT
);
812 if (TYPE_FLOATFORMAT (type
) == NULL
)
813 /* Not all code remembers to set the FLOATFORMAT (language
814 specific code? stabs?) so handle that here as a special case. */
815 return extract_floating_by_length (addr
, TYPE_LENGTH (type
));
817 floatformat_to_doublest
818 (TYPE_FLOATFORMAT (type
)[gdbarch_byte_order (current_gdbarch
)],
823 /* Store VAL as a floating-point number of type TYPE to a target-order
824 byte-stream at ADDR. */
827 store_typed_floating (void *addr
, const struct type
*type
, DOUBLEST val
)
829 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_FLT
);
831 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
832 zero out any remaining bytes in the target buffer when TYPE is
833 longer than the actual underlying floating-point format. Perhaps
834 we should store a fixed bitpattern in those remaining bytes,
835 instead of zero, or perhaps we shouldn't touch those remaining
838 NOTE: cagney/2001-10-28: With the way things currently work, it
839 isn't a good idea to leave the end bits undefined. This is
840 because GDB writes out the entire sizeof(<floating>) bits of the
841 floating-point type even though the value might only be stored
842 in, and the target processor may only refer to, the first N <
843 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
844 initialized, GDB would write undefined data to the target. An
845 errant program, refering to that undefined data, would then
846 become non-deterministic.
848 See also the function convert_typed_floating below. */
849 memset (addr
, 0, TYPE_LENGTH (type
));
851 if (TYPE_FLOATFORMAT (type
) == NULL
)
852 /* Not all code remembers to set the FLOATFORMAT (language
853 specific code? stabs?) so handle that here as a special case. */
854 store_floating_by_length (addr
, TYPE_LENGTH (type
), val
);
856 floatformat_from_doublest
857 (TYPE_FLOATFORMAT (type
)[gdbarch_byte_order (current_gdbarch
)],
861 /* Convert a floating-point number of type FROM_TYPE from a
862 target-order byte-stream at FROM to a floating-point number of type
863 TO_TYPE, and store it to a target-order byte-stream at TO. */
866 convert_typed_floating (const void *from
, const struct type
*from_type
,
867 void *to
, const struct type
*to_type
)
869 const struct floatformat
*from_fmt
= floatformat_from_type (from_type
);
870 const struct floatformat
*to_fmt
= floatformat_from_type (to_type
);
872 gdb_assert (TYPE_CODE (from_type
) == TYPE_CODE_FLT
);
873 gdb_assert (TYPE_CODE (to_type
) == TYPE_CODE_FLT
);
875 if (from_fmt
== NULL
|| to_fmt
== NULL
)
877 /* If we don't know the floating-point format of FROM_TYPE or
878 TO_TYPE, there's not much we can do. We might make the
879 assumption that if the length of FROM_TYPE and TO_TYPE match,
880 their floating-point format would match too, but that
881 assumption might be wrong on targets that support
882 floating-point types that only differ in endianness for
883 example. So we warn instead, and zero out the target buffer. */
884 warning (_("Can't convert floating-point number to desired type."));
885 memset (to
, 0, TYPE_LENGTH (to_type
));
887 else if (from_fmt
== to_fmt
)
889 /* We're in business. The floating-point format of FROM_TYPE
890 and TO_TYPE match. However, even though the floating-point
891 format matches, the length of the type might still be
892 different. Make sure we don't overrun any buffers. See
893 comment in store_typed_floating for a discussion about
894 zeroing out remaining bytes in the target buffer. */
895 memset (to
, 0, TYPE_LENGTH (to_type
));
896 memcpy (to
, from
, min (TYPE_LENGTH (from_type
), TYPE_LENGTH (to_type
)));
900 /* The floating-point types don't match. The best we can do
901 (aport from simulating the target FPU) is converting to the
902 widest floating-point type supported by the host, and then
903 again to the desired type. */
906 floatformat_to_doublest (from_fmt
, from
, &d
);
907 floatformat_from_doublest (to_fmt
, &d
, to
);
911 const struct floatformat
*floatformat_ieee_single
[BFD_ENDIAN_UNKNOWN
];
912 const struct floatformat
*floatformat_ieee_double
[BFD_ENDIAN_UNKNOWN
];
913 const struct floatformat
*floatformat_ieee_quad
[BFD_ENDIAN_UNKNOWN
];
914 const struct floatformat
*floatformat_arm_ext
[BFD_ENDIAN_UNKNOWN
];
915 const struct floatformat
*floatformat_ia64_spill
[BFD_ENDIAN_UNKNOWN
];
917 extern void _initialize_doublest (void);
920 _initialize_doublest (void)
922 floatformat_ieee_single
[BFD_ENDIAN_LITTLE
] = &floatformat_ieee_single_little
;
923 floatformat_ieee_single
[BFD_ENDIAN_BIG
] = &floatformat_ieee_single_big
;
924 floatformat_ieee_double
[BFD_ENDIAN_LITTLE
] = &floatformat_ieee_double_little
;
925 floatformat_ieee_double
[BFD_ENDIAN_BIG
] = &floatformat_ieee_double_big
;
926 floatformat_arm_ext
[BFD_ENDIAN_LITTLE
] = &floatformat_arm_ext_littlebyte_bigword
;
927 floatformat_arm_ext
[BFD_ENDIAN_BIG
] = &floatformat_arm_ext_big
;
928 floatformat_ia64_spill
[BFD_ENDIAN_LITTLE
] = &floatformat_ia64_spill_little
;
929 floatformat_ia64_spill
[BFD_ENDIAN_BIG
] = &floatformat_ia64_spill_big
;
930 floatformat_ieee_quad
[BFD_ENDIAN_LITTLE
] = &floatformat_ia64_quad_little
;
931 floatformat_ieee_quad
[BFD_ENDIAN_BIG
] = &floatformat_ia64_quad_big
;