* i386-linux-tdep.c (I386_LINUX_RECORD_SIZE_*,
[deliverable/binutils-gdb.git] / gdb / doublest.c
CommitLineData
d16aafd8 1/* Floating point routines for GDB, the GNU debugger.
f1908289 2
6aba47ca 3 Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
0fb0cc75 4 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008, 2009
0a3e99f6 5 Free Software Foundation, Inc.
d16aafd8
AC
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
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
d16aafd8
AC
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
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
d16aafd8
AC
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"
96d2f608 33#include "gdbtypes.h"
d16aafd8
AC
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
fcab3fb5
RE
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
d16aafd8
AC
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. */
47static unsigned long
108d6ead 48get_field (const bfd_byte *data, enum floatformat_byteorders order,
d16aafd8
AC
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
fcab3fb5
RE
55 /* Caller must byte-swap words before calling this routine. */
56 gdb_assert (order == floatformat_little || order == floatformat_big);
57
d16aafd8 58 /* Start at the least significant part of the field. */
fcab3fb5 59 if (order == floatformat_little)
d16aafd8
AC
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;
fcab3fb5 85 if (order == floatformat_little)
d16aafd8
AC
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;
c35f4ffc
AC
95 switch (order)
96 {
97 case floatformat_little:
98 ++cur_byte;
99 break;
100 case floatformat_big:
101 --cur_byte;
102 break;
c35f4ffc 103 }
d16aafd8
AC
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
0a3e99f6
MK
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
fcab3fb5
RE
115static enum floatformat_byteorders
116floatformat_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
fcab3fb5
RE
127 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
128 words >>= 2;
129
130 swapout = (unsigned char *)to;
131 swapin = (const unsigned char *)from;
132
0a3e99f6
MK
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
fcab3fb5 148 {
0a3e99f6
MK
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;
fcab3fb5 160 }
fcab3fb5
RE
161}
162
d16aafd8
AC
163/* Convert from FMT to a DOUBLEST.
164 FROM is the address of the extended float.
165 Store the DOUBLEST in *TO. */
166
c422e771
AC
167static void
168convert_floatformat_to_doublest (const struct floatformat *fmt,
169 const void *from,
170 DOUBLEST *to)
d16aafd8
AC
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 */
fcab3fb5
RE
179 enum floatformat_byteorders order;
180 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
20389057 181 enum float_kind kind;
fcab3fb5
RE
182
183 gdb_assert (fmt->totalsize
184 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
d16aafd8 185
20389057
DJ
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
fcab3fb5 198 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
d16aafd8 199
fcab3fb5
RE
200 if (order != fmt->byteorder)
201 ufrom = newfrom;
d16aafd8 202
b14d30e1
JM
203 if (fmt->split_half)
204 {
542a88d0
LM
205 DOUBLEST dtop, dbot;
206 floatformat_to_doublest (fmt->split_half, ufrom, &dtop);
b14d30e1
JM
207 /* Preserve the sign of 0, which is the sign of the top
208 half. */
209 if (dtop == 0.0)
210 {
542a88d0 211 *to = dtop;
b14d30e1
JM
212 return;
213 }
542a88d0 214 floatformat_to_doublest (fmt->split_half,
b14d30e1
JM
215 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2,
216 &dbot);
542a88d0 217 *to = dtop + dbot;
b14d30e1
JM
218 return;
219 }
220
fcab3fb5
RE
221 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
222 fmt->exp_len);
d16aafd8
AC
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
38c52d5a
DJ
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. */
d16aafd8
AC
237 if (!special_exponent)
238 exponent -= fmt->exp_bias;
239 else if (exponent == 0)
1c704f11 240 exponent = 1 - fmt->exp_bias;
d16aafd8
AC
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
fcab3fb5 260 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
d16aafd8
AC
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. */
fcab3fb5 269 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
d16aafd8
AC
270 dto = -dto;
271 *to = dto;
272}
273\f
274static 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. */
280static void
281put_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
fcab3fb5
RE
288 /* Caller must byte-swap words before calling this routine. */
289 gdb_assert (order == floatformat_little || order == floatformat_big);
290
d16aafd8 291 /* Start at the least significant part of the field. */
fcab3fb5 292 if (order == floatformat_little)
d16aafd8
AC
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;
fcab3fb5 315 if (order == floatformat_little)
d16aafd8
AC
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;
fcab3fb5 334 if (order == floatformat_little)
d16aafd8
AC
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
346static long double ldfrexp (long double value, int *eptr);
347
348static long double
349ldfrexp (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
0a3e99f6
MK
387/* The converse: convert the DOUBLEST *FROM to an extended float and
388 store where TO points. Neither FROM nor TO have any alignment
d16aafd8
AC
389 restrictions. */
390
c422e771
AC
391static void
392convert_doublest_to_floatformat (CONST struct floatformat *fmt,
0a3e99f6 393 const DOUBLEST *from, void *to)
d16aafd8
AC
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;
fcab3fb5 401 enum floatformat_byteorders order = fmt->byteorder;
0a3e99f6 402 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
fcab3fb5 403
0a3e99f6 404 if (order != floatformat_little)
fcab3fb5 405 order = floatformat_big;
d16aafd8 406
0a3e99f6
MK
407 if (order != fmt->byteorder)
408 uto = newto;
409
d16aafd8
AC
410 memcpy (&dfrom, from, sizeof (dfrom));
411 memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
412 / FLOATFORMAT_CHAR_BIT);
b14d30e1
JM
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;
542a88d0 420 DOUBLEST dtopnv, dbotnv;
b14d30e1
JM
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;
542a88d0
LM
430 floatformat_from_doublest (fmt->split_half, &dtopnv, uto);
431 floatformat_from_doublest (fmt->split_half, &dbotnv,
b14d30e1
JM
432 (uto
433 + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2));
434 return;
435 }
436
d16aafd8
AC
437 if (dfrom == 0)
438 return; /* Result is zero */
439 if (dfrom != dfrom) /* Result is NaN */
440 {
441 /* From is NaN */
fcab3fb5 442 put_field (uto, order, fmt->totalsize, fmt->exp_start,
d16aafd8
AC
443 fmt->exp_len, fmt->exp_nan);
444 /* Be sure it's not infinity, but NaN value is irrel */
fcab3fb5 445 put_field (uto, order, fmt->totalsize, fmt->man_start,
d16aafd8 446 32, 1);
fcab3fb5 447 goto finalize_byteorder;
d16aafd8
AC
448 }
449
450 /* If negative, set the sign bit. */
451 if (dfrom < 0)
452 {
fcab3fb5 453 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
d16aafd8
AC
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. */
fcab3fb5 460 put_field (uto, order, fmt->totalsize, fmt->exp_start,
d16aafd8
AC
461 fmt->exp_len, fmt->exp_nan);
462 /* Infinity mantissa is all zeroes. */
fcab3fb5 463 put_field (uto, order, fmt->totalsize, fmt->man_start,
d16aafd8 464 fmt->man_len, 0);
fcab3fb5 465 goto finalize_byteorder;
d16aafd8
AC
466 }
467
468#ifdef HAVE_LONG_DOUBLE
469 mant = ldfrexp (dfrom, &exponent);
470#else
471 mant = frexp (dfrom, &exponent);
472#endif
473
fcab3fb5 474 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
d16aafd8
AC
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;
06194148
JJ
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;
d16aafd8
AC
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
fcab3fb5 515 put_field (uto, order, fmt->totalsize,
d16aafd8
AC
516 mant_off, mant_bits, mant_long);
517 mant_off += mant_bits;
518 mant_bits_left -= mant_bits;
519 }
fcab3fb5
RE
520
521 finalize_byteorder:
522 /* Do we need to byte-swap the words in the result? */
523 if (order != fmt->byteorder)
0a3e99f6 524 floatformat_normalize_byteorder (fmt, newto, to);
d16aafd8
AC
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
530int
108d6ead
AC
531floatformat_is_negative (const struct floatformat *fmt,
532 const bfd_byte *uval)
d16aafd8 533{
fcab3fb5
RE
534 enum floatformat_byteorders order;
535 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
536
069e84fd 537 gdb_assert (fmt != NULL);
fcab3fb5
RE
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);
d16aafd8
AC
547}
548
549/* Check if VAL is "not a number" (NaN) for FMT. */
550
20389057
DJ
551enum float_kind
552floatformat_classify (const struct floatformat *fmt,
553 const bfd_byte *uval)
d16aafd8 554{
d16aafd8
AC
555 long exponent;
556 unsigned long mant;
557 unsigned int mant_bits, mant_off;
558 int mant_bits_left;
fcab3fb5
RE
559 enum floatformat_byteorders order;
560 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
20389057 561 int mant_zero;
fcab3fb5 562
069e84fd 563 gdb_assert (fmt != NULL);
fcab3fb5
RE
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;
069e84fd 571
fcab3fb5
RE
572 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
573 fmt->exp_len);
d16aafd8 574
d16aafd8
AC
575 mant_bits_left = fmt->man_len;
576 mant_off = fmt->man_start;
577
20389057 578 mant_zero = 1;
d16aafd8
AC
579 while (mant_bits_left > 0)
580 {
581 mant_bits = min (mant_bits_left, 32);
582
fcab3fb5 583 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
d16aafd8
AC
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)
20389057
DJ
591 {
592 mant_zero = 0;
593 break;
594 }
d16aafd8
AC
595
596 mant_off += mant_bits;
597 mant_bits_left -= mant_bits;
598 }
599
20389057
DJ
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;
d16aafd8
AC
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
108d6ead
AC
631const char *
632floatformat_mantissa (const struct floatformat *fmt,
633 const bfd_byte *val)
d16aafd8
AC
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];
27df76f3 641 int len;
fcab3fb5
RE
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;
d16aafd8
AC
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
fcab3fb5 664 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
d16aafd8 665
27df76f3 666 len = xsnprintf (res, sizeof res, "%lx", mant);
d16aafd8
AC
667
668 mant_off += mant_bits;
669 mant_bits_left -= mant_bits;
27df76f3 670
d16aafd8
AC
671 while (mant_bits_left > 0)
672 {
fcab3fb5 673 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
d16aafd8 674
27df76f3
MK
675 xsnprintf (buf, sizeof buf, "%08lx", mant);
676 gdb_assert (len + strlen (buf) <= sizeof res);
d16aafd8
AC
677 strcat (res, buf);
678
679 mant_off += 32;
680 mant_bits_left -= 32;
681 }
682
683 return res;
684}
685
d16aafd8 686\f
c422e771
AC
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
c35f4ffc
AC
694static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
695static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
696static const struct floatformat *host_long_double_format = GDB_HOST_LONG_DOUBLE_FORMAT;
c422e771
AC
697
698void
699floatformat_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
725void
726floatformat_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}
d16aafd8 748
c422e771 749\f
87ffba60 750/* Return a floating-point format for a floating-point variable of
47b3f456
AC
751 length LEN. If no suitable floating-point format is found, an
752 error is thrown.
d16aafd8 753
87ffba60
MK
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
b9362cc7 763static const struct floatformat *
87ffba60 764floatformat_from_length (int len)
d16aafd8 765{
47b3f456 766 const struct floatformat *format;
ea06eb3d
UW
767 if (len * TARGET_CHAR_BIT == gdbarch_float_bit (current_gdbarch))
768 format = gdbarch_float_format (current_gdbarch)
769 [gdbarch_byte_order (current_gdbarch)];
770 else if (len * TARGET_CHAR_BIT == gdbarch_double_bit (current_gdbarch))
771 format = gdbarch_double_format (current_gdbarch)
772 [gdbarch_byte_order (current_gdbarch)];
773 else if (len * TARGET_CHAR_BIT == gdbarch_long_double_bit (current_gdbarch))
774 format = gdbarch_long_double_format (current_gdbarch)
775 [gdbarch_byte_order (current_gdbarch)];
ddbfdd06
PM
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. */
ea06eb3d 780 else if ((gdbarch_long_double_format (current_gdbarch) != NULL)
ddbfdd06 781 && (len * TARGET_CHAR_BIT ==
ea06eb3d
UW
782 gdbarch_long_double_format (current_gdbarch)[0]->totalsize))
783 format = gdbarch_long_double_format (current_gdbarch)
784 [gdbarch_byte_order (current_gdbarch)];
47b3f456
AC
785 else
786 format = NULL;
787 if (format == NULL)
8a3fe4f8 788 error (_("Unrecognized %d-bit floating-point type."),
9b0dea39 789 len * TARGET_CHAR_BIT);
47b3f456 790 return format;
87ffba60
MK
791}
792
c2f05ac9
AC
793const struct floatformat *
794floatformat_from_type (const struct type *type)
795{
796 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
797 if (TYPE_FLOATFORMAT (type) != NULL)
0d20ae72 798 return TYPE_FLOATFORMAT (type)[gdbarch_byte_order (current_gdbarch)];
c2f05ac9
AC
799 else
800 return floatformat_from_length (TYPE_LENGTH (type));
801}
802
87ffba60
MK
803/* Extract a floating-point number of type TYPE from a target-order
804 byte-stream at ADDR. Returns the value as type DOUBLEST. */
96d2f608
AC
805
806DOUBLEST
807extract_typed_floating (const void *addr, const struct type *type)
808{
e035e373 809 const struct floatformat *fmt = floatformat_from_type (type);
96d2f608 810 DOUBLEST retval;
87ffba60 811
e035e373 812 floatformat_to_doublest (fmt, addr, &retval);
96d2f608
AC
813 return retval;
814}
815
87ffba60
MK
816/* Store VAL as a floating-point number of type TYPE to a target-order
817 byte-stream at ADDR. */
818
96d2f608
AC
819void
820store_typed_floating (void *addr, const struct type *type, DOUBLEST val)
821{
e035e373 822 const struct floatformat *fmt = floatformat_from_type (type);
87ffba60
MK
823
824 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
825 zero out any remaining bytes in the target buffer when TYPE is
826 longer than the actual underlying floating-point format. Perhaps
827 we should store a fixed bitpattern in those remaining bytes,
828 instead of zero, or perhaps we shouldn't touch those remaining
829 bytes at all.
830
831 NOTE: cagney/2001-10-28: With the way things currently work, it
832 isn't a good idea to leave the end bits undefined. This is
833 because GDB writes out the entire sizeof(<floating>) bits of the
834 floating-point type even though the value might only be stored
835 in, and the target processor may only refer to, the first N <
836 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
837 initialized, GDB would write undefined data to the target. An
838 errant program, refering to that undefined data, would then
43686d64
MK
839 become non-deterministic.
840
841 See also the function convert_typed_floating below. */
96d2f608 842 memset (addr, 0, TYPE_LENGTH (type));
87ffba60 843
e035e373 844 floatformat_from_doublest (fmt, &val, addr);
96d2f608 845}
43686d64
MK
846
847/* Convert a floating-point number of type FROM_TYPE from a
848 target-order byte-stream at FROM to a floating-point number of type
849 TO_TYPE, and store it to a target-order byte-stream at TO. */
850
851void
852convert_typed_floating (const void *from, const struct type *from_type,
853 void *to, const struct type *to_type)
854{
c2f05ac9
AC
855 const struct floatformat *from_fmt = floatformat_from_type (from_type);
856 const struct floatformat *to_fmt = floatformat_from_type (to_type);
43686d64 857
43686d64
MK
858 if (from_fmt == NULL || to_fmt == NULL)
859 {
860 /* If we don't know the floating-point format of FROM_TYPE or
861 TO_TYPE, there's not much we can do. We might make the
862 assumption that if the length of FROM_TYPE and TO_TYPE match,
863 their floating-point format would match too, but that
864 assumption might be wrong on targets that support
865 floating-point types that only differ in endianness for
866 example. So we warn instead, and zero out the target buffer. */
8a3fe4f8 867 warning (_("Can't convert floating-point number to desired type."));
43686d64
MK
868 memset (to, 0, TYPE_LENGTH (to_type));
869 }
870 else if (from_fmt == to_fmt)
871 {
872 /* We're in business. The floating-point format of FROM_TYPE
873 and TO_TYPE match. However, even though the floating-point
874 format matches, the length of the type might still be
875 different. Make sure we don't overrun any buffers. See
876 comment in store_typed_floating for a discussion about
877 zeroing out remaining bytes in the target buffer. */
878 memset (to, 0, TYPE_LENGTH (to_type));
879 memcpy (to, from, min (TYPE_LENGTH (from_type), TYPE_LENGTH (to_type)));
880 }
881 else
882 {
883 /* The floating-point types don't match. The best we can do
938f5214 884 (apart from simulating the target FPU) is converting to the
43686d64
MK
885 widest floating-point type supported by the host, and then
886 again to the desired type. */
887 DOUBLEST d;
888
889 floatformat_to_doublest (from_fmt, from, &d);
890 floatformat_from_doublest (to_fmt, &d, to);
891 }
892}
5ef2d0aa
AC
893
894const struct floatformat *floatformat_ieee_single[BFD_ENDIAN_UNKNOWN];
895const struct floatformat *floatformat_ieee_double[BFD_ENDIAN_UNKNOWN];
49c54768 896const struct floatformat *floatformat_ieee_quad[BFD_ENDIAN_UNKNOWN];
5ef2d0aa
AC
897const struct floatformat *floatformat_arm_ext[BFD_ENDIAN_UNKNOWN];
898const struct floatformat *floatformat_ia64_spill[BFD_ENDIAN_UNKNOWN];
5ef2d0aa
AC
899
900extern void _initialize_doublest (void);
901
902extern void
903_initialize_doublest (void)
904{
905 floatformat_ieee_single[BFD_ENDIAN_LITTLE] = &floatformat_ieee_single_little;
906 floatformat_ieee_single[BFD_ENDIAN_BIG] = &floatformat_ieee_single_big;
907 floatformat_ieee_double[BFD_ENDIAN_LITTLE] = &floatformat_ieee_double_little;
908 floatformat_ieee_double[BFD_ENDIAN_BIG] = &floatformat_ieee_double_big;
909 floatformat_arm_ext[BFD_ENDIAN_LITTLE] = &floatformat_arm_ext_littlebyte_bigword;
910 floatformat_arm_ext[BFD_ENDIAN_BIG] = &floatformat_arm_ext_big;
911 floatformat_ia64_spill[BFD_ENDIAN_LITTLE] = &floatformat_ia64_spill_little;
912 floatformat_ia64_spill[BFD_ENDIAN_BIG] = &floatformat_ia64_spill_big;
49c54768
AC
913 floatformat_ieee_quad[BFD_ENDIAN_LITTLE] = &floatformat_ia64_quad_little;
914 floatformat_ieee_quad[BFD_ENDIAN_BIG] = &floatformat_ia64_quad_big;
5ef2d0aa 915}
This page took 0.570415 seconds and 4 git commands to generate.