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