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