2009-07-07 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / doublest.c
1 /* Floating point routines for GDB, the GNU debugger.
2
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
5 Free Software Foundation, Inc.
6
7 This file is part of GDB.
8
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.
13
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.
18
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/>. */
21
22 /* Support for converting target fp numbers into host DOUBLEST format. */
23
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. */
27
28 #include "defs.h"
29 #include "doublest.h"
30 #include "floatformat.h"
31 #include "gdb_assert.h"
32 #include "gdb_string.h"
33 #include "gdbtypes.h"
34 #include <math.h> /* ldexp */
35
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
40
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
44
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. */
47 static unsigned long
48 get_field (const bfd_byte *data, enum floatformat_byteorders order,
49 unsigned int total_len, unsigned int start, unsigned int len)
50 {
51 unsigned long result;
52 unsigned int cur_byte;
53 int cur_bitshift;
54
55 /* Caller must byte-swap words before calling this routine. */
56 gdb_assert (order == floatformat_little || order == floatformat_big);
57
58 /* Start at the least significant part of the field. */
59 if (order == floatformat_little)
60 {
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;
73 }
74 else
75 {
76 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
77 cur_bitshift =
78 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
79 }
80 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
81 result = *(data + cur_byte) >> (-cur_bitshift);
82 else
83 result = 0;
84 cur_bitshift += FLOATFORMAT_CHAR_BIT;
85 if (order == floatformat_little)
86 ++cur_byte;
87 else
88 --cur_byte;
89
90 /* Move towards the most significant part of the field. */
91 while (cur_bitshift < len)
92 {
93 result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
94 cur_bitshift += FLOATFORMAT_CHAR_BIT;
95 switch (order)
96 {
97 case floatformat_little:
98 ++cur_byte;
99 break;
100 case floatformat_big:
101 --cur_byte;
102 break;
103 }
104 }
105 if (len < sizeof(result) * FLOATFORMAT_CHAR_BIT)
106 /* Mask out bits which are not part of the field */
107 result &= ((1UL << len) - 1);
108 return result;
109 }
110
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. */
114
115 static enum floatformat_byteorders
116 floatformat_normalize_byteorder (const struct floatformat *fmt,
117 const void *from, void *to)
118 {
119 const unsigned char *swapin;
120 unsigned char *swapout;
121 int words;
122
123 if (fmt->byteorder == floatformat_little
124 || fmt->byteorder == floatformat_big)
125 return fmt->byteorder;
126
127 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
128 words >>= 2;
129
130 swapout = (unsigned char *)to;
131 swapin = (const unsigned char *)from;
132
133 if (fmt->byteorder == floatformat_vax)
134 {
135 while (words-- > 0)
136 {
137 *swapout++ = swapin[1];
138 *swapout++ = swapin[0];
139 *swapout++ = swapin[3];
140 *swapout++ = swapin[2];
141 swapin += 4;
142 }
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;
146 }
147 else
148 {
149 gdb_assert (fmt->byteorder == floatformat_littlebyte_bigword);
150
151 while (words-- > 0)
152 {
153 *swapout++ = swapin[3];
154 *swapout++ = swapin[2];
155 *swapout++ = swapin[1];
156 *swapout++ = swapin[0];
157 swapin += 4;
158 }
159 return floatformat_big;
160 }
161 }
162
163 /* Convert from FMT to a DOUBLEST.
164 FROM is the address of the extended float.
165 Store the DOUBLEST in *TO. */
166
167 static void
168 convert_floatformat_to_doublest (const struct floatformat *fmt,
169 const void *from,
170 DOUBLEST *to)
171 {
172 unsigned char *ufrom = (unsigned char *) from;
173 DOUBLEST dto;
174 long exponent;
175 unsigned long mant;
176 unsigned int mant_bits, mant_off;
177 int mant_bits_left;
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;
182
183 gdb_assert (fmt->totalsize
184 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
185
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
188 through a double. */
189 kind = floatformat_classify (fmt, from);
190 if (kind == float_infinite || kind == float_nan)
191 {
192 double dto;
193 floatformat_to_double (fmt, from, &dto);
194 *to = (DOUBLEST) dto;
195 return;
196 }
197
198 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
199
200 if (order != fmt->byteorder)
201 ufrom = newfrom;
202
203 if (fmt->split_half)
204 {
205 DOUBLEST dtop, dbot;
206 floatformat_to_doublest (fmt->split_half, ufrom, &dtop);
207 /* Preserve the sign of 0, which is the sign of the top
208 half. */
209 if (dtop == 0.0)
210 {
211 *to = dtop;
212 return;
213 }
214 floatformat_to_doublest (fmt->split_half,
215 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2,
216 &dbot);
217 *to = dtop + dbot;
218 return;
219 }
220
221 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
222 fmt->exp_len);
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. */
226
227 mant_bits_left = fmt->man_len;
228 mant_off = fmt->man_start;
229 dto = 0.0;
230
231 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
232
233 /* Don't bias NaNs. Use minimum exponent for denorms. For simplicity,
234 we don't check for zero as the exponent doesn't matter. Note the cast
235 to int; exp_bias is unsigned, so it's important to make sure the
236 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;
241
242 /* Build the result algebraically. Might go infinite, underflow, etc;
243 who cares. */
244
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. */
247
248 if (!special_exponent)
249 {
250 if (fmt->intbit == floatformat_intbit_no)
251 dto = ldexp (1.0, exponent);
252 else
253 exponent++;
254 }
255
256 while (mant_bits_left > 0)
257 {
258 mant_bits = min (mant_bits_left, 32);
259
260 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
261
262 dto += ldexp ((double) mant, exponent - mant_bits);
263 exponent -= mant_bits;
264 mant_off += mant_bits;
265 mant_bits_left -= mant_bits;
266 }
267
268 /* Negate it if negative. */
269 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
270 dto = -dto;
271 *to = dto;
272 }
273 \f
274 static void put_field (unsigned char *, enum floatformat_byteorders,
275 unsigned int,
276 unsigned int, unsigned int, unsigned long);
277
278 /* Set a field which starts at START and is LEN bytes long. DATA and
279 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
280 static void
281 put_field (unsigned char *data, enum floatformat_byteorders order,
282 unsigned int total_len, unsigned int start, unsigned int len,
283 unsigned long stuff_to_put)
284 {
285 unsigned int cur_byte;
286 int cur_bitshift;
287
288 /* Caller must byte-swap words before calling this routine. */
289 gdb_assert (order == floatformat_little || order == floatformat_big);
290
291 /* Start at the least significant part of the field. */
292 if (order == floatformat_little)
293 {
294 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;
299 }
300 else
301 {
302 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
303 cur_bitshift =
304 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
305 }
306 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
307 {
308 *(data + cur_byte) &=
309 ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1)
310 << (-cur_bitshift));
311 *(data + cur_byte) |=
312 (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
313 }
314 cur_bitshift += FLOATFORMAT_CHAR_BIT;
315 if (order == floatformat_little)
316 ++cur_byte;
317 else
318 --cur_byte;
319
320 /* Move towards the most significant part of the field. */
321 while (cur_bitshift < len)
322 {
323 if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
324 {
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);
329 }
330 else
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)
335 ++cur_byte;
336 else
337 --cur_byte;
338 }
339 }
340
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. */
345
346 static long double ldfrexp (long double value, int *eptr);
347
348 static long double
349 ldfrexp (long double value, int *eptr)
350 {
351 long double tmp;
352 int exp;
353
354 /* Unfortunately, there are no portable functions for extracting the exponent
355 of a long double, so we have to do it iteratively by multiplying or dividing
356 by two until the fraction is between 0.5 and 1.0. */
357
358 if (value < 0.0l)
359 value = -value;
360
361 tmp = 1.0l;
362 exp = 0;
363
364 if (value >= tmp) /* Value >= 1.0 */
365 while (value >= tmp)
366 {
367 tmp *= 2.0l;
368 exp++;
369 }
370 else if (value != 0.0l) /* Value < 1.0 and > 0.0 */
371 {
372 while (value < tmp)
373 {
374 tmp /= 2.0l;
375 exp--;
376 }
377 tmp *= 2.0l;
378 exp++;
379 }
380
381 *eptr = exp;
382 return value / tmp;
383 }
384 #endif /* HAVE_LONG_DOUBLE */
385
386
387 /* The converse: convert the DOUBLEST *FROM to an extended float and
388 store where TO points. Neither FROM nor TO have any alignment
389 restrictions. */
390
391 static void
392 convert_doublest_to_floatformat (CONST struct floatformat *fmt,
393 const DOUBLEST *from, void *to)
394 {
395 DOUBLEST dfrom;
396 int exponent;
397 DOUBLEST mant;
398 unsigned int mant_bits, mant_off;
399 int mant_bits_left;
400 unsigned char *uto = (unsigned char *) to;
401 enum floatformat_byteorders order = fmt->byteorder;
402 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
403
404 if (order != floatformat_little)
405 order = floatformat_big;
406
407 if (order != fmt->byteorder)
408 uto = newto;
409
410 memcpy (&dfrom, from, sizeof (dfrom));
411 memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
412 / FLOATFORMAT_CHAR_BIT);
413
414 if (fmt->split_half)
415 {
416 /* Use static volatile to ensure that any excess precision is
417 removed via storing in memory, and so the top half really is
418 the result of converting to double. */
419 static volatile double dtop, dbot;
420 DOUBLEST dtopnv, dbotnv;
421 dtop = (double) dfrom;
422 /* If the rounded top half is Inf, the bottom must be 0 not NaN
423 or Inf. */
424 if (dtop + dtop == dtop && dtop != 0.0)
425 dbot = 0.0;
426 else
427 dbot = (double) (dfrom - (DOUBLEST) dtop);
428 dtopnv = dtop;
429 dbotnv = dbot;
430 floatformat_from_doublest (fmt->split_half, &dtopnv, uto);
431 floatformat_from_doublest (fmt->split_half, &dbotnv,
432 (uto
433 + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2));
434 return;
435 }
436
437 if (dfrom == 0)
438 return; /* Result is zero */
439 if (dfrom != dfrom) /* Result is NaN */
440 {
441 /* From is NaN */
442 put_field (uto, order, fmt->totalsize, fmt->exp_start,
443 fmt->exp_len, fmt->exp_nan);
444 /* Be sure it's not infinity, but NaN value is irrel */
445 put_field (uto, order, fmt->totalsize, fmt->man_start,
446 32, 1);
447 goto finalize_byteorder;
448 }
449
450 /* If negative, set the sign bit. */
451 if (dfrom < 0)
452 {
453 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
454 dfrom = -dfrom;
455 }
456
457 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity */
458 {
459 /* Infinity exponent is same as NaN's. */
460 put_field (uto, order, fmt->totalsize, fmt->exp_start,
461 fmt->exp_len, fmt->exp_nan);
462 /* Infinity mantissa is all zeroes. */
463 put_field (uto, order, fmt->totalsize, fmt->man_start,
464 fmt->man_len, 0);
465 goto finalize_byteorder;
466 }
467
468 #ifdef HAVE_LONG_DOUBLE
469 mant = ldfrexp (dfrom, &exponent);
470 #else
471 mant = frexp (dfrom, &exponent);
472 #endif
473
474 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
475 exponent + fmt->exp_bias - 1);
476
477 mant_bits_left = fmt->man_len;
478 mant_off = fmt->man_start;
479 while (mant_bits_left > 0)
480 {
481 unsigned long mant_long;
482 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
483
484 mant *= 4294967296.0;
485 mant_long = ((unsigned long) mant) & 0xffffffffL;
486 mant -= mant_long;
487
488 /* If the integer bit is implicit, then we need to discard it.
489 If we are discarding a zero, we should be (but are not) creating
490 a denormalized number which means adjusting the exponent
491 (I think). */
492 if (mant_bits_left == fmt->man_len
493 && fmt->intbit == floatformat_intbit_no)
494 {
495 mant_long <<= 1;
496 mant_long &= 0xffffffffL;
497 /* If we are processing the top 32 mantissa bits of a doublest
498 so as to convert to a float value with implied integer bit,
499 we will only be putting 31 of those 32 bits into the
500 final value due to the discarding of the top bit. In the
501 case of a small float value where the number of mantissa
502 bits is less than 32, discarding the top bit does not alter
503 the number of bits we will be adding to the result. */
504 if (mant_bits == 32)
505 mant_bits -= 1;
506 }
507
508 if (mant_bits < 32)
509 {
510 /* The bits we want are in the most significant MANT_BITS bits of
511 mant_long. Move them to the least significant. */
512 mant_long >>= 32 - mant_bits;
513 }
514
515 put_field (uto, order, fmt->totalsize,
516 mant_off, mant_bits, mant_long);
517 mant_off += mant_bits;
518 mant_bits_left -= mant_bits;
519 }
520
521 finalize_byteorder:
522 /* Do we need to byte-swap the words in the result? */
523 if (order != fmt->byteorder)
524 floatformat_normalize_byteorder (fmt, newto, to);
525 }
526
527 /* Check if VAL (which is assumed to be a floating point number whose
528 format is described by FMT) is negative. */
529
530 int
531 floatformat_is_negative (const struct floatformat *fmt,
532 const bfd_byte *uval)
533 {
534 enum floatformat_byteorders order;
535 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
536
537 gdb_assert (fmt != NULL);
538 gdb_assert (fmt->totalsize
539 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
540
541 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
542
543 if (order != fmt->byteorder)
544 uval = newfrom;
545
546 return get_field (uval, order, fmt->totalsize, fmt->sign_start, 1);
547 }
548
549 /* Check if VAL is "not a number" (NaN) for FMT. */
550
551 enum float_kind
552 floatformat_classify (const struct floatformat *fmt,
553 const bfd_byte *uval)
554 {
555 long exponent;
556 unsigned long mant;
557 unsigned int mant_bits, mant_off;
558 int mant_bits_left;
559 enum floatformat_byteorders order;
560 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
561 int mant_zero;
562
563 gdb_assert (fmt != NULL);
564 gdb_assert (fmt->totalsize
565 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
566
567 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
568
569 if (order != fmt->byteorder)
570 uval = newfrom;
571
572 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
573 fmt->exp_len);
574
575 mant_bits_left = fmt->man_len;
576 mant_off = fmt->man_start;
577
578 mant_zero = 1;
579 while (mant_bits_left > 0)
580 {
581 mant_bits = min (mant_bits_left, 32);
582
583 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
584
585 /* If there is an explicit integer bit, mask it off. */
586 if (mant_off == fmt->man_start
587 && fmt->intbit == floatformat_intbit_yes)
588 mant &= ~(1 << (mant_bits - 1));
589
590 if (mant)
591 {
592 mant_zero = 0;
593 break;
594 }
595
596 mant_off += mant_bits;
597 mant_bits_left -= mant_bits;
598 }
599
600 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
601 supported. */
602 if (! fmt->exp_nan)
603 {
604 if (mant_zero)
605 return float_zero;
606 else
607 return float_normal;
608 }
609
610 if (exponent == 0 && !mant_zero)
611 return float_subnormal;
612
613 if (exponent == fmt->exp_nan)
614 {
615 if (mant_zero)
616 return float_infinite;
617 else
618 return float_nan;
619 }
620
621 if (mant_zero)
622 return float_zero;
623
624 return float_normal;
625 }
626
627 /* Convert the mantissa of VAL (which is assumed to be a floating
628 point number whose format is described by FMT) into a hexadecimal
629 and store it in a static string. Return a pointer to that string. */
630
631 const char *
632 floatformat_mantissa (const struct floatformat *fmt,
633 const bfd_byte *val)
634 {
635 unsigned char *uval = (unsigned char *) val;
636 unsigned long mant;
637 unsigned int mant_bits, mant_off;
638 int mant_bits_left;
639 static char res[50];
640 char buf[9];
641 int len;
642 enum floatformat_byteorders order;
643 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
644
645 gdb_assert (fmt != NULL);
646 gdb_assert (fmt->totalsize
647 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
648
649 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
650
651 if (order != fmt->byteorder)
652 uval = newfrom;
653
654 if (! fmt->exp_nan)
655 return 0;
656
657 /* Make sure we have enough room to store the mantissa. */
658 gdb_assert (sizeof res > ((fmt->man_len + 7) / 8) * 2);
659
660 mant_off = fmt->man_start;
661 mant_bits_left = fmt->man_len;
662 mant_bits = (mant_bits_left % 32) > 0 ? mant_bits_left % 32 : 32;
663
664 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
665
666 len = xsnprintf (res, sizeof res, "%lx", mant);
667
668 mant_off += mant_bits;
669 mant_bits_left -= mant_bits;
670
671 while (mant_bits_left > 0)
672 {
673 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
674
675 xsnprintf (buf, sizeof buf, "%08lx", mant);
676 gdb_assert (len + strlen (buf) <= sizeof res);
677 strcat (res, buf);
678
679 mant_off += 32;
680 mant_bits_left -= 32;
681 }
682
683 return res;
684 }
685
686 \f
687 /* Convert TO/FROM target to the hosts DOUBLEST floating-point format.
688
689 If the host and target formats agree, we just copy the raw data
690 into the appropriate type of variable and return, letting the host
691 increase precision as necessary. Otherwise, we call the conversion
692 routine and let it do the dirty work. */
693
694 static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
695 static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
696 static const struct floatformat *host_long_double_format = GDB_HOST_LONG_DOUBLE_FORMAT;
697
698 void
699 floatformat_to_doublest (const struct floatformat *fmt,
700 const void *in, DOUBLEST *out)
701 {
702 gdb_assert (fmt != NULL);
703 if (fmt == host_float_format)
704 {
705 float val;
706 memcpy (&val, in, sizeof (val));
707 *out = val;
708 }
709 else if (fmt == host_double_format)
710 {
711 double val;
712 memcpy (&val, in, sizeof (val));
713 *out = val;
714 }
715 else if (fmt == host_long_double_format)
716 {
717 long double val;
718 memcpy (&val, in, sizeof (val));
719 *out = val;
720 }
721 else
722 convert_floatformat_to_doublest (fmt, in, out);
723 }
724
725 void
726 floatformat_from_doublest (const struct floatformat *fmt,
727 const DOUBLEST *in, void *out)
728 {
729 gdb_assert (fmt != NULL);
730 if (fmt == host_float_format)
731 {
732 float val = *in;
733 memcpy (out, &val, sizeof (val));
734 }
735 else if (fmt == host_double_format)
736 {
737 double val = *in;
738 memcpy (out, &val, sizeof (val));
739 }
740 else if (fmt == host_long_double_format)
741 {
742 long double val = *in;
743 memcpy (out, &val, sizeof (val));
744 }
745 else
746 convert_doublest_to_floatformat (fmt, in, out);
747 }
748
749 \f
750 /* Return a floating-point format for a floating-point variable of
751 length LEN. If no suitable floating-point format is found, an
752 error is thrown.
753
754 We need this functionality since information about the
755 floating-point format of a type is not always available to GDB; the
756 debug information typically only tells us the size of a
757 floating-point type.
758
759 FIXME: kettenis/2001-10-28: In many places, particularly in
760 target-dependent code, the format of floating-point types is known,
761 but not passed on by GDB. This should be fixed. */
762
763 static const struct floatformat *
764 floatformat_from_length (struct gdbarch *gdbarch, int len)
765 {
766 const struct floatformat *format;
767 if (len * TARGET_CHAR_BIT == gdbarch_float_bit (gdbarch))
768 format = gdbarch_float_format (gdbarch)
769 [gdbarch_byte_order (gdbarch)];
770 else if (len * TARGET_CHAR_BIT == gdbarch_double_bit (gdbarch))
771 format = gdbarch_double_format (gdbarch)
772 [gdbarch_byte_order (gdbarch)];
773 else if (len * TARGET_CHAR_BIT == gdbarch_long_double_bit (gdbarch))
774 format = gdbarch_long_double_format (gdbarch)
775 [gdbarch_byte_order (gdbarch)];
776 /* On i386 the 'long double' type takes 96 bits,
777 while the real number of used bits is only 80,
778 both in processor and in memory.
779 The code below accepts the real bit size. */
780 else if ((gdbarch_long_double_format (gdbarch) != NULL)
781 && (len * TARGET_CHAR_BIT ==
782 gdbarch_long_double_format (gdbarch)[0]->totalsize))
783 format = gdbarch_long_double_format (gdbarch)
784 [gdbarch_byte_order (gdbarch)];
785 else
786 format = NULL;
787 if (format == NULL)
788 error (_("Unrecognized %d-bit floating-point type."),
789 len * TARGET_CHAR_BIT);
790 return format;
791 }
792
793 const struct floatformat *
794 floatformat_from_type (const struct type *type)
795 {
796 struct gdbarch *gdbarch = get_type_arch (type);
797 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
798 if (TYPE_FLOATFORMAT (type) != NULL)
799 return TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)];
800 else
801 return floatformat_from_length (gdbarch, TYPE_LENGTH (type));
802 }
803
804 /* Extract a floating-point number of type TYPE from a target-order
805 byte-stream at ADDR. Returns the value as type DOUBLEST. */
806
807 DOUBLEST
808 extract_typed_floating (const void *addr, const struct type *type)
809 {
810 const struct floatformat *fmt = floatformat_from_type (type);
811 DOUBLEST retval;
812
813 floatformat_to_doublest (fmt, addr, &retval);
814 return retval;
815 }
816
817 /* Store VAL as a floating-point number of type TYPE to a target-order
818 byte-stream at ADDR. */
819
820 void
821 store_typed_floating (void *addr, const struct type *type, DOUBLEST val)
822 {
823 const struct floatformat *fmt = floatformat_from_type (type);
824
825 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
826 zero out any remaining bytes in the target buffer when TYPE is
827 longer than the actual underlying floating-point format. Perhaps
828 we should store a fixed bitpattern in those remaining bytes,
829 instead of zero, or perhaps we shouldn't touch those remaining
830 bytes at all.
831
832 NOTE: cagney/2001-10-28: With the way things currently work, it
833 isn't a good idea to leave the end bits undefined. This is
834 because GDB writes out the entire sizeof(<floating>) bits of the
835 floating-point type even though the value might only be stored
836 in, and the target processor may only refer to, the first N <
837 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
838 initialized, GDB would write undefined data to the target. An
839 errant program, refering to that undefined data, would then
840 become non-deterministic.
841
842 See also the function convert_typed_floating below. */
843 memset (addr, 0, TYPE_LENGTH (type));
844
845 floatformat_from_doublest (fmt, &val, addr);
846 }
847
848 /* Convert a floating-point number of type FROM_TYPE from a
849 target-order byte-stream at FROM to a floating-point number of type
850 TO_TYPE, and store it to a target-order byte-stream at TO. */
851
852 void
853 convert_typed_floating (const void *from, const struct type *from_type,
854 void *to, const struct type *to_type)
855 {
856 const struct floatformat *from_fmt = floatformat_from_type (from_type);
857 const struct floatformat *to_fmt = floatformat_from_type (to_type);
858
859 if (from_fmt == NULL || to_fmt == NULL)
860 {
861 /* If we don't know the floating-point format of FROM_TYPE or
862 TO_TYPE, there's not much we can do. We might make the
863 assumption that if the length of FROM_TYPE and TO_TYPE match,
864 their floating-point format would match too, but that
865 assumption might be wrong on targets that support
866 floating-point types that only differ in endianness for
867 example. So we warn instead, and zero out the target buffer. */
868 warning (_("Can't convert floating-point number to desired type."));
869 memset (to, 0, TYPE_LENGTH (to_type));
870 }
871 else if (from_fmt == to_fmt)
872 {
873 /* We're in business. The floating-point format of FROM_TYPE
874 and TO_TYPE match. However, even though the floating-point
875 format matches, the length of the type might still be
876 different. Make sure we don't overrun any buffers. See
877 comment in store_typed_floating for a discussion about
878 zeroing out remaining bytes in the target buffer. */
879 memset (to, 0, TYPE_LENGTH (to_type));
880 memcpy (to, from, min (TYPE_LENGTH (from_type), TYPE_LENGTH (to_type)));
881 }
882 else
883 {
884 /* The floating-point types don't match. The best we can do
885 (apart from simulating the target FPU) is converting to the
886 widest floating-point type supported by the host, and then
887 again to the desired type. */
888 DOUBLEST d;
889
890 floatformat_to_doublest (from_fmt, from, &d);
891 floatformat_from_doublest (to_fmt, &d, to);
892 }
893 }
894
895 const struct floatformat *floatformat_ieee_single[BFD_ENDIAN_UNKNOWN];
896 const struct floatformat *floatformat_ieee_double[BFD_ENDIAN_UNKNOWN];
897 const struct floatformat *floatformat_ieee_quad[BFD_ENDIAN_UNKNOWN];
898 const struct floatformat *floatformat_arm_ext[BFD_ENDIAN_UNKNOWN];
899 const struct floatformat *floatformat_ia64_spill[BFD_ENDIAN_UNKNOWN];
900
901 extern void _initialize_doublest (void);
902
903 extern void
904 _initialize_doublest (void)
905 {
906 floatformat_ieee_single[BFD_ENDIAN_LITTLE] = &floatformat_ieee_single_little;
907 floatformat_ieee_single[BFD_ENDIAN_BIG] = &floatformat_ieee_single_big;
908 floatformat_ieee_double[BFD_ENDIAN_LITTLE] = &floatformat_ieee_double_little;
909 floatformat_ieee_double[BFD_ENDIAN_BIG] = &floatformat_ieee_double_big;
910 floatformat_arm_ext[BFD_ENDIAN_LITTLE] = &floatformat_arm_ext_littlebyte_bigword;
911 floatformat_arm_ext[BFD_ENDIAN_BIG] = &floatformat_arm_ext_big;
912 floatformat_ia64_spill[BFD_ENDIAN_LITTLE] = &floatformat_ia64_spill_little;
913 floatformat_ia64_spill[BFD_ENDIAN_BIG] = &floatformat_ia64_spill_big;
914 floatformat_ieee_quad[BFD_ENDIAN_LITTLE] = &floatformat_ia64_quad_little;
915 floatformat_ieee_quad[BFD_ENDIAN_BIG] = &floatformat_ia64_quad_big;
916 }
This page took 0.08385 seconds and 4 git commands to generate.